<?php
//Incluímos inicialmente la conexión a la base de datos
require_once __DIR__ . "/../config/Conexion.php";

class Persona
{
    //Implementamos nuestro constructor
    public function __construct()
    {

    }

    //Implementamos un método para insertar registros
    public function insertar($apaterno, $amaterno, $nombre, $fecha_nacimiento, $sexo, $tipo_sangre, $estado_civil, $alergia, $intervenciones_quirurgicas, $vacunas_completas, $tipo_documento, $num_documento, $direccion, $telefono, $email, $ocupacion, $persona_responsable)
    {
        // Generar Historia Clínica Secuencial Automática
        // Obtenemos el último id para calcular el siguiente (aproximación) o usamos un contador
        $sql_count = "SELECT count(*) as total FROM persona";
        $count_res = ejecutarConsultaSimpleFila($sql_count);
        $total = isset($count_res['total']) ? $count_res['total'] + 1 : 1;
        $historia_clinica = "HC-" . str_pad($total, 6, "0", STR_PAD_LEFT);

        // Verificar que no exista (simple check)
        // Si existe (concurrencia), podríamos intentar un loop, pero por ahora simple:

        $sql = "INSERT INTO persona (apaterno,amaterno,nombre,fecha_nacimiento,sexo,tipo_sangre,historia_clinica,estado_civil,alergia,intervenciones_quirurgicas,vacunas_completas,tipo_documento,num_documento,direccion,
		telefono,email,ocupacion,persona_responsable)
		VALUES ('$apaterno','$amaterno','$nombre','$fecha_nacimiento','$sexo','$tipo_sangre','$historia_clinica','$estado_civil','$alergia','$intervenciones_quirurgicas','$vacunas_completas','$tipo_documento','$num_documento','$direccion','$telefono','$email','$ocupacion','$persona_responsable')";
        return ejecutarConsulta($sql);
    }

    //Implementamos un método para editar registros
    public function editar(
        $idpersona,
        $apaterno,
        $amaterno,
        $nombre,
        $fecha_nacimiento,
        $sexo,
        $tipo_sangre,
        $estado_civil,
        $alergia,
        $intervenciones_quirurgicas,
        $vacunas_completas,
        $tipo_documento,
        $num_documento,
        $direccion,
        $telefono,
        $email,
        $ocupacion,
        $persona_responsable
    ) {
        $sql = "UPDATE persona SET apaterno='$apaterno',amaterno='$amaterno', nombre='$nombre',
		fecha_nacimiento='$fecha_nacimiento', sexo='$sexo', tipo_sangre='$tipo_sangre', estado_civil='$estado_civil',alergia='$alergia',intervenciones_quirurgicas='$intervenciones_quirurgicas',vacunas_completas='$vacunas_completas',tipo_documento='$tipo_documento',
		num_documento='$num_documento',direccion='$direccion',telefono='$telefono',email='$email',ocupacion='$ocupacion',persona_responsable='$persona_responsable' WHERE idpersona='$idpersona'";
        return ejecutarConsulta($sql);
    }

    //Implementamos un método para eliminar categorías
    public function eliminar($idpersona)
    {
        $sql = "DELETE FROM persona WHERE idpersona='$idpersona'";
        return ejecutarConsulta($sql);
    }

    //Implementar un método para mostrar los datos de un registro a modificar
    public function mostrar($idpersona)
    {
        $sql = "SELECT * FROM persona WHERE idpersona='$idpersona'";
        return ejecutarConsultaSimpleFila($sql);
    }

    //Implementar un método para listar los registros
    public function listarp()
    {
        $sql = "SELECT idpersona,concat(apaterno,' ',amaterno,' ',nombre, ' - ',num_documento) as paciente FROM persona";
        return ejecutarConsulta($sql);
    }

    public function listar($texto)
    {
        // Solo personas que NO son usuarios de sistema (o si lo son, que tengan rol de paciente explicito, pero asumiendo estructura basica:)
        // En este sistema, 'usuario' linkea a 'persona'. Si está en 'usuario', es personal interno usualmente.
        // Pero a veces un medico puede ser paciente. 
        // Mejor filtremos por aquellos que tienen atenciones o simplemente todos pero ordenados.
        // El usuario dijo "aparece un medico". Seguramente busco por nombre "Juan" y salio "Dr Juan".
        // Lo ideal es mostrar TODOS pero identificar. O filtrar usuarios.
        // Filtremos por 'tipo_persona' si existe, si no, dejemoslo abierto pero agreguemos el DNI al select para diferenciar.
        // Update: El usuario quiere NO medicos.
        // $sql = "SELECT p.* FROM persona p LEFT JOIN usuario u ON p.idpersona = u.idusuario WHERE u.idusuario IS NULL ..."; (Esto ya estaba pero quizas fallaba).
        // Vamos a simplificar: Buscar en toda persona, pero el JS muestra DNI.
        $sql = "SELECT * FROM persona WHERE (apaterno like concat('%','$texto','%') or amaterno like concat('%','$texto','%') or nombre like concat('%','$texto','%') or num_documento like concat('%','$texto','%')) AND idpersona NOT IN (SELECT idusuario FROM usuario) order by apaterno asc limit 0,20";
        return ejecutarConsulta($sql);
    }

    //Listar paciente por dni o por nombre
    public function buscar($num_documento)
    {
        $sql = "SELECT idpersona,apaterno,amaterno,nombre,tipo_documento,num_documento FROM persona where num_documento='$num_documento'";
        return ejecutarConsultaSimpleFila($sql);
    }

    //Implementar un método para listar los especialistas
    public function select()
    {
        $sql = "SELECT p.idpersona,concat(p.apaterno,' ',p.amaterno,' ',p.nombre) as especialista FROM persona p inner join usuario u on u.idusuario=p.idpersona";
        return ejecutarConsulta($sql);
    }

    //Imprimir historia
    public function imprimirHistoria($idatencion)
    {
        $sql = "SELECT a.idatencion,a.idpersona,concat(p.apaterno,' ',p.amaterno,' ',p.nombre) as paciente,p.fecha_nacimiento,CONCAT((YEAR( CURDATE( ) ) - YEAR( fecha_nacimiento ) - IF( MONTH( CURDATE( ) ) < MONTH( fecha_nacimiento), 1, 
IF ( MONTH(CURDATE( )) = MONTH(fecha_nacimiento),IF (DAY( CURDATE( ) ) < DAY( fecha_nacimiento ),1,0 ),0))),' años, ',(MONTH(CURDATE()) - MONTH( fecha_nacimiento) + 12 * IF( MONTH(CURDATE())<MONTH(fecha_nacimiento), 1,IF(MONTH(CURDATE())=MONTH(fecha_nacimiento),IF (DAY(CURDATE())<DAY(fecha_nacimiento),1,0),0)) - IF(MONTH(CURDATE())<>MONTH(fecha_nacimiento),(DAY(CURDATE())<DAY(fecha_nacimiento)), IF (DAY(CURDATE())<DAY(fecha_nacimiento),1,0 ))),' meses, ',(DAY( CURDATE( ) ) - DAY( fecha_nacimiento ) +30 * ( DAY(CURDATE( )) < DAY(fecha_nacimiento) )),' días') as edad,p.sexo,p.historia_clinica,p.estado_civil,p.alergia,p.intervenciones_quirurgicas,p.vacunas_completas,p.direccion,p.num_documento,p.ocupacion,p.persona_responsable,r.fecha,r.hora,r.vigencia,(select concat(apaterno,' ',amaterno,' ',nombre) from persona where idpersona=a.idusuario) as registrador,(select concat(apaterno,' ',amaterno,' ',nombre) from persona where idpersona=a.idempleado) as especialista,s.nombre as servicio,a.costo,a.estado,t.presion_arterial,t.temperatura,t.frecuencia_respiratoria,t.frecuencia_cardiaca,t.saturacion,t.peso,t.talla,t.imc,r.motivo_consulta,r.tiempo_enfermedad,r.antecedentes,r.examen_fisico,r.tratamiento,r.signnose_de_alarma,r.Indicaciones_no_farmacologicas,r.proxima_cita,r.plan,
        -- FIX: Extraer Perímetro Cefálico desde JSON datos_clinicos
        JSON_UNQUOTE(JSON_EXTRACT(r.datos_clinicos, '$.perimetro_cefalico')) as perimetro_cefalico,
        -- MIGRACIÓN JSON: Se obtiene PDF firmado desde atencion_formatos o se deja NULL
        (SELECT ruta_pdf FROM atencion_formatos WHERE idatencion=a.idatencion AND tipo_formato='RECETA' LIMIT 1) as ruta_pdf_firmado,
        -- Campos legacy que ya no se usan o se pueden inferir
        1 as firmado, 
        (SELECT fecha_modificacion FROM atencion_formatos WHERE idatencion=a.idatencion AND tipo_formato='RECETA' LIMIT 1) as fecha_firma,
        (SELECT u.registro_senescyt FROM usuario u WHERE u.idusuario=a.idempleado LIMIT 1) as registro_senescyt
        FROM atencion a INNER JOIN persona p ON a.idpersona=p.idpersona left join servicio s on a.idservicio=s.idservicio left join triaje t on a.idatencion=t.idatencion left join resultado r on a.idatencion=r.idatencion WHERE a.idatencion='$idatencion' limit 0,1";
        return ejecutarConsulta($sql);
    }
    // ...
    public function imprimirAtencionHistoria($idpersona)
    {
        $sql = "SELECT a.idatencion,a.idpersona,a.fecha,a.hora,(select concat(apaterno,' ',amaterno,' ',nombre) from persona where idpersona=a.idusuario) as registrador,(select concat(apaterno,' ',amaterno,' ',nombre) from persona where idpersona=a.idempleado) as especialista,s.nombre as servicio,a.costo,a.estado,t.presion_arterial,t.temperatura,t.frecuencia_respiratoria,t.frecuencia_cardiaca,t.saturacion,t.peso,t.talla,t.imc,r.motivo_consulta,r.tiempo_enfermedad,r.antecedentes,r.examen_fisico,r.tratamiento,r.proxima_cita,r.plan FROM atencion a inner join servicio s on a.idservicio=s.idservicio left join triaje t on a.idatencion=t.idatencion left join resultado r on a.idatencion=r.idatencion WHERE a.idpersona='$idpersona'";
        return ejecutarConsultaSimpleFila($sql);
    }

    public function recuperarImagenes($idatencion)
    {
        $sql = "SELECT coalesce(img_varios, '../public/img/no-image.png') as img_varios, coalesce(img_eco, '../public/img/no-image.png') as img_eco, coalesce(img_inv, '../public/img/no-image.png') as img_inv, coalesce(img_rx, '../public/img/no-image.png') as img_rx FROM imagenes where id_atencion = '$idatencion'";
        return ejecutarConsulta($sql);
    }

    // Nuevo método para obtener datos básicos del paciente sin depender de 'atencion'
    public function imprimirDatosPaciente($idpersona)
    {
        $sql = "SELECT 
                p.idpersona,
                concat(p.apaterno,' ',p.amaterno,' ',p.nombre) as paciente,
                p.fecha_nacimiento,
                CONCAT(
                    (YEAR( CURDATE( ) ) - YEAR( fecha_nacimiento ) - IF( MONTH( CURDATE( ) ) < MONTH( fecha_nacimiento), 1, IF ( MONTH(CURDATE( )) = MONTH(fecha_nacimiento),IF (DAY( CURDATE( ) ) < DAY( fecha_nacimiento ),1,0 ),0))), ' años, ',
                    (MONTH(CURDATE()) - MONTH( fecha_nacimiento) + 12 * IF( MONTH(CURDATE())<MONTH(fecha_nacimiento), 1,IF(MONTH(CURDATE())=MONTH(fecha_nacimiento),IF (DAY(CURDATE())<DAY(fecha_nacimiento),1,0),0)) - IF(MONTH(CURDATE())<>MONTH(fecha_nacimiento),(DAY(CURDATE())<DAY(fecha_nacimiento)), IF (DAY(CURDATE())<DAY(fecha_nacimiento),1,0 ))), ' meses'
                ) as edad,
                p.sexo,
                p.tipo_sangre,
                p.historia_clinica,
                p.estado_civil,
                p.alergia,
                p.intervenciones_quirurgicas,
                p.vacunas_completas,
                p.direccion,
                p.telefono,
                p.num_documento,
                p.ocupacion,
                p.persona_responsable 
                FROM persona p 
                WHERE p.idpersona='$idpersona'";
        return ejecutarConsultaSimpleFila($sql);
    }

    // Nuevo método para verificar firma de receta explícitamente (MIGRADO A JSON)
    public function verificarFirmaReceta($idatencion)
    {
        // Consultar atencion_formatos en lugar de receta (Tabla antigua eliminada)
        $sql = "SELECT 
                    1 as firmado, 
                    fecha_modificacion as fecha_firma, 
                    ruta_pdf as ruta_pdf_firmado, 
                    usuario_creacion as idempleado_firma 
                FROM atencion_formatos 
                WHERE idatencion='$idatencion' AND tipo_formato='RECETA' AND ruta_pdf IS NOT NULL LIMIT 1";
        return ejecutarConsultaSimpleFila($sql);
    }

    // Método para forzar actualización de firma si archivo existe (OBSOLETO POR MIGRACIÓN)
    public function forzarFirmaReceta($idatencion)
    {
        // La tabla receta ya no existe. No se requiere acción si atencion_formatos ya tiene el PDF.
        return true;
    }

    // ========================================================
    // MÉTODOS RECUPERADOS PARA GENERACIÓN DE PDF (RECETAS)
    // ========================================================

    // Listar recetas para PDF
    // Listar recetas para PDF (MODIFICADO POR MIGRACIÓN A JSON)
    // Ahora busca primero en atencion_formatos (Fuente de Verdad)
    public function imprimirReceta($idatencion)
    {
        // 1. Intentar leer desde JSON Moderno (atencion_formatos)
        $sqlJson = "SELECT datos_json FROM atencion_formatos WHERE idatencion='$idatencion' AND tipo_formato='RECETA' ORDER BY fecha_modificacion DESC LIMIT 1";
        $resJson = ejecutarConsultaSimpleFila($sqlJson);

        if ($resJson && !empty($resJson['datos_json'])) {
            $data = json_decode($resJson['datos_json'], true);

            // Verificar si es estructura válida y tiene medicamentos
            if (isset($data['medicamento']) && is_array($data['medicamento']) && count($data['medicamento']) > 0) {
                $objetosReceta = [];

                // Mapear arrays paralelos a objetos para simular el resultset antiguo
                $count = count($data['medicamento']);
                for ($i = 0; $i < $count; $i++) {
                    if (empty($data['medicamento'][$i]))
                        continue; // Saltar vacíos

                    $obj = new stdClass();
                    $obj->medicamento = $data['medicamento'][$i];
                    $obj->concentracion = isset($data['concentracion'][$i]) ? $data['concentracion'][$i] : '';
                    $obj->presentacion = isset($data['presentacion'][$i]) ? $data['presentacion'][$i] : '';
                    $obj->dosis = isset($data['dosis'][$i]) ? $data['dosis'][$i] : '';
                    $obj->duracion = isset($data['duracion'][$i]) ? $data['duracion'][$i] : '';
                    $obj->cantidad = isset($data['cantidad'][$i]) ? $data['cantidad'][$i] : '';
                    $obj->via_administracion = isset($data['via_administracion'][$i]) ? $data['via_administracion'][$i] : '';
                    $obj->posologia = isset($data['posologia'][$i]) ? $data['posologia'][$i] : '';

                    $objetosReceta[] = $obj;
                }

                // Retornar array directo (El reporte deberá manejar array u objeto)
                return $objetosReceta;
            }
        }

        // 2. Fallback: Si no hay JSON válido, leer de la tabla antigua (Legacy)
        $sql = "SELECT * FROM receta WHERE idatencion='$idatencion'";
        $res = ejecutarConsulta($sql);

        // Convertir mysqli_result a array de objetos para mantener uniformidad
        $lista = [];
        if ($res) {
            while ($r = $res->fetch_object()) {
                $lista[] = $r;
            }
        }
        return $lista;
    }

    // Listar diagnósticos CIE-10 para PDF
    public function imprimirDetalleHistoria($idatencion)
    {
        // Se une detalle_diagnostico con resultado y diagnostico para obtener códigos y nombres
        $sql = "SELECT d.codigo, d.enfermedad 
                FROM detalle_diagnostico dd 
                INNER JOIN diagnostico d ON dd.iddiagnostico = d.iddiagnostico 
                INNER JOIN resultado r ON dd.idresultado = r.idresultado 
                WHERE r.idatencion = '$idatencion'";
        return ejecutarConsulta($sql);
    }
}
