<?php
require "../config/Conexion.php";

class Contabilidad
{
    public function __construct() {}

    // ─── Listar todos los médicos (usuarios con rol) ────────────────────────
    public function listarMedicos()
    {
        $sql = "SELECT u.idusuario, CONCAT(p.apaterno,' ',p.amaterno,' ',p.nombre) AS nombre,
                       u.especialidad, u.cargo
                FROM usuario u
                INNER JOIN persona p ON p.idpersona = u.idusuario
                WHERE u.condicion = '1'
                ORDER BY p.apaterno ASC";
        return ejecutarConsulta($sql);
    }

    // ─── Resumen GLOBAL (tarjetas superiores) ──────────────────────────────
    public function resumenGlobal($fecha_inicio, $fecha_fin)
    {
        $sql = "SELECT
                    COUNT(*) AS total_atenciones,
                    COALESCE(SUM(a.costo), 0) AS total_ingresos,
                    COALESCE(AVG(a.costo), 0) AS promedio_consulta,
                    COUNT(DISTINCT a.idempleado) AS total_medicos
                FROM atencion a
                WHERE a.fecha >= '$fecha_inicio'
                  AND a.fecha <= '$fecha_fin'
                  AND a.estado <> 'Anulado'";
        return ejecutarConsultaSimpleFila($sql);
    }

    // ─── Resumen POR MÉDICO (tabla de ranking) ─────────────────────────────
    public function resumenPorMedico($fecha_inicio, $fecha_fin)
    {
        $sql = "SELECT
                    a.idempleado,
                    CONCAT(p.apaterno,' ',p.amaterno,' ',p.nombre) AS medico,
                    u.especialidad,
                    COUNT(*) AS total_atenciones,
                    COALESCE(SUM(a.costo), 0) AS total_ingresos,
                    COALESCE(AVG(a.costo), 0) AS promedio_consulta,
                    MIN(a.costo) AS min_consulta,
                    MAX(a.costo) AS max_consulta
                FROM atencion a
                INNER JOIN persona p ON p.idpersona = a.idempleado
                LEFT JOIN usuario u ON u.idusuario = a.idempleado
                WHERE a.fecha >= '$fecha_inicio'
                  AND a.fecha <= '$fecha_fin'
                  AND a.estado <> 'Anulado'
                GROUP BY a.idempleado, p.apaterno, p.amaterno, p.nombre, u.especialidad
                ORDER BY total_ingresos DESC";
        return ejecutarConsulta($sql);
    }

    // ─── Ingresos DIARIOS (últimos 30 días por defecto) ────────────────────
    public function ingresosDiarios($fecha_inicio, $fecha_fin, $idempleado = null)
    {
        $filtroMedico = $idempleado ? "AND a.idempleado = '$idempleado'" : "";
        $sql = "SELECT
                    DATE(a.fecha) AS dia,
                    COUNT(*) AS atenciones,
                    COALESCE(SUM(a.costo), 0) AS ingresos
                FROM atencion a
                WHERE a.fecha >= '$fecha_inicio'
                  AND a.fecha <= '$fecha_fin'
                  AND a.estado <> 'Anulado'
                  $filtroMedico
                GROUP BY DATE(a.fecha)
                ORDER BY dia ASC";
        return ejecutarConsulta($sql);
    }

    // ─── Ingresos SEMANALES ────────────────────────────────────────────────
    public function ingresosSemanales($fecha_inicio, $fecha_fin, $idempleado = null)
    {
        $filtroMedico = $idempleado ? "AND a.idempleado = '$idempleado'" : "";
        $sql = "SELECT
                    YEAR(a.fecha) AS anio,
                    WEEK(a.fecha, 1) AS semana,
                    MIN(DATE(a.fecha)) AS inicio_semana,
                    MAX(DATE(a.fecha)) AS fin_semana,
                    COUNT(*) AS atenciones,
                    COALESCE(SUM(a.costo), 0) AS ingresos
                FROM atencion a
                WHERE a.fecha >= '$fecha_inicio'
                  AND a.fecha <= '$fecha_fin'
                  AND a.estado <> 'Anulado'
                  $filtroMedico
                GROUP BY YEAR(a.fecha), WEEK(a.fecha, 1)
                ORDER BY anio ASC, semana ASC";
        return ejecutarConsulta($sql);
    }

    // ─── Ingresos MENSUALES ───────────────────────────────────────────────
    public function ingresosMensuales($fecha_inicio, $fecha_fin, $idempleado = null)
    {
        $filtroMedico = $idempleado ? "AND a.idempleado = '$idempleado'" : "";
        $sql = "SELECT
                    YEAR(a.fecha) AS anio,
                    MONTH(a.fecha) AS mes,
                    DATE_FORMAT(a.fecha, '%M %Y') AS periodo,
                    COUNT(*) AS atenciones,
                    COALESCE(SUM(a.costo), 0) AS ingresos
                FROM atencion a
                WHERE a.fecha >= '$fecha_inicio'
                  AND a.fecha <= '$fecha_fin'
                  AND a.estado <> 'Anulado'
                  $filtroMedico
                GROUP BY YEAR(a.fecha), MONTH(a.fecha), DATE_FORMAT(a.fecha, '%M %Y')
                ORDER BY anio ASC, mes ASC";
        return ejecutarConsulta($sql);
    }

    // ─── Detalle de atenciones (tabla principal) ───────────────────────────
    public function listarAtenciones($fecha_inicio, $fecha_fin, $idempleado = null)
    {
        $filtroMedico = $idempleado ? "AND a.idempleado = '$idempleado'" : "";
        $sql = "SELECT
                    a.idatencion,
                    DATE(a.fecha) AS fecha,
                    a.hora,
                    CONCAT(p.apaterno,' ',p.amaterno,' ',p.nombre) AS paciente,
                    CONCAT(m.apaterno,' ',m.amaterno,' ',m.nombre) AS medico,
                    u.especialidad,
                    s.nombre AS servicio,
                    a.costo
                FROM atencion a
                LEFT JOIN persona p ON p.idpersona = a.idpersona
                LEFT JOIN persona m ON m.idpersona = a.idempleado
                LEFT JOIN usuario u ON u.idusuario = a.idempleado
                LEFT JOIN servicio s ON s.idservicio = a.idservicio
                WHERE a.fecha >= '$fecha_inicio'
                  AND a.fecha <= '$fecha_fin'
                  AND a.estado <> 'Anulado'
                  $filtroMedico
                ORDER BY a.fecha DESC, a.hora DESC";
        return ejecutarConsulta($sql);
    }
}
?>
