<?php
/**
 * Clase para firmar PDFs usando certificados digitales almacenados en servidor
 * Utiliza OpenSSL para firmar documentos PDF
 */

class FirmadorPDF
{

    /*
    public function firmarPDF($pdfPath, $certificadoPath, $password, $info = [])
    {
        // Este método está obsoleto. Usar el flujo de firma directo en TCPDF durante la creación del PDF.
        throw new Exception("Metodo obsoleto. Use la firma directa durante la generacion del PDF.");
    }
    */

    /**
     * Verificar si un certificado es válido
     * @param string $certificadoPath Ruta al certificado
     * @param string $password Contraseña
     * @return array Información del certificado
     */
    public function verificarCertificado($certificadoPath, $password)
    {
        try {
            $certificadoContent = file_get_contents($certificadoPath);
            $certs = [];

            if (!openssl_pkcs12_read($certificadoContent, $certs, $password)) {
                return ['valido' => false, 'error' => 'Contraseña incorrecta'];
            }

            // Obtener información del certificado
            $certInfo = openssl_x509_parse($certs['cert']);

            $fechaVencimiento = date('Y-m-d', $certInfo['validTo_time_t']);
            $vigente = time() < $certInfo['validTo_time_t'];

            return [
                'valido' => true,
                'vigente' => $vigente,
                'nombre' => $certInfo['subject']['CN'] ?? 'Desconocido',
                'emisor' => $certInfo['issuer']['CN'] ?? 'Desconocido',
                'fecha_emision' => date('Y-m-d', $certInfo['validFrom_time_t']),
                'fecha_vencimiento' => $fechaVencimiento
            ];

        } catch (Exception $e) {
            return ['valido' => false, 'error' => $e->getMessage()];
        }
    }

    /**
     * Encriptar archivo de certificado
     * @param string $archivoOriginal Ruta al archivo original
     * @param string $archivoDestino Ruta donde guardar encriptado
     * @param string $clave Clave de encriptación
     * @return bool
     */
    public function encriptarCertificado($archivoOriginal, $archivoDestino, $clave)
    {
        $contenido = file_get_contents($archivoOriginal);
        $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
        $encriptado = openssl_encrypt($contenido, 'aes-256-cbc', $clave, 0, $iv);
        $resultado = base64_encode($iv . $encriptado);
        return file_put_contents($archivoDestino, $resultado) !== false;
    }

    /**
     * Desencriptar archivo de certificado
     * @param string $archivoEncriptado Ruta al archivo encriptado
     * @param string $archivoDestino Ruta donde guardar desencriptado
     * @param string $clave Clave de desencriptación
     * @return bool
     */
    public function desencriptarCertificado($archivoEncriptado, $archivoDestino, $clave)
    {
        $contenido = file_get_contents($archivoEncriptado);
        $data = base64_decode($contenido);
        $ivLength = openssl_cipher_iv_length('aes-256-cbc');
        $iv = substr($data, 0, $ivLength);
        $encriptado = substr($data, $ivLength);
        $desencriptado = openssl_decrypt($encriptado, 'aes-256-cbc', $clave, 0, $iv);

        if ($desencriptado === false) {
            return false;
        }

        return file_put_contents($archivoDestino, $desencriptado) !== false;
    }
}
?>