<?php
/**
 * votacionVotoController.php — Sprint 6
 *
 * Registra el voto del usuario en una votación dinámica.
 * Equivale a votoController.php pero usa las tablas nuevas
 * (votacion_votos, votacion_participantes).
 *
 * NO toca: votoController.php, tabla votos, tabla users.voto
 *
 * El campo users.voto NO se marca = '1' aquí porque eso es del
 * sistema legacy. El sistema dinámico usa votacion_participantes.
 */
namespace app\controller;

use app\models\user;
use app\models\votacion;

require_once '../models/user.php';
require_once '../models/votacion.php';

session_start();

// --- Validar sesión ---
if (empty($_SESSION['user_id'])) {
    header("Location: ../../index.php");
    exit;
}


// --- Validar CSRF (Fix Sprint 16 — E-05) ---
$_csrfPost    = $_POST['csrf_token'] ?? '';
$_csrfSession = $_SESSION['csrf_token'] ?? '';
if (empty($_csrfPost) || empty($_csrfSession) || !hash_equals($_csrfSession, $_csrfPost)) {
    error_log('[votacionVotoController] CSRF inválido: user_id=' . ($_SESSION['user_id'] ?? 'none'));
    header("Location: ../../index.php");
    exit;
}
// Regenerar token CSRF tras validación exitosa
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

// --- Recibir datos ---
$votacionId = isset($_POST['votacion_id']) ? (int)$_POST['votacion_id'] : 0;
$voto = isset($_POST['voto']) ? $_POST['voto'] : [];
if (!is_array($voto)) {
    $voto = [$voto];
}

if ($votacionId === 0 || count($voto) === 0) {
    header("Location: ../../index.php");
    exit;
}

// --- Obtener datos del usuario ---
$user = new user();
$usuario = $user->detallesUsuario($_SESSION['user_id']);

if (!$usuario || $usuario->activo != 1) {
    header("Location: ../../index.php");
    exit;
}

// --- Grace window Fix 15B: explícita para NULL ---
$enQuorum = ($usuario->quorum == 1) ||
            (($usuario->quorum == 0 || $usuario->quorum === null) &&
             !empty($usuario->fecha_salida) &&
             strtotime($usuario->fecha_salida) >= time() - (int)(env("GRACE_WINDOW_MINUTES", 5) * 60));

if (!$enQuorum) {
    error_log('[votacionVotoController] Sin quórum: user_id=' . $usuario->user_id);
    header("Location: ../../index.php");
    exit;
}

// --- Registrar voto atómico en votación dinámica ---
$votacionModel = new votacion();
$resultado = $votacionModel->registrarVotoDinamico($votacionId, $voto, $usuario);

if (!$resultado['success']) {
    error_log('[votacionVotoController] Voto rechazado user_id=' . $usuario->user_id . ': ' . $resultado['error']);
    header("Location: ../../index.php");
    exit;
}

// --- Limpiar token de votación si existía (preparación WhatsApp) ---
try {
    $db = $votacionModel->DB();
    $db->prepare("UPDATE users SET token_votacion = NULL, token_expira = NULL WHERE user_id = :uid")
       ->execute([":uid" => $usuario->user_id]);
} catch (\Exception $e) {
    // No crítico
}

// --- Cerrar sesión ---
session_unset();
session_destroy();
session_write_close();
setcookie(session_name(), '', 0, '/');

// --- Redirigir a confirmación ---
header("Location: ../../votacionFinalizado.php");
exit;
