<?php
/**
 * votoController.php — Sprint 3: Transacción atómica + Grace Window
 *
 * ANTES: Sin validación de quórum, sin transacción, INSERTs individuales
 * AHORA: Valida quórum (con grace window), usa transacción InnoDB,
 *        batch INSERT, SELECT FOR UPDATE para evitar doble voto
 */
namespace app\controller;

use app\models\user;
use app\models\votos;

require_once '../models/user.php';
require_once '../models/votos.php';
require_once '../../datos.php';

session_start();

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

// --- Recibir candidatos seleccionados ---
$voto = isset($_POST['voto']) ? $_POST['voto'] : [];
if (!is_array($voto)) {
    $voto = [$voto];
}
if (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;
}

// --- Sprint 3: Registrar voto con transacción atómica ---
$votosModel = new votos();
$resultado = $votosModel->registrarVotoCompleto($voto, $usuario);

if (!$resultado['success']) {
    // Si ya votó o no tiene quórum, redirigir
    error_log('[votoController] Voto rechazado para user_id=' . $usuario->user_id . ': ' . $resultado['error']);
    header("Location: ../index.php");
    exit;
}

// --- Limpiar token de votación si existía ---
try {
    $db = $votosModel->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 — solo limpieza
}

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

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