<?php
// ajax/gestion_certificados.php
session_start();
require_once "../config/Conexion.php";
require_once "../modelos/FirmadorPDF.php";

$idempleado = isset($_SESSION['idempleado']) ? $_SESSION['idempleado'] : (isset($_SESSION['idusuario']) ? $_SESSION['idusuario'] : 0);

// Clave maestra para encriptar certificados en el disco
// IMPORTANTE: En producción, esta clave debe estar en una variable de entorno segura
define('MASTER_KEY_CERT', 'ClaveSeguraParaEncriptarCertificados2026!');

switch ($_GET["op"]) {
    case 'guardar':
        if (empty($idempleado)) {
            echo json_encode(['success' => false, 'message' => 'Sesión no válida']);
            exit;
        }

        // Verificar extensión OpenSSL antes de empezar
        if (!extension_loaded('openssl')) {
            echo json_encode(['success' => false, 'message' => 'La extensión PHP OpenSSL no está activa en tu servidor.']);
            exit;
        }

        if (!isset($_FILES['certificado']) || !isset($_POST['password'])) {
            echo json_encode(['success' => false, 'message' => 'Faltan datos']);
            exit;
        }

        $archivo = $_FILES['certificado'];
        $password = $_POST['password'];

        // Verificar errores de subida de PHP
        if ($archivo['error'] !== UPLOAD_ERR_OK) {
            $msg = 'Error al subir el archivo (Código: ' . $archivo['error'] . ')';
            if ($archivo['error'] === UPLOAD_ERR_INI_SIZE)
                $msg = 'El archivo es demasiado grande para tu servidor.';
            echo json_encode(['success' => false, 'message' => $msg]);
            exit;
        }

        // Validar extensión
        $ext = pathinfo($archivo['name'], PATHINFO_EXTENSION);
        if (strtolower($ext) != 'p12') {
            echo json_encode(['success' => false, 'message' => 'Solo se permiten archivos .p12']);
            exit;
        }

        // 1. Validar que el p12 es válido y la contraseña es correcta
        $firmador = new FirmadorPDF();
        $validacion = $firmador->verificarCertificado($archivo['tmp_name'], $password);


        if (!$validacion['valido']) {
            echo json_encode(['success' => false, 'message' => 'Certificado inválido o contraseña incorrecta']);
            exit;
        }

        // 2. Guardar certificado encriptado
        $nombreArchivo = 'cert_' . $idempleado . '_' . time() . '.p12.enc';

        // Usar ruta absoluta basada en __DIR__ para mayor seguridad
        $rutaBase = __DIR__ . '/../files/';
        $rutaDir = $rutaBase . 'certificados_encriptados/';

        if (!file_exists($rutaDir)) {
            if (!mkdir($rutaDir, 0755, true)) {
                echo json_encode(['success' => false, 'message' => 'No se pudo crear el directorio de certificados. Verifique permisos.']);
                exit;
            }
        }

        if (!is_writable($rutaDir)) {
            // Intentar corregir permisos
            chmod($rutaDir, 0755);
            if (!is_writable($rutaDir)) {
                echo json_encode(['success' => false, 'message' => 'El directorio de certificados no tiene permisos de escritura. Contacte al soporte.']);
                exit;
            }
        }

        // Ruta FISICA absoluta para guardar el archivo
        $rutaDestinoFisico = $rutaDir . $nombreArchivo;

        // CAMBIO CRÍTICO: Guardar ruta ABSOLUTA en BD para evitar problemas de resolución
        $rutaDestinoBD = realpath($rutaDir) . '/' . $nombreArchivo;

        // Encriptar el certificado antes de guardarlo en disco
        if ($firmador->encriptarCertificado($archivo['tmp_name'], $rutaDestinoFisico, MASTER_KEY_CERT)) {

            // VERIFICACIÓN PARANOICA: Asegurar que el archivo se creó físicamente
            if (!file_exists($rutaDestinoFisico)) {
                echo json_encode(['success' => false, 'message' => 'Error CRÍTICO: El sistema reportó escritura exitosa pero el archivo no aparece en disco.']);
                exit;
            }

            // 3. Guardar en BD
            // Primero desactivar anteriores
            $sqlDisable = "UPDATE certificados_medicos SET estado='revocado' WHERE idempleado='$idempleado'";
            ejecutarConsulta($sqlDisable);

            $fechaVencimiento = $validacion['fecha_vencimiento'];

            // USAMOS RUTA ABSOLUTA para que siempre se encuentre
            $sql = "INSERT INTO certificados_medicos (idempleado, nombre_certificado, ruta_certificado, fecha_vencimiento, estado) 
                    VALUES ('$idempleado', 'Certificado Personal', '$rutaDestinoBD', '$fechaVencimiento', 'activo')";

            if (ejecutarConsulta($sql)) {
                echo json_encode(['success' => true, 'message' => 'Certificado guardado y verificado correctamente (V2.0 PRO).']);
            } else {
                echo json_encode(['success' => false, 'message' => 'Error al guardar en base de datos']);
            }
        } else {
            echo json_encode(['success' => false, 'message' => 'Error al encriptar certificado']);
        }
        break;

    case 'verificar_estado':
        $sql = "SELECT * FROM certificados_medicos WHERE idempleado='$idempleado' AND estado='activo'";
        $rs = ejecutarConsultaSimpleFila($sql);
        if ($rs) {
            echo json_encode(['existe' => true, 'fecha_registro' => $rs['fecha_registro']]);
        } else {
            echo json_encode(['existe' => false]);
        }
        break;

    case 'eliminar':
        $sql = "UPDATE certificados_medicos SET estado='revocado' WHERE idempleado='$idempleado' AND estado='activo'";
        if (ejecutarConsulta($sql)) {
            echo "Certificado eliminado correctamente";
        } else {
            echo "Error al eliminar";
        }
        break;
}
?>