<?php
/**
 * modules/turnero/api/export_csv.php
 * GET ?fecha=YYYY-MM-DD  → descarga CSV con todos los turnos del día
 */
require_once __DIR__ . '/_helpers.php';

requireTurnero();

$fecha = trim($_GET['fecha'] ?? '');
if ($fecha === '' || !preg_match('/^\d{4}-\d{2}-\d{2}$/', $fecha)) {
    $fecha = date('Y-m-d');
}

$pdo = db();

// Buscar sesión del día
$stmtS = $pdo->prepare('SELECT id FROM turnero_sesiones WHERE fecha = ? LIMIT 1');
$stmtS->execute([$fecha]);
$sesion = $stmtS->fetch(PDO::FETCH_ASSOC);

if (!$sesion) {
    // Sin sesión: CSV vacío con encabezado
    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename="turnero_' . $fecha . '.csv"');
    echo "\xEF\xBB\xBF"; // BOM UTF-8 para Excel
    echo "Sin datos para la fecha {$fecha}\n";
    exit;
}

$sesionId = (int)$sesion['id'];

$stmt = $pdo->prepare(
    "SELECT
        t.codigo,
        t.numero,
        p.codigo            AS prioridad,
        p.nombre            AS prioridad_nombre,
        COALESCE(s.nombre_completo, t.paciente_nombre)  AS paciente,
        s.numero_documento,
        s.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, NOW())) / 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,
        GROUP_CONCAT(et.nombre ORDER BY et.nombre SEPARATOR ' | ')  AS examenes,
        SUM(CASE WHEN tc.estado = 'firmado'    THEN 1 ELSE 0 END)  AS consent_firmados,
        SUM(CASE WHEN tc.estado = 'pendiente'  THEN 1 ELSE 0 END)  AS consent_pendientes
     FROM   turnero_turnos t
     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 s     ON s.id  = sol.paciente_id
     LEFT   JOIN turnero_examen_items tei ON tei.solicitud_id = sol.id
     LEFT   JOIN exam_tipos et           ON et.id = tei.exam_tipo_id
     LEFT   JOIN turnero_consentimientos tc ON tc.turno_id = t.id
     WHERE  t.sesion_id = ?
     GROUP  BY t.id
     ORDER  BY t.numero ASC"
);
$stmt->execute([$sesionId]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

// ── Encabezados CSV ───────────────────────────────────────────
$headers = [
    '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',
    'Exámenes',
    'Consentimientos firmados', 'Consentimientos pendientes',
];

$fields = [
    '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',
    'examenes',
    'consent_firmados', 'consent_pendientes',
];

// ── Output ────────────────────────────────────────────────────
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="turnero_' . $fecha . '.csv"');
header('Cache-Control: no-cache, no-store, must-revalidate');

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

fputcsv($out, $headers, ',', '"');

foreach ($rows as $row) {
    $line = [];
    foreach ($fields as $f) {
        $v = $row[$f] ?? '';
        // Formatear fechas: quitar segundos fraccionarios si los hay
        if ($v && in_array($f, ['creado_at','llamado_recepcion_at','inicio_recepcion_at','fin_recepcion_at','llamado_lugar_at','inicio_lugar_at','fin_lugar_at'])) {
            $v = $v ? date('d/m/Y H:i:s', strtotime($v)) : '';
        }
        $line[] = $v ?? '';
    }
    fputcsv($out, $line, ',', '"');
}

fclose($out);
exit;
