<?php
session_start();
require_once "../modelos/Certificado.php";
require_once "../reportes/generar_certificado.php";
require_once "../modelos/FirmadorPDF.php";

$certificado = new Certificado();

$idempleado = isset($_SESSION["idempleado"]) ? $_SESSION["idempleado"] : (isset($_SESSION["idusuario"]) ? $_SESSION["idusuario"] : 7);

switch ($_GET["op"]) {

    // CASO 1: SOLO GUARDAR (Genera PDF borrador)
    case 'guardar':
        try {
            $idatencion = isset($_POST['idatencion']) ? $_POST['idatencion'] : null;
            $idpersona = isset($_POST['idpersona']) ? $_POST['idpersona'] : null;
            $tipo = isset($_POST['tipo']) ? $_POST['tipo'] : 'MEDICO';
            $contenido = isset($_POST['contenido']) ? $_POST['contenido'] : '{}';

            if (empty($idatencion) && empty($idpersona)) {
                throw new Exception("Falta seleccionar paciente.");
            }

            // Auto-detectar idpersona si viene idatencion
            if (!empty($idatencion) && empty($idpersona)) {
                require_once "../modelos/Persona.php";
                $personaModel = new Persona();
                $datosAtencion = $personaModel->imprimirHistoria($idatencion);
                if ($reg = $datosAtencion->fetch_object()) {
                    $idpersona = $reg->idpersona;
                }
            }

            // 1. Guardar en BD (Estado Borrador)
            $iddocumento = $certificado->insertar($idatencion, $idpersona, $tipo, $contenido, $idempleado);
            if (!$iddocumento)
                throw new Exception("Error al registrar en base de datos.");

            // 2. Generar PDF (Sin Firma)
            $datos = json_decode($contenido, true);
            $rutaPDF = generarPDFCertificado($iddocumento, $idatencion, $idpersona, $tipo, $datos, []);

            if (ob_get_length())
                ob_clean();
            echo json_encode([
                'success' => true,
                'message' => 'Certificado guardado. Proceda a firmar.',
                'iddocumento' => $iddocumento,
                'pdf_url' => date('Y/m/d') . '/temp_' . $iddocumento . '.pdf' // Ruta referencial
            ]);

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

    // CASO 2: FIRMAR DOCUMENTO EXISTENTE
    case 'firmar':
        try {
            $iddocumento = isset($_POST['iddocumento']) ? $_POST['iddocumento'] : null;
            $idempleado = isset($_POST['idempleado']) ? $_POST['idempleado'] : (isset($_SESSION['idempleado']) ? $_SESSION['idempleado'] : (isset($_SESSION['idusuario']) ? $_SESSION['idusuario'] : null));
            $password = isset($_POST['password']) ? $_POST['password'] : '';

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

            // Recuperar datos del certificado (contenido, IDs)
            $rspta = $certificado->mostrar($iddocumento);
            if (empty($rspta))
                throw new Exception("Documento no encontrado");

            // Mapeo manual si mostrar devuelve array o objeto simple
            $regCert = $rspta;

            // Decodificar contenido guardado
            $datos = json_decode($regCert['contenido'], true);
            $idatencion = $regCert['idatencion']; // Puede ser null
            $idpersona = $regCert['idpersona'];
            $tipo = $regCert['tipo'];

            // 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();

            // CORRECCIÓN: Resolver ruta del certificado correctamente (MISMA LÓGICA QUE firmar_receta.php)
            $rutaBD = $certData['ruta_certificado'];
            $rutaCertEncriptadoAbs = '';

            // Si la ruta en BD es relativa, convertirla a absoluta desde el directorio actual
            if (strpos($rutaBD, '../') === 0 || strpos($rutaBD, './') === 0) {
                $rutaCertEncriptadoAbs = realpath(__DIR__ . '/' . $rutaBD);
            } elseif (preg_match('/^[a-zA-Z]:/', $rutaBD) || substr($rutaBD, 0, 1) == '/') {
                $rutaCertEncriptadoAbs = $rutaBD;
            } else {
                $rutaCertEncriptadoAbs = realpath(__DIR__ . '/../' . $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('Certificado no encontrado. Ruta BD: ' . $rutaBD . ' | Buscada: ' . $rutaCertEncriptadoAbs . ' | SOLUCIÓN: Vuelva a subir su certificado.');
            }

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

            $rutaCertTemp = $dirTemp . 'temp_med_' . $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 procesar el archivo del certificado digital.');
            }

            // 2. Parámetros de Firma
            try {
                $infoFirma = [
                    'razon' => 'Certificado Medico Electronico',
                    'ubicacion' => 'Ecuador',
                    'medico' => 'Dr/a. ' . (isset($_SESSION['nombre']) ? $_SESSION['nombre'] : 'Medico')
                ];
                $paramsFirma = [
                    'rutaCert' => $rutaCertTemp,
                    'password' => $password,
                    'info' => $infoFirma
                ];

                // 3. Regenerar PDF pero ahora CON FIRMA
                $rutaPDFFirmadoTemp = generarPDFCertificado($iddocumento, $idatencion, $idpersona, $tipo, $datos, $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/certificados_firmados/' . $fecha;
                if (!file_exists($carpetaDestino))
                    mkdir($carpetaDestino, 0755, true);

                $nombreFinal = 'certificado_' . $iddocumento . '_firmado_' . date('His') . '.pdf';
                $rutaFinal = $carpetaDestino . '/' . $nombreFinal;

                rename($rutaPDFFirmadoTemp, $rutaFinal);

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

                if (ob_get_length())
                    ob_clean();
                echo json_encode([
                    'success' => true,
                    'message' => 'Certificado firmado 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 = $certificado->listarHistorial();
        $data = array();

        while ($reg = $rspta->fetch_object()) {
            $nombrePaciente = $reg->nombre . ' ' . $reg->apaterno . ' ' . $reg->amaterno;
            $urlPDF = empty($reg->ruta_pdf_firmado) ? '#' : '../' . $reg->ruta_pdf_firmado;
            $btnClass = empty($reg->ruta_pdf_firmado) ? 'btn-default disabled' : 'btn-info';
            $target = empty($reg->ruta_pdf_firmado) ? '' : 'target="_blank"';

            $data[] = array(
                "0" => '<a href="../reportes/vista_certificado.php?iddocumento=' . $reg->iddocumento . '" target="_blank" class="btn btn-warning btn-xs"><i class="fa fa-eye"></i> Vista Previa</a> ' .
                    '<a href="' . $urlPDF . '" ' . $target . ' class="btn ' . $btnClass . ' btn-xs"><i class="fa fa-download"></i> Descargar</a>' .
                        // Botón WhatsApp
                    (!empty($reg->ruta_pdf_firmado) ?
                        ' <a href="https://wa.me/?text=Hola+ estimado+a+' . urlencode($nombrePaciente) . '%2C+su+certificado+medico+ha+sido+generado.+Puede+descargarlo+en%3A+https%3A%2F%2F' . $_SERVER['HTTP_HOST'] . '%2FSISTEMA%2F' . $reg->ruta_pdf_firmado . '" target="_blank" class="btn btn-success btn-xs" title="Enviar por WhatsApp"><i class="fa fa-whatsapp"></i></a>'
                        : ''),
                "1" => $reg->fecha_emision,
                "2" => $nombrePaciente,
                "3" => $reg->tipo,
                "4" => $reg->estado == 'firmado' ? '<span class="label label-success">Firmado</span>' : '<span class="label label-warning">Borrador</span>',
                "5" => $reg->firmado_por
            );
        }
        $results = array(
            "sEcho" => 1,
            "iTotalRecords" => count($data),
            "iTotalDisplayRecords" => count($data),
            "aaData" => $data
        );
        echo json_encode($results);
        break;
}
?>