<?php
session_save_path("/home/evolucionamos/public_html/mejora/sessions");
session_start();
if (empty($_SESSION['adm']) || ($_SESSION['role'] != 1 && $_SESSION['role'] != 3)) {
    header("Location: ../../../administradores/index.php"); exit;
}

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

// Sprint 4: la función correcta es validarCSRF() (NO validarTokenCSRF)
validarCSRF();

$model      = new \app\models\votacion();
$accion     = isset($_POST['accion']) ? trim($_POST['accion']) : '';
$votacionId = isset($_POST['votacion_id']) ? (int)$_POST['votacion_id'] : 0;

if (!$votacionId) {
    header("Location: ../../../administradores/votaciones.php?error=Votación+no+especificada"); exit;
}

function redir($vid, $type, $msg) {
    header("Location: ../../../administradores/votacion_detalle.php?id={$vid}&{$type}=" . urlencode($msg)); exit;
}

switch ($accion) {

    case 'agregar_candidato':
        $numero   = isset($_POST['numero'])   ? strip_tags(trim($_POST['numero']))   : '';
        $nombre   = isset($_POST['nombre'])   ? strip_tags(trim($_POST['nombre']))   : '';
        $posicion = isset($_POST['posicion']) ? strip_tags(trim($_POST['posicion'])) : '';
        $cedula   = isset($_POST['cedula'])   ? strip_tags(trim($_POST['cedula']))   : '';
        $zona     = isset($_POST['zona'])     ? strip_tags(trim($_POST['zona']))     : '';
        if ($numero === '' || $nombre === '') redir($votacionId, 'error', 'Número y nombre son obligatorios');
        $tienefoto = ($cedula !== '') ? 'SI' : 'NO';
        $model->agregarCandidato($votacionId, $numero, $nombre, $posicion, $cedula, $zona, $tienefoto);
        redir($votacionId, 'success', 'Candidato agregado correctamente');
        break;

    case 'eliminar_candidato':
        $cid = isset($_POST['candidato_id']) ? (int)$_POST['candidato_id'] : 0;
        $model->eliminarCandidato($cid, $votacionId);
        redir($votacionId, 'success', 'Candidato eliminado');
        break;

    case 'subir_excel':
        $zona = isset($_POST['zona_upload']) ? strip_tags(trim($_POST['zona_upload'])) : '';
        if ($zona === '') redir($votacionId, 'error', 'Debe seleccionar zona antes de subir el archivo');

        if (!isset($_FILES['excelFile']) || $_FILES['excelFile']['error'] !== UPLOAD_ERR_OK) {
            redir($votacionId, 'error', 'Error al recibir el archivo');
        }

        $fileName = $_FILES['excelFile']['name'];
        $tmpPath  = $_FILES['excelFile']['tmp_name'];
        $ext      = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));

        if (!in_array($ext, ['xlsx', 'xls', 'csv'])) {
            redir($votacionId, 'error', 'Solo se permiten archivos .xlsx, .xls o .csv');
        }

        $filas = [];

        if ($ext === 'csv') {
            $handle   = fopen($tmpPath, 'r');
            $firstRow = true;
            while (($data = fgetcsv($handle, 1000, ';')) !== false) {
                if ($firstRow) { $firstRow = false; continue; }
                $filas[] = $data;
            }
            fclose($handle);
        } else {
            $autoloadPaths = [
                __DIR__ . '/../../../vendor/autoload.php',
                __DIR__ . '/../../../../vendor/autoload.php',
            ];
            $autoloaded = false;
            foreach ($autoloadPaths as $ap) {
                if (file_exists($ap)) { require_once $ap; $autoloaded = true; break; }
            }
            if (!$autoloaded) {
                redir($votacionId, 'error', 'PhpSpreadsheet no instalado. Use formato CSV con separador punto y coma (;)');
            }
            try {
                $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($tmpPath);
                $sheet = $spreadsheet->getActiveSheet();
                $firstRow = true;
                foreach ($sheet->getRowIterator() as $row) {
                    if ($firstRow) { $firstRow = false; continue; }
                    $cells        = [];
                    $cellIterator = $row->getCellIterator();
                    $cellIterator->setIterateOnlyExistingCells(false);
                    foreach ($cellIterator as $cell) { $cells[] = $cell->getFormattedValue(); }
                    if (!empty(array_filter($cells))) $filas[] = $cells;
                }
            } catch (Exception $e) {
                error_log('[subir_excel] ' . $e->getMessage());
                redir($votacionId, 'error', 'Error al leer el archivo Excel: ' . $e->getMessage());
            }
        }

        if (empty($filas)) redir($votacionId, 'error', 'El archivo no contiene datos');

        $count = $model->subirCandidatosBatchExcel($votacionId, $filas, $zona);
        redir($votacionId, 'success', "$count candidato(s) cargados correctamente en zona: $zona");
        break;

    case 'limpiar_candidatos':
        $model->limpiarCandidatosVotacion($votacionId);
        redir($votacionId, 'success', 'Todos los candidatos eliminados');
        break;

    default:
        header("Location: ../../../administradores/votaciones.php?error=Acción+no+válida"); exit;
}
