<?php
/**
 * modules/turnero/api/export_historial.php
 * Exporta CSV del historial multi-día con los mismos filtros de get_historial.php
 *
 * GET ?fecha_desde=YYYY-MM-DD&fecha_hasta=YYYY-MM-DD&estado=...&lugar_id=...&prioridad_id=...&q=...
 */
require_once __DIR__ . '/_helpers.php';

requireTurnero();
requireMethod('GET');

$pdo = db();

// ── Parámetros ────────────────────────────────────────────────
$hoy      = date('Y-m-d');
$hace7    = date('Y-m-d', strtotime('-6 days'));

$fechaDesde  = trim($_GET['fecha_desde'] ?? '');
$fechaHasta  = trim($_GET['fecha_hasta'] ?? '');
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $fechaDesde)) $fechaDesde = $hace7;
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $fechaHasta)) $fechaHasta = $hoy;
if ($fechaDesde > $fechaHasta) $fechaDesde = $fechaHasta;

$estadoFiltro = trim($_GET['estado']        ?? '');
$lugarId      = (int)($_GET['lugar_id']     ?? 0);
$prioridadId  = (int)($_GET['prioridad_id'] ?? 0);
$q            = trim($_GET['q']             ?? '');

// ── WHERE ─────────────────────────────────────────────────────
$where = ['DATE(ses.fecha) BETWEEN ? AND ?'];
$binds = [$fechaDesde, $fechaHasta];

$estadosValidos = ['espera','en_recepcion','en_espera_lugar','en_servicio','finalizado','ausente','cancelado'];
if ($estadoFiltro && in_array($estadoFiltro, $estadosValidos, true)) {
    $where[] = 't.estado = ?';
    $binds[] = $estadoFiltro;
}
if ($lugarId > 0) {
    $where[] = 't.lugar_destino_id = ?';
    $binds[] = $lugarId;
}
if ($prioridadId > 0) {
    $where[] = 't.prioridad_id = ?';
    $binds[] = $prioridadId;
}
if ($q !== '') {
    $where[] = '(t.codigo LIKE ? OR t.paciente_nombre LIKE ? OR pac.nombre_completo LIKE ?)';
    $like     = '%' . $q . '%';
    $binds[]  = $like;
    $binds[]  = $like;
    $binds[]  = $like;
}

$whereStr = 'WHERE ' . implode(' AND ', $where);

// ── Consulta ──────────────────────────────────────────────────
$sql = "
    SELECT
        ses.fecha                                                           AS fecha_sesion,
        t.codigo,
        t.numero,
        p.codigo                                                            AS prioridad,
        p.nombre                                                            AS prioridad_nombre,
        COALESCE(pac.nombre_completo, t.paciente_nombre)                    AS paciente,
        pac.numero_documento,
        pac.tipo_documento,
        t.paciente_cel                                                      AS celular,
        l.nombre                                                            AS lugar,
        t.estado,
        t.creado_at,
        t.llamado_recepcion_at,
        t.inicio_recepcion_at,
        t.fin_recepcion_at,
        t.llamado_lugar_at,
        t.inicio_lugar_at,
        t.fin_lugar_at,
        ROUND(TIMESTAMPDIFF(SECOND, t.creado_at,
              COALESCE(t.inicio_recepcion_at, t.fin_recepcion_at)) / 60.0, 1)   AS espera_recepcion_min,
        ROUND(TIMESTAMPDIFF(SECOND, t.inicio_lugar_at,
              COALESCE(t.fin_lugar_at, NOW()))       / 60.0, 1)                 AS servicio_lugar_min,
        sol.total_cobrado,
        sol.metodo_pago
    FROM   turnero_turnos t
    JOIN   turnero_sesiones ses    ON ses.id  = t.sesion_id
    JOIN   turnero_prioridades p   ON p.id   = t.prioridad_id
    LEFT   JOIN turnero_lugares l  ON l.id   = t.lugar_destino_id
    LEFT   JOIN turnero_solicitudes sol ON sol.turno_id = t.id
    LEFT   JOIN lab_pacientes pac  ON pac.id = sol.paciente_id
    $whereStr
    ORDER  BY t.creado_at ASC";

$stmt = $pdo->prepare($sql);
$stmt->execute($binds);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

// ── Nombre de archivo ─────────────────────────────────────────
$nombreArchivo = "historial_turnos_{$fechaDesde}_a_{$fechaHasta}.csv";

// ── Output ────────────────────────────────────────────────────
// Limpiar cualquier output previo antes de los headers
ob_clean();

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="' . $nombreArchivo . '"');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

$out = fopen('php://output', 'w');
echo "\xEF\xBB\xBF"; // BOM UTF-8 para Excel

// Encabezados
$headers = [
    'Fecha', 'Código', 'Número', 'Prioridad', 'Prioridad nombre',
    'Paciente', 'Documento', 'Tipo doc.', 'Celular',
    'Lugar', 'Estado',
    'Creado', 'Llamado recepción', 'Inicio recepción', 'Fin recepción',
    'Llamado lugar', 'Inicio lugar', 'Fin lugar',
    'Espera recepción (min)', 'Servicio lugar (min)',
    'Total cobrado', 'Método pago',
];
fputcsv($out, $headers, ',', '"');

$fechaCols = [
    'creado_at','llamado_recepcion_at','inicio_recepcion_at','fin_recepcion_at',
    'llamado_lugar_at','inicio_lugar_at','fin_lugar_at',
];
$fields = [
    'fecha_sesion', 'codigo', 'numero', 'prioridad', 'prioridad_nombre',
    'paciente', 'numero_documento', 'tipo_documento', 'celular',
    'lugar', 'estado',
    'creado_at', 'llamado_recepcion_at', 'inicio_recepcion_at', 'fin_recepcion_at',
    'llamado_lugar_at', 'inicio_lugar_at', 'fin_lugar_at',
    'espera_recepcion_min', 'servicio_lugar_min',
    'total_cobrado', 'metodo_pago',
];

foreach ($rows as $row) {
    $line = [];
    foreach ($fields as $f) {
        $v = $row[$f] ?? '';
        if ($v && in_array($f, $fechaCols, true)) {
            $v = date('d/m/Y H:i:s', strtotime($v));
        }
        $line[] = $v;
    }
    fputcsv($out, $line, ',', '"');
}

fclose($out);
exit;
