<?php
/**
 * votacionActivaController.php — Sprint 6
 *
 * Carga la votación dinámica activa y sus candidatos para la vista del usuario.
 * Equivale a candidatosController.php pero para votaciones dinámicas.
 *
 * NO toca: candidatosController.php, votos.php, candidatos.php (modelo)
 *
 * Define variables para la vista:
 *   $usuario          — datos del usuario logueado
 *   $votacionActiva   — objeto de la votación abierta
 *   $listaCandidatos  — candidatos de la votación (filtrados por zona si aplica)
 *   $minCandidatos    — mínimo de opciones a seleccionar
 *   $maxCandidatos    — máximo de opciones a seleccionar
 */
namespace app\controller;

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

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

session_start();

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

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

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

// --- Verificar quórum con 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) {
    header("Location: index.php");
    exit;
}

// --- Cargar votación dinámica ---
$votacionModel = new votacion();

// Primero: si viene vid por parámetro, usarla. Si no, buscar la abierta.
$vid = isset($_GET['vid']) ? (int)$_GET['vid'] : 0;
if ($vid > 0) {
    $votacionActiva = $votacionModel->obtener($vid);
    if (!$votacionActiva || $votacionActiva->estado !== 'abierta') {
        // Votación no existe o no está abierta — fallback al flujo original
        header("Location: candidatos.php");
        exit;
    }
} else {
    $votacionActiva = $votacionModel->obtenerAbierta();
    if (!$votacionActiva) {
        // No hay votación dinámica abierta — fallback al flujo original
        header("Location: candidatos.php");
        exit;
    }
}

// --- Verificar si ya votó en esta votación ---
if ($votacionModel->usuarioYaVoto($votacionActiva->id, $usuario->user_id)) {
    header("Location: index.php");
    exit;
}

// --- Cargar candidatos ---
// Intentar filtrar por zona del usuario. Si no hay candidatos para esa zona,
// cargar todos (para votaciones sin zonas como aprobaciones).
$listaCandidatos = $votacionModel->candidatosPorZona($votacionActiva->id, $usuario->zona);
if (empty($listaCandidatos)) {
    $listaCandidatos = $votacionModel->candidatosPorZona($votacionActiva->id);
}

$minCandidatos = max(1, (int)$votacionActiva->min_candidatos);
$maxCandidatos = max(1, (int)$votacionActiva->max_candidatos);
