<?php
/**
 * votar.php — Sprint 3: Votación por token (preparación para WhatsApp)
 *
 * Flujo:
 *   1. Usuario recibe enlace por WhatsApp: https://dominio/votar.php?token=XXX
 *   2. Este archivo valida el token y establece sesión
 *   3. Redirige a candidatos.php para que vote normalmente
 *
 * Seguridad:
 *   - Token de 64 caracteres (bin2hex(random_bytes(32)))
 *   - Expira (default: 30 minutos)
 *   - Se invalida después de votar
 *   - Requiere quórum vigente (con grace window)
 */

require_once __DIR__ . '/env_loader.php';
require_once __DIR__ . '/app/models/conexion.php';
require_once __DIR__ . '/app/models/user.php';
require_once __DIR__ . '/app/models/votos.php';

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

// --- Obtener token ---
$token = isset($_GET['token']) ? trim($_GET['token']) : '';

if (empty($token) || strlen($token) !== 64 || !ctype_xdigit($token)) {
    http_response_code(400);
    echo '<!DOCTYPE html><html><head><meta charset="utf-8"><title>Enlace inválido</title></head><body>';
    echo '<div style="text-align:center;padding:50px;font-family:Arial;">';
    echo '<h2>Enlace inválido</h2>';
    echo '<p>El enlace de votación no es válido. Verifique que copió el enlace completo.</p>';
    echo '</div></body></html>';
    exit;
}

// --- Buscar usuario por token ---
$userModel = new user();
$usuario = $userModel->buscarPorToken($token);

if (!$usuario) {
    http_response_code(403);
    echo '<!DOCTYPE html><html><head><meta charset="utf-8"><title>Enlace expirado</title></head><body>';
    echo '<div style="text-align:center;padding:50px;font-family:Arial;">';
    echo '<h2>Enlace expirado o inválido</h2>';
    echo '<p>Este enlace de votación ya expiró o no es válido. Solicite uno nuevo.</p>';
    echo '</div></body></html>';
    exit;
}

// --- Verificar quórum con grace window ---
$enQuorum = ($usuario->quorum == 1) ||
            ($usuario->quorum == 0 &&
             !empty($usuario->fecha_salida) &&
             strtotime($usuario->fecha_salida) >= time() - 300);

if (!$enQuorum) {
    http_response_code(403);
    echo '<!DOCTYPE html><html><head><meta charset="utf-8"><title>Sin quórum</title></head><body>';
    echo '<div style="text-align:center;padding:50px;font-family:Arial;">';
    echo '<h2>Quórum no vigente</h2>';
    echo '<p>Su registro de quórum no está activo. Debe estar presente en la asamblea para votar.</p>';
    echo '</div></body></html>';
    exit;
}

// --- Verificar si ya votó (legacy Y dinámico) ---
$votosModel = new votos();
$yaVoto = $votosModel->votoRealizado($usuario->username);

// Sprint 10B: también verificar en el sistema dinámico (votacion_participantes)
if (!$yaVoto) {
    require_once __DIR__ . '/app/models/votacion.php';
    $votMdl = new \app\models\votacion();
    $votAb  = $votMdl->obtenerAbierta();
    if ($votAb && $votMdl->usuarioYaVoto($votAb->id, $usuario->user_id)) {
        $yaVoto = true;
    }
}

if ($yaVoto) {
    echo '<!DOCTYPE html><html><head><meta charset="utf-8"><title>Voto registrado</title></head><body>';
    echo '<div style="text-align:center;padding:50px;font-family:Arial;">';
    echo '<h2>Voto ya registrado</h2>';
    echo '<p>Usted ya emitió su voto. Gracias por participar.</p>';
    echo '</div></body></html>';
    exit;
}

// --- Todo válido: crear sesión y redirigir a candidatos ---
session_start();
session_regenerate_id(true);
$_SESSION['user_id'] = $usuario->user_id;
$_SESSION['via_token'] = true;

// Sprint 6: Si hay votación dinámica abierta, redirigir al nuevo flujo
    require_once 'app/models/votacion.php';
    $votacionModel = new \app\models\votacion();
    $votacionAbierta = $votacionModel->obtenerAbierta();
    if ($votacionAbierta && !$votacionModel->usuarioYaVoto($votacionAbierta->id, $usuario->user_id)) {
        header("Location: votacion_activa.php?vid=" . $votacionAbierta->id);
        exit;
    }
    header("Location: candidatos.php");
exit;
