<?php
/**
 * sorteoController.php — Sprint 16S
 * Soporta parámetros: fuente (quorum|todos), hora_desde, hora_hasta
 */
ob_start();

session_save_path("/home/evolucionamos/public_html/mejora/sessions");
session_start();
require_once '../../../env_loader.php';
require_once '../../../app/models/conexion.php';
require_once '../../../app/models/sorteos.php';

header('Content-Type: application/json; charset=utf-8');

function jsonOut(array $data): void {
    ob_end_clean();
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    exit;
}

if (empty($_SESSION['adm'])) {
    jsonOut(['ok' => false, 'msg' => 'Sin autorización']);
}

$accion = $_GET['accion'] ?? $_POST['accion'] ?? '';

// ── Extraer parámetros de fuente y filtro horario ──────────────────
$fuente     = in_array($_GET['fuente']     ?? $_POST['fuente']     ?? 'quorum', ['quorum','todos'])
              ? ($_GET['fuente'] ?? $_POST['fuente'] ?? 'quorum')
              : 'quorum';
$horaDesde  = preg_match('/^\d{2}:\d{2}(:\d{2})?$/', $_GET['hora_desde']  ?? $_POST['hora_desde']  ?? '')
              ? ($_GET['hora_desde'] ?? $_POST['hora_desde'] ?? '')
              : '';
$horaHasta  = preg_match('/^\d{2}:\d{2}(:\d{2})?$/', $_GET['hora_hasta']  ?? $_POST['hora_hasta']  ?? '')
              ? ($_GET['hora_hasta'] ?? $_POST['hora_hasta'] ?? '')
              : '';

try {
    $model = new Sorteos();

    // ── GET: delegados disponibles ─────────────────────────────────
    if ($accion === 'disponibles') {
        session_write_close();
        $n = $model->disponiblesParaSorteo($fuente, $horaDesde, $horaHasta);
        jsonOut(['ok' => true, 'disponibles' => $n]);
    }

    // ── GET: lista de ganadores ────────────────────────────────────
    if ($accion === 'ganadores') {
        session_write_close();
        $rows = $model->ganadores();
        jsonOut(['ok' => true, 'ganadores' => $rows]);
    }

    // ── GET: descargar CSV ─────────────────────────────────────────
    if ($accion === 'csv') {
        session_write_close();
        ob_end_clean();
        header('Content-Type: text/csv; charset=utf-8');
        header('Content-Disposition: attachment; filename="ganadores_sorteo_' . date('Ymd') . '.csv"');
        $rows = $model->ganadores();
        echo "\xEF\xBB\xBF";
        echo "N,Nombre,Cedula,Zona,Premio,Fecha\n";
        foreach ($rows as $i => $g) {
            echo ($i+1).','.
                 '"'.str_replace('"','""',$g->nombre).'",'.
                 '"'.($g->cedula ?? '').'",'.
                 '"'.($g->zona   ?? '').'",'.
                 '"'.str_replace('"','""',($g->regalo ?? '')).'",'.
                 '"'.($g->fecha  ?? '').'"' . "\n";
        }
        exit;
    }

    // ── POST: crear sorteo ─────────────────────────────────────────
    if ($accion === 'crear' && $_SERVER['REQUEST_METHOD'] === 'POST') {
        $token = $_POST['csrf_token'] ?? '';
        if (!hash_equals($_SESSION['csrf_token'] ?? '', $token)) {
            jsonOut(['ok' => false, 'msg' => 'Token inválido']);
        }

        $regalo   = trim(strip_tags($_POST['regalo']   ?? ''));
        $cantidad = max(1, (int)($_POST['cantidad'] ?? 1));

        if (empty($regalo)) {
            jsonOut(['ok' => false, 'msg' => 'Nombre del premio requerido']);
        }

        $disponibles = $model->disponiblesParaSorteo($fuente, $horaDesde, $horaHasta);
        if ($disponibles < $cantidad) {
            jsonOut(['ok' => false,
                     'msg' => "Solo hay $disponibles participante(s) disponible(s) para $cantidad ganador(es)"]);
        }

        $id = $model->crearSorteo($regalo, $cantidad);
        if (!$id) {
            jsonOut(['ok' => false, 'msg' => 'Error al crear el sorteo en BD']);
        }
        jsonOut(['ok' => true, 'sorteo_id' => $id]);
    }

    // ── POST: ejecutar sorteo ──────────────────────────────────────
    if ($accion === 'ejecutar' && $_SERVER['REQUEST_METHOD'] === 'POST') {
        $token = $_POST['csrf_token'] ?? '';
        if (!hash_equals($_SESSION['csrf_token'] ?? '', $token)) {
            jsonOut(['ok' => false, 'msg' => 'Token inválido']);
        }

        $sorteoId = (int)($_POST['sorteo_id'] ?? 0);
        if ($sorteoId <= 0) {
            jsonOut(['ok' => false, 'msg' => 'ID de sorteo inválido']);
        }

        session_write_close();
        $ganadores = $model->ejecutarSorteo($sorteoId, $fuente, $horaDesde, $horaHasta);

        if ($ganadores === false || empty($ganadores)) {
            jsonOut(['ok' => false, 'msg' => 'No hay participantes disponibles para sortear']);
        }

        $resultado = array_map(function($g) {
            return [
                'nombre' => $g->name ?? $g->nombre ?? '—',
                'cedula' => $g->cedula ?? '',
                'zona'   => $g->zona   ?? '',
            ];
        }, is_array($ganadores) ? $ganadores : (array)$ganadores);

        jsonOut(['ok' => true, 'ganadores' => $resultado]);
    }

    // ── POST: reset ────────────────────────────────────────────────
    if ($accion === 'reset' && $_SERVER['REQUEST_METHOD'] === 'POST') {
        $token = $_POST['csrf_token'] ?? '';
        if (!hash_equals($_SESSION['csrf_token'] ?? '', $token)) {
            jsonOut(['ok' => false, 'msg' => 'Token inválido']);
        }
        $model->resetear();
        jsonOut(['ok' => true]);
    }

    jsonOut(['ok' => false, 'msg' => 'Acción no reconocida: ' . htmlspecialchars($accion)]);

} catch (Throwable $e) {
    error_log('[sorteoController] ' . $e->getMessage());
    jsonOut(['ok' => false, 'msg' => 'Error interno: ' . $e->getMessage()]);
}
