import * as forge from 'node-forge';

export async function signDigest(digest: string, privateKeyBase64: string) {
  // Convierte la clave privada de Base64 a un objeto forge
  const privateKeyPem = forge.util.decode64(privateKeyBase64);
  const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);

  // Convierte el digest de Base64 a un buffer
  const digestBuffer = forge.util.decode64(digest);

  // Firma el digest usando RSASSA-PKCS1-v1_5 con SHA-256
  const signature = privateKey.sign(
    forge.md.sha256.create().update(digestBuffer),
    'RSASSA-PKCS1-V1_5'
  );

  // Convierte la firma a Base64
  return forge.util.encode64(signature);
}

export async function exportToP12(
  privateKeyPem: string,
  certificateBodyInBase64: string,
  password: string
) {
  try {
    const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);

    const certificatePem = `-----BEGIN CERTIFICATE-----\n${certificateBodyInBase64}\n-----END CERTIFICATE-----`;
    const certificate = forge.pki.certificateFromPem(certificatePem);
    const p12Asn1 = forge.pkcs12.toPkcs12Asn1(
      privateKey,
      [certificate],
      password,
      {
        algorithm: '3des',
        friendlyName: 'Mi Certificado Digital',
      }
    );

    const derBytes = forge.asn1.toDer(p12Asn1).getBytes();
    const p12Base64 = forge.util.encode64(derBytes);

    console.log('✅ Archivo P12 creado exitosamente.');
    return p12Base64;
  } catch (error: any) {
    console.error('❌ Error definitivo al crear el P12:', error);
    if (error.message.includes('Invalid PEM')) {
      console.error(
        'El error sugiere que uno de los formatos de entrada sigue siendo incorrecto, revisa los datos guardados.'
      );
    }
    return null;
  }
}
