<?php
session_start();
// DEBUGGING
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', 'error_log_ajax.txt');
error_reporting(E_ALL);

function log_debug($msg)
{
    file_put_contents('debug_log.txt', date('Y-m-d H:i:s') . " - " . print_r($msg, true) . "\n", FILE_APPEND);
}

log_debug("Iniciando solicitud: " . $_SERVER['REQUEST_URI']);
log_debug("POST Data: " . print_r($_POST, true));

require_once "../modelos/SolicitudExamen.php";
require_once "../modelos/FirmadorPDF.php";

$solicitud = new SolicitudExamen();

$idsolicitud = isset($_POST["idsolicitud"]) ? limpiarCadena($_POST["idsolicitud"]) : "";
$idatencion = isset($_POST["idatencion"]) ? limpiarCadena($_POST["idatencion"]) : "";
$idpersona = isset($_POST["idpersona"]) ? limpiarCadena($_POST["idpersona"]) : "";
$tipo = isset($_POST["tipo"]) ? limpiarCadena($_POST["tipo"]) : "";
$contenido = isset($_POST["contenido"]) ? $_POST["contenido"] : ""; // No limpiar, es JSON

switch ($_GET["op"]) {
    case 'guardar':
        try {
            // Guardar solicitud como borrador
            if (!isset($_SESSION['idempleado'])) {
                throw new Exception("No hay sesión de empleado activa");
            }
            $idempleado = $_SESSION['idempleado'];

            log_debug("Intentando insertar. ID Empleado: $idempleado");

            $rspta = $solicitud->insertar($idatencion, $idpersona, $tipo, $contenido, $idempleado);

            log_debug("Resultado inserción: " . var_export($rspta, true));

            if ($rspta > 0) {
                echo json_encode(array(
                    "success" => true,
                    "idsolicitud" => $rspta,
                    "message" => "Solicitud guardada exitosamente"
                ));
            } else {
                log_debug("Fallo al guardar. Posible error SQL.");
                echo json_encode(array(
                    "success" => false,
                    "message" => "Error al guardar la solicitud en BD"
                ));
            }
        } catch (Exception $e) {
            log_debug("Excepción: " . $e->getMessage());
            echo json_encode(array(
                "success" => false,
                "message" => "Error de servidor: " . $e->getMessage()
            ));
        }
        break;

    case 'firmar':
        // Firmar digitalmente la solicitud
        try {
            $idsolicitud = isset($_POST['idsolicitud']) ? $_POST['idsolicitud'] : null;
            $idempleado = isset($_POST['idempleado']) ? $_POST['idempleado'] : (isset($_SESSION['idempleado']) ? $_SESSION['idempleado'] : null);
            $password = isset($_POST['password']) ? $_POST['password'] : '';

            if (empty($idsolicitud) || empty($password) || empty($idempleado)) {
                throw new Exception("Faltan datos para firmar (solicitud, contraseña o empleado).");
            }

            // Obtener datos de la solicitud
            $regSolicitud = $solicitud->mostrar($idsolicitud);
            if (!$regSolicitud) {
                throw new Exception("Solicitud no encontrada");
            }

            // 1. Preparar Certificado Digital (.p12)
            // CORREGIDO: Buscar certificado con múltiples variables de sesión
            $sqlCert = "SELECT ruta_certificado, idempleado FROM certificados_medicos WHERE idempleado='$idempleado' AND estado='activo' LIMIT 1";
            $certData = ejecutarConsultaSimpleFila($sqlCert);

            // Si no se encuentra, intentar con idusuario alternativo
            if (!$certData) {
                $idusuario_alt = isset($_SESSION['idusuario']) ? $_SESSION['idusuario'] : null;
                if ($idusuario_alt && $idusuario_alt != $idempleado) {
                    $sqlCert2 = "SELECT ruta_certificado, idempleado FROM certificados_medicos WHERE idempleado='$idusuario_alt' AND estado='activo' LIMIT 1";
                    $certData = ejecutarConsultaSimpleFila($sqlCert2);
                }
            }

            if (!$certData) {
                $sqlDebug = "SELECT COUNT(*) as total FROM certificados_medicos WHERE idempleado='$idempleado'";
                $debugResult = ejecutarConsultaSimpleFila($sqlDebug);
                $totalCerts = $debugResult ? $debugResult['total'] : 0;

                if ($totalCerts > 0) {
                    throw new Exception('Tiene ' . $totalCerts . ' certificado(s) registrado(s) pero ninguno está activo. Suba un nuevo certificado en Configuración de Firma.');
                } else {
                    throw new Exception('No tiene un certificado digital configurado. Vaya a Configuración → Gestión de Certificados.');
                }
            }

            $firmador = new FirmadorPDF();

            // Logica robusta para resolver ruta
            $rutaBD = $certData['ruta_certificado'];
            $rutaCertEncriptadoAbs = '';

            if (preg_match('/^[a-zA-Z]:/', $rutaBD) || substr($rutaBD, 0, 1) == '/' || substr($rutaBD, 0, 1) == '\\') {
                $rutaCertEncriptadoAbs = $rutaBD;
            } else {
                $rutaCertEncriptadoAbs = __DIR__ . '/../' . str_replace('../', '', $rutaBD);
            }

            // Si realpath falla, intentar construcción manual
            if (!$rutaCertEncriptadoAbs || !file_exists($rutaCertEncriptadoAbs)) {
                $baseDir = dirname(__DIR__);
                $cleanPath = str_replace('../', '', $rutaBD);
                if (substr($cleanPath, 0, 1) == '/')
                    $cleanPath = substr($cleanPath, 1);
                $rutaCertEncriptadoAbs = $baseDir . '/' . $cleanPath;
            }

            // C) Fallback: Por Nombre en carpeta estándar
            if (!file_exists($rutaCertEncriptadoAbs)) {
                $nombreSolo = basename($rutaBD);
                $rutaCertEncriptadoAbs = dirname(__DIR__) . '/files/certificados_encriptados/' . $nombreSolo;
            }

            // D) NUCLEAR: Glob Search (Busca CUALQUIER archivo del usuario)
            if (!file_exists($rutaCertEncriptadoAbs)) {
                $patron = dirname(__DIR__) . '/files/certificados_encriptados/cert_' . $idempleado . '_*.p12.enc';
                $archivos = glob($patron);
                if ($archivos && count($archivos) > 0) {
                    // Usar el más reciente
                    usort($archivos, function ($a, $b) {
                        return filemtime($b) - filemtime($a);
                    });
                    $rutaCertEncriptadoAbs = $archivos[0];
                }
            }

            if (!file_exists($rutaCertEncriptadoAbs)) {
                throw new Exception('El archivo físico del certificado no existe. Intente configurar su firma nuevamente.');
            }

            // Nueva carpeta temporal
            $dirTemp = __DIR__ . '/../files/temp_certificates/';
            if (!file_exists($dirTemp))
                mkdir($dirTemp, 0755, true);

            $rutaCertTemp = $dirTemp . 'temp_sol_' . $idempleado . '_' . time() . '.p12';

            if (!defined('MASTER_KEY_CERT')) {
                define('MASTER_KEY_CERT', 'ClaveSeguraParaEncriptarCertificados2026!');
            }

            if (!$firmador->desencriptarCertificado($rutaCertEncriptadoAbs, $rutaCertTemp, MASTER_KEY_CERT)) {
                throw new Exception('Error al desencriptar certificado digital. Verifique contraseña maestra.');
            }

            // 2. Parámetros de Firma
            try {
                $infoFirma = [
                    'razon' => 'Solicitud de Examen Médico Electrónico',
                    'ubicacion' => 'Ecuador',
                    'medico' => 'Dr/a. ' . (isset($_SESSION['nombre']) ? $_SESSION['nombre'] : 'Medico')
                ];
                $paramsFirma = [
                    'rutaCert' => $rutaCertTemp,
                    'password' => $password,
                    'info' => $infoFirma
                ];

                // 3. Generar PDF firmado
                if ($regSolicitud['tipo'] == 'AVANZADO_COMPLETO') {
                    require_once '../reportes/generar_pdf_examen_avanzado.php';
                    $rutaPDFFirmadoTemp = generarPDFExamenAvanzado($idsolicitud, $paramsFirma);
                } else {
                    require_once '../reportes/generar_pdf_solicitud.php';
                    $rutaPDFFirmadoTemp = generarPDFSolicitud($idsolicitud, $paramsFirma);
                }

                // Limpieza cert temporal
                if (file_exists($rutaCertTemp)) {
                    unlink($rutaCertTemp);
                }

                if (!$rutaPDFFirmadoTemp || !file_exists($rutaPDFFirmadoTemp)) {
                    throw new Exception("Error generando PDF firmado.");
                }

                // 4. Mover a carpeta final
                $fecha = date('Y/m/d');
                $carpetaDestino = '../files/solicitudes_firmadas/' . $fecha;
                if (!file_exists($carpetaDestino)) {
                    mkdir($carpetaDestino, 0755, true);
                }

                $nombreFinal = 'solicitud_' . $idsolicitud . '_firmado_' . date('His') . '.pdf';
                $rutaFinal = $carpetaDestino . '/' . $nombreFinal;

                rename($rutaPDFFirmadoTemp, $rutaFinal);

                // 5. Actualizar BD
                $rutaRelativa = 'files/solicitudes_firmadas/' . $fecha . '/' . $nombreFinal;
                $fechaFirma = date('Y-m-d H:i:s');
                $sqlUp = "UPDATE solicitud_examen SET 
                          firmado=1, 
                          ruta_pdf_firmado='$rutaRelativa',
                          fecha_firma='$fechaFirma',
                          idempleado_firma='$idempleado'
                          WHERE idsolicitud='$idsolicitud'";
                ejecutarConsulta($sqlUp);

                if (ob_get_length()) {
                    ob_clean();
                }
                echo json_encode([
                    'success' => true,
                    'message' => 'Solicitud firmada correctamente',
                    'url' => '../' . $rutaRelativa
                ]);

            } catch (Exception $e) {
                if (file_exists($rutaCertTemp)) {
                    unlink($rutaCertTemp);
                }
                throw $e;
            }

        } catch (Exception $e) {
            if (ob_get_length()) {
                ob_clean();
            }
            header('Content-Type: application/json');
            echo json_encode([
                'success' => false,
                'message' => $e->getMessage()
            ]);
        }
        break;

    case 'listar_historial':
        $rspta = $solicitud->listarHistorial();
        $data = array();

        if ($rspta) {
            while ($reg = $rspta->fetch_object()) {
                $estado_badge = '';
                if ($reg->firmado == 1) {
                    $estado_badge = '<span class="label label-success">Firmado</span>';
                } else {
                    $estado_badge = '<span class="label label-warning">Borrador</span>';
                }

                $botones = '<button class="btn btn-info btn-sm" onclick="verSolicitud(' . $reg->idsolicitud . ')" title="Ver"><i class="fa fa-eye"></i></button> ';
                if ($reg->firmado == 1 && !empty($reg->ruta_pdf_firmado)) {
                    $botones .= '<a href="../' . $reg->ruta_pdf_firmado . '" target="_blank" class="btn btn-primary btn-sm" title="Descargar"><i class="fa fa-download"></i></a> ';
                }
                $botones .= '<button class="btn btn-danger btn-sm" onclick="eliminar(' . $reg->idsolicitud . ')" title="Eliminar"><i class="fa fa-trash"></i></button>';

                $data[] = array(
                    "0" => '<input type="checkbox" class="select-item" value="' . $reg->idsolicitud . '">',
                    "1" => date('d/m/Y H:i', strtotime($reg->fecha_registro)),
                    "2" => $reg->paciente . '<br><small>' . $reg->num_documento . '</small>',
                    "3" => $reg->tipo,
                    "4" => $estado_badge,
                    "5" => $botones
                );
            }
        }

        $results = array(
            "sEcho" => 1,
            "iTotalRecords" => count($data),
            "iTotalDisplayRecords" => count($data),
            "aaData" => $data
        );
        echo json_encode($results);
        break;

    case 'eliminar':
        $rspta = $solicitud->eliminar($idsolicitud);
        echo $rspta ? "Solicitud eliminada" : "No se pudo eliminar la solicitud";
        break;

    case 'eliminar_lote':
        $ids = isset($_POST['ids']) ? $_POST['ids'] : array();

        if (empty($ids)) {
            echo json_encode(array("success" => false, "message" => "No se seleccionaron elementos"));
            break;
        }

        $rspta = $solicitud->eliminarLote($ids);

        if ($rspta) {
            echo json_encode(array("success" => true, "message" => count($ids) . " solicitud(es) eliminada(s)"));
        } else {
            echo json_encode(array("success" => false, "message" => "Error al eliminar"));
        }
        break;
}
?>