<?php
if (!isset($_SESSION)) {
    session_start();
}
require_once "../config/Conexion.php";
require_once "../modelos/Atencion.php";
require_once "../modelos/Configuracion.php";

$atencion = new atencion();

$idatencion = isset($_POST["idatencion"]) ? limpiarCadena($_POST["idatencion"]) : "";
$idpersona = isset($_POST["idpaciente"]) ? limpiarCadena($_POST["idpaciente"]) : "";
$idusuario = isset($_POST["idusuario"]) ? limpiarCadena($_POST["idusuario"]) : "";
$idservicio = isset($_POST["idservicio"]) ? limpiarCadena($_POST["idservicio"]) : "";
$idempleado = isset($_POST["idempleado"]) ? limpiarCadena($_POST["idempleado"]) : "";
$costo = isset($_POST["costo"]) ? limpiarCadena($_POST["costo"]) : "";

switch ($_GET["op"]) {
    case 'guardaryeditar':
        // Detectar si es guardado directo a atención (sin pasar por triaje)
        $directo_atencion = isset($_POST['directo_atencion']) && $_POST['directo_atencion'] == '1';

        if (empty($idatencion)) {
            $rspta = $atencion->insertar($idpersona, $idusuario, $idservicio, $idempleado, $costo, $directo_atencion);
            echo $rspta ? "Atención registrada" : "Atención no se pudo registrar";
        } else {
            $rspta = $atencion->editar($idatencion, $idpersona, $idusuario, $idservicio, $idempleado, $costo);
            echo $rspta ? "Atención actualizada" : "Atención no se pudo actualizar";
        }
        break;

    case 'anular':
        $rspta = $atencion->anular($idatencion);
        echo $rspta ? "Atención Anulada" : "Atención no se puede anular";
        break;

    case 'mostrar':
        $rspta = $atencion->mostrar($idatencion);
        //Codificar el resultado utilizando json
        echo json_encode($rspta);
        break;

    case 'listar':
        $rspta = $atencion->listar();
        //Vamos a declarar un array
        $data = array();

        while ($reg = $rspta->fetch_object()) {
            $data[] = array(
                "0" => ($reg->estado <> 'Atendido') ?
                    '<button title="Editar Atención" class="btn btn-warning" onclick="mostrar(' . $reg->idatencion . ')"><i class="fa fa-pencil"></i></button>' .
                    ' <button title="Anular Atención" class="btn btn-danger" onclick="anular(' . $reg->idatencion . ')"><i class="fa fa-close"></i></button>' :
                    '<button title="Modificar Plan de Atención" class="btn btn-info" onclick="modificar(' . $reg->idatencion . ')"><i class="fa fa-eye"></i></button>' .
                    '',
                "1" => $reg->fecha . ' - ' . $reg->hora,
                "2" => $reg->registrador,
                "3" => $reg->servicio,
                "4" => $reg->especialista,
                "5" => $reg->paciente,
                "6" => $reg->num_documento,
                "7" => $reg->edad,
                "8" => $reg->costo,
                "9" => ($reg->estado == 'Registrado') ? '<span class="label bg-green">Registrado</span>' : (($reg->estado == 'Triaje') ? '<span class="label bg-orange">Triaje</span>' : '<span class="label bg-primary">Atendido</span>')
            );
        }
        $results = array(
            "sEcho" => 1, //Información para el datatables
            "icostoRecords" => count($data), //enviamos el costo registros al datatable
            "icostoDisplayRecords" => count($data), //enviamos el costo registros a visualizar
            "aaData" => $data
        );
        echo json_encode($results);

        break;
    case "selectServicio":
        require_once "../modelos/Servicio.php";
        $servicio = new Servicio();

        $rspta = $servicio->select();

        while ($reg = $rspta->fetch_object()) {
            echo '<option value=' . $reg->idservicio . '>' . $reg->nombre . ' S/.' . $reg->costo . '</option>';
        }
        break;

    case "selectEspecialista":
        require_once "../modelos/Persona.php";
        $persona = new Persona();

        $rspta = $persona->select();

        while ($reg = $rspta->fetch_object()) {
            echo '<option value=' . $reg->idpersona . '>' . $reg->especialista . '</option>';
        }
        break;

    case 'ListarAtenciones':
        require_once "../modelos/AtencionFormato.php";
        $atencionFormato = new AtencionFormato();

        $idp = $_GET['idp'];
        $rspta = $atencion->listarAtenciones($idp);

        echo '<thead>
                <tr>
                    <th width="20%">Fecha</th>
                    <th>Documentos Clínicos (Historial y Recetas)</th>
                </tr>
              </thead>';

        while ($reg = $rspta->fetch_object()) {
            $idatencion = $reg->idatencion;
            $fecha = $reg->fecha;

            // 1. Obtener formatos de atencion_formatos (Legacy y Nuevos)
            $rsptaFormatos = $atencionFormato->listar($idatencion);

            // 2. Obtener documentos de documento_medico (Sistema de Firma Digital Centralizado)
            // Esto es crucial para recuperar los PDFs que "se pierden"
            $sqlDocs = "SELECT * FROM documento_medico WHERE idatencion = '$idatencion' AND estado != 'anulado'";
            $rsptaDocs = ejecutarConsulta($sqlDocs);

            $links_html = "";
            $countFormatos = 0;
            $formatosVistos = []; // Para evitar duplicados

            // Procesar atencion_formatos
            while ($f = $rsptaFormatos->fetch_object()) {
                if (!empty($f->ruta_pdf)) {
                    $countFormatos++;
                    $nombre = $f->tipo_formato;
                    $color = "btn-default";
                    $icon = "fa-file-pdf-o";
                    $url = $f->ruta_pdf;

                    // Estilos según tipo
                    if ($nombre == 'MSP_006') {
                        $color = "btn-success";
                        $nombre = "Epicrisis";
                    } else if ($nombre == 'RECETA') {
                        $color = "btn-info";
                        $icon = "fa-user-md";
                    }

                    // Normalizar nombre para deduplicación
                    $key = $nombre . '_' . basename($url);
                    if (!in_array($key, $formatosVistos)) {
                        $links_html .= '<a href="../reportes/ver_documento.php?f=' . basename($url) . '" target="_blank" class="btn btn-xs ' . $color . '" title="' . $nombre . '" style="margin-right:5px; margin-bottom:5px;">
                                        <i class="fa ' . $icon . '"></i> ' . $nombre . '
                                     </a>';
                        $formatosVistos[] = $key;
                    }
                }
            }

            // Procesar documento_medico (Recuperación de Archivos Perdidos)
            while ($d = $rsptaDocs->fetch_object()) {
                // Preferir PDF firmado, sino el normal
                $ruta = !empty($d->ruta_pdf_firmado) ? $d->ruta_pdf_firmado : $d->ruta_pdf;

                if (!empty($ruta)) {
                    $countFormatos++;
                    $nombre = strtoupper($d->tipo);
                    $color = "btn-primary";
                    $icon = "fa-file-text";

                    if ($nombre == 'RECETA') {
                        $color = "btn-info";
                        $icon = "fa-user-md";
                    }

                    // Verificar si ya mostramos este archivo (evitar duplicado visual si existe en ambas tablas)
                    $yaMostrado = false;
                    foreach ($formatosVistos as $visto) {
                        if (strpos($visto, basename($ruta)) !== false) {
                            $yaMostrado = true;
                            break;
                        }
                    }

                    if (!$yaMostrado) {
                        $links_html .= '<a href="../reportes/ver_documento.php?f=' . basename($ruta) . '" target="_blank" class="btn btn-xs ' . $color . '" title="' . $nombre . ' (Digital)" style="margin-right:5px; margin-bottom:5px;">
                                        <i class="fa ' . $icon . '"></i> ' . $nombre . ' <i class="fa fa-check-circle" title="Firmado Digitalmente"></i>
                                     </a>';
                    }
                }
            }

            // 3. OBTENER ARCHIVOS ADJUNTOS (Sube Médico) - TABLA atencion_archivos
            $sqlAdjuntos = "SELECT * FROM atencion_archivos WHERE idatencion = '$idatencion' AND estado = 1";
            $rsptaAdjuntos = ejecutarConsulta($sqlAdjuntos);

            $numAdjuntos = 0;
            if ($rsptaAdjuntos) {
                $numAdjuntos = $rsptaAdjuntos->num_rows;
                // Debug Oculto
                $links_html .= "<!-- ID: $idatencion - Adjuntos encontrados: $numAdjuntos -->";

                while ($adj = $rsptaAdjuntos->fetch_object()) {
                    $nombre = htmlspecialchars($adj->nombre_original);
                    $ruta = $adj->ruta_archivo; // ../files/atencion_archivos/archivo.pdf

                    // Ajuste de ruta si es necesario (desde vistas/paciente.php, ../files es correcto)

                    // Icon logic
                    $ext = strtolower(pathinfo($nombre, PATHINFO_EXTENSION));
                    $icon = "fa-file";
                    if (in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'bmp']))
                        $icon = "fa-file-image-o";
                    elseif ($ext == 'pdf')
                        $icon = "fa-file-pdf-o";
                    elseif (in_array($ext, ['doc', 'docx']))
                        $icon = "fa-file-word-o";
                    elseif (in_array($ext, ['xls', 'xlsx']))
                        $icon = "fa-file-excel-o";

                    $links_html .= '<a href="' . $ruta . '" target="_blank" class="btn btn-xs btn-warning" title="' . $nombre . '" style="margin-right:5px; margin-bottom:5px;">
                                    <i class="fa ' . $icon . '"></i> ' . $nombre . '
                                 </a>';
                }
            } else {
                $links_html .= "<!-- Error SQL: $sqlAdjuntos -->";
            }

            // Si no hay formatos modernos (Atenciones antiguas), mostramos los botones legacy
            if ($countFormatos == 0) {
                // ENLACE A HISTORIA OBSOLETA ELIMINADO POR SOLICITUD DEL USUARIO
                // $links_html .= '<a target="_blank" href="../reportes/historia.php?idatencion=' . $idatencion . '" class="btn btn-xs btn-primary" title="Ver Historia"><i class="fa fa-file-text"></i> Ver Historia</a> ';

                // Mantenemos solo la receta si es necesario, o nada si se prefiere limpieza total
                $links_html .= '<a target="_blank" href="../reportes/receta.php?idatencion=' . $idatencion . '" class="btn btn-xs btn-info" title="Ver Receta"><i class="fa fa-print"></i> Ver Receta</a>';
            }

            echo '<tr>
                    <td>' . $fecha . '</td>
                    <td>' . $links_html . '</td>
                  </tr>';
        }
        break;

    case 'get_form':
        // --- LAZY INIT: Crear tabla de formatos si no existe ---
        $sqlCreateTable = "CREATE TABLE IF NOT EXISTS `atencion_formatos` (
            `id_atencion_formato` int(11) NOT NULL AUTO_INCREMENT,
            `idatencion` int(11) NOT NULL,
            `tipo_formato` varchar(50) NOT NULL,
            `estado` varchar(20) DEFAULT 'pendiente',
            `ruta_pdf` varchar(255) DEFAULT NULL,
            `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (`id_atencion_formato`),
            KEY `idx_idatencion` (`idatencion`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
        ejecutarConsulta($sqlCreateTable);

        // Verificar si la columna 'datos_clinicos' existe en la tabla 'resultado'
        $sqlCheckColumn = "SHOW COLUMNS FROM resultado LIKE 'datos_clinicos'";
        $resCheck = ejecutarConsultaSimpleFila($sqlCheckColumn);
        if (!$resCheck) {
            $sqlAddColumn = "ALTER TABLE resultado ADD COLUMN datos_clinicos TEXT DEFAULT NULL AFTER vigencia";
            ejecutarConsulta($sqlAddColumn);
        }
        // -----------------------------------------------------

        $formato = isset($_POST['formato']) ? limpiarCadena($_POST['formato']) : 'MSP_002';

        // Whitelist de formatos autorizados según Manual MSP
        $whitelist = [
            // Formatos Principales
            'MSP_001',
            'MSP_002',
            'MSP_003',
            'MSP_005',
            'MSP_006',
            'MSP_007',
            'MSP_008',
            // Formatos Complementarios
            'MSP_010',
            'MSP_012',
            'MSP_020',
            'MSP_024',
            // Formatos Especiales
            'PEDIATRIA',
            'NEUROPEDIATRIA',
            'NEUROPEDIATRIA_PEDIDOS',
            'NEUROPEDIATRIA_EXAMENES', // Nuevo formato
            'RECETA',
            'ANEXO_1',
            'ANEXO_2',
            'NEFROLOGIA',
            'MSP_033_ODONTO', // Nuevo Formato Odontológico Oficial
            'ODONTOPEDIATRIA', // Nuevo Módulo Odontopediatría
            'PERIODONTOGRAMA', // Periodontograma Completo
            'CIRUGIA', // Protocolo Quirúrgico
            'ARMONIZACION', // Face Mapping
            'MSP_051', // Historia Clínica Materno Perinatal
            'HC_MED_FAMILIAR', // Nuevo Formato Medicina Familiar
            'HC_MED_FUNCIONAL', // Nuevo Formato Medicina Funcional (AMF)
            'HISTORIA_ORTODONCIA',
            'HISTORIA_ENDODONCIA',
            'NUTRICION',
            'GERIATRIA',
            'PSICOLOGIA',
            'CONFIDENCIALIDAD',
            'FISIOTERAPIA',
            'VALORACION_RAPIDA_FT',
            'DERIVACION_INTERNA',
            'FEMO_2025',
            'FEMO_LEGAL',
            // Salud Ocupacional - Formularios HCU oficiales MSP
            'HCU_077', // Pre-Ocupacional / Ingreso
            'HCU_078', // Periódica
            'HCU_079', // Reintegro
            'HCU_080', // Retiro
            'HCU_081', // Certificado de Aptitud Laboral
            'HCU_083', // Inmunizaciones Ocupacionales
        ];

        if (in_array($formato, $whitelist)) {
            $archivo = strtolower($formato) . '.php';
            $ruta = __DIR__ . "/../vistas/formatos/" . $archivo;

            clearstatcache(true, $ruta);
            if (!file_exists($ruta)) {
                // Intento alternativo (Mayúsculas)
                $ruta_alt = __DIR__ . "/../vistas/formatos/" . strtoupper($formato) . ".php";
                if (file_exists($ruta_alt)) {
                    $ruta = $ruta_alt;
                }
            }

            // CARGA FORZADA PARA MEDICINA FUNCIONAL (EVITAR ERRORES DE PERMISOS)
            if ($formato == 'HC_MED_FUNCIONAL') {
                if (file_exists($ruta)) {
                    include $ruta;
                } else {
                    // Fallback directo al archivo conocido
                    $ruta_fija = __DIR__ . "/../vistas/formatos/hc_med_funcional.php";
                    if (file_exists($ruta_fija)) {
                        include $ruta_fija;
                    } else {
                        echo "<div class='alert alert-danger'><strong>Error Crítico:</strong> El archivo del formato de Medicina Funcional no se encuentra en el servidor ($ruta_fija). Por favor verifique que el archivo haya sido subido correctamente.</div>";
                        break;
                    }
                }
                // Si llegamos aquí, el archivo se incluyó (o mostró error arriba). Salimos del case.
                break; 
            }

            if (file_exists($ruta)) {
                // Obtener datos de triaje reales si existen para esta atención
                $triaje = [
                    'presion_arterial' => '',
                    'frecuencia_cardiaca' => '',
                    'frecuencia_respiratoria' => '',
                    'temperatura' => '',
                    'saturacion' => '',
                    'peso' => '',
                    'talla' => '',
                    'imc' => ''
                ];

                if (!empty($idatencion)) {
                    $sqlTriaje = "SELECT * FROM triaje WHERE idatencion = '$idatencion' ORDER BY idtriaje DESC LIMIT 1";
                    $resTriaje = ejecutarConsultaSimpleFila($sqlTriaje);
                    if ($resTriaje) {
                        $triaje = [
                            'presion_arterial' => $resTriaje['presion_arterial'],
                            'frecuencia_cardiaca' => $resTriaje['frecuencia_cardiaca'],
                            'frecuencia_respiratoria' => $resTriaje['frecuencia_respiratoria'],
                            'temperatura' => $resTriaje['temperatura'],
                            'saturacion' => $resTriaje['saturacion'],
                            'peso' => $resTriaje['peso'],
                            'talla' => $resTriaje['talla'],
                            'imc' => $resTriaje['imc']
                        ];
                    }
                }

                // --- INICIO: DATOS DINÁMICOS PARA CABECERAS ---
                require_once "../modelos/Configuracion.php";
                $configModel = new Configuracion();
                $rsptaConfig = $configModel->listar();
                $regConfig = $rsptaConfig->fetch_object();

                // 1. Institución del Sistema (Razón Social)
                $institucion = ($regConfig && !empty($regConfig->razon_social) && strtoupper($regConfig->razon_social) !== 'TURAZONSOCIAL') 
                               ? $regConfig->razon_social : '';

                // 2. Unidad Operativa (Por defecto la misma o Consultorio Privado)
                $unidad_operativa = ($regConfig && !empty($regConfig->nombre_comercial) && strtoupper($regConfig->nombre_comercial) !== 'TURAZONSOCIAL') 
                                    ? $regConfig->nombre_comercial : 'CONSULTORIO PRIVADO';
                if (empty($unidad_operativa))
                    $unidad_operativa = 'CONSULTORIO PRIVADO';

                // 3. Nombre del Médico (Usuario en Sesión)
                $nombre_medico = isset($_SESSION['nombre']) ? $_SESSION['nombre'] : '';

                // Si está vacío, intentar buscar por idpersona de la sesión si existe modelo Usuario
                if (empty($nombre_medico) && isset($_SESSION['idusuario'])) {
                    // Fallback básico
                    $nombre_medico = "Dr(a). " . ($regConfig ? $regConfig->responsable : '');
                }
                // --- FIN DATOS DINÁMICOS ---

                include $ruta;
            } else {
                echo "<div class='alert alert-warning'><strong>Formato en desarrollo:</strong> El formato <strong>$formato</strong> ($ruta) está siendo implementado. Por favor, use temporalmente MSP-002 (Consulta Externa).</div>";
            }
        } else {
            echo "<div class='alert alert-danger'><strong>Error:</strong> Formato no válido o no autorizado.</div>";
        }
        break;

    case 'verificar_documentos':
        // Endpoint inteligente para detectar qué documentos existen
        $idatencion = isset($_POST['idatencion']) ? limpiarCadena($_POST['idatencion']) : '';

        if (empty($idatencion)) {
            echo json_encode(['error' => 'ID de atención no proporcionado']);
            break;
        }

        // Helper function to check if table has data
        function checkTableHasData($table, $idatencion)
        {
            global $conexion;
            $sql = "SELECT COUNT(*) as total FROM $table WHERE idatencion = '$idatencion'";
            $result = $conexion->query($sql);
            if ($result) {
                $row = $result->fetch_assoc();
                return $row['total'] > 0;
            }
            return false;
        }

        // Verificar cada tipo de documento
        $documentos = [
            // MSP Formats
            'tiene_msp_002' => checkTableHasData('msp_002_consulta_externa', $idatencion),
            'tiene_msp_051' => checkTableHasData('msp_051_materno_perinatal', $idatencion),

            // Bitacora y Recetas
            'tiene_bitacora' => checkTableHasData('bitacora_evolucion', $idatencion),
            'tiene_recetas' => checkTableHasData('receta', $idatencion),

            // Otros formatos (agregar según necesidad)
            // 'tiene_msp_033' => checkTableHasData('msp_033_odontologia', $idatencion),
        ];

        // Calcular total de documentos
        $total_docs = 0;
        foreach ($documentos as $key => $value) {
            if ($value)
                $total_docs++;
        }

        $documentos['total_documentos'] = $total_docs;

        echo json_encode($documentos);
        break;
}

