<?php
/**
 * ajax_estado_votacion.php — Sprint 9A rev4
 * Cambia el estado de una votación vía AJAX (POST).
 * Requiere sesión admin + CSRF válido.
 */
session_save_path("/home/evolucionamos/public_html/mejora/sessions");
session_start();
header('Content-Type: application/json; charset=utf-8');

if (empty($_SESSION['adm']) || ($_SESSION['role'] != 1 && $_SESSION['role'] != 3)) {
    echo json_encode(['ok' => false, 'msg' => 'No autorizado']); exit;
}

require_once '../app/helpers/csrf.php';
require_once '../app/models/votacion.php';
require_once '../app/models/conexion.php';

// Validar CSRF — validación inline para endpoints AJAX
// NOTA: validarCSRF() retorna void, no bool. Por eso validamos inline.
$_csrfPost    = $_POST['csrf_token'] ?? '';
$_csrfSession = $_SESSION['csrf_token'] ?? '';
if (empty($_csrfPost) || empty($_csrfSession) || !hash_equals($_csrfSession, $_csrfPost)) {
    error_log('[CSRF] Token inválido en ajax_estado_votacion — POST: ' . substr($_csrfPost,0,8) . '...');
    echo json_encode(['ok' => false, 'msg' => 'Token CSRF inválido']); exit;
}
// Regenerar token después de validación exitosa
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

$vid    = isset($_POST['vid'])    ? (int)$_POST['vid']         : 0;
$estado = isset($_POST['estado']) ? trim($_POST['estado'])      : '';

$permitidos = ['cerrada', 'finalizada', 'abierta'];
if (!$vid || !in_array($estado, $permitidos)) {
    echo json_encode(['ok' => false, 'msg' => 'Parámetros inválidos']); exit;
}

try {
    $db  = (new \app\models\conexion())->DB();

    // Construir UPDATE según el estado destino
    if ($estado === 'abierta') {
        // Al abrir: registrar fecha_apertura si no tiene, limpiar fecha_cierre
        $sql = "UPDATE votaciones
                SET estado = :estado,
                    fecha_apertura = COALESCE(fecha_apertura, NOW()),
                    fecha_cierre   = NULL
                WHERE id = :id LIMIT 1";
    } elseif ($estado === 'cerrada') {
        // Al cerrar: grabar fecha_cierre exacta
        $sql = "UPDATE votaciones
                SET estado = :estado,
                    fecha_cierre = NOW()
                WHERE id = :id LIMIT 1";
    } else {
        // finalizada u otros: solo cambiar estado
        $sql = "UPDATE votaciones SET estado = :estado WHERE id = :id LIMIT 1";
    }

    $st = $db->prepare($sql);
    $st->execute([':estado' => $estado, ':id' => $vid]);

    if ($st->rowCount() === 0) {
        echo json_encode(['ok' => false, 'msg' => 'Votación no encontrada']); exit;
    }

    echo json_encode(['ok' => true, 'nuevo_estado' => $estado]);

} catch (Exception $e) {
    echo json_encode(['ok' => false, 'msg' => 'Error BD: ' . $e->getMessage()]);
}
