<?php
// =========================================================================
// CONTROLADOR LOGÍSTIC DE FASES: REGISTRO, CONGRESILLO Y COMPETENCIA
// Zona Horària configurada per a l'Equador (America/Guayaquil)
// =========================================================================
date_default_timezone_set('America/Guayaquil');

if (session_status() === PHP_SESSION_NONE) { 
    session_start(); 
}

// Connexió nativa del teu sistema
require_once __DIR__ . '/../modelo/clsbdd.php'; 

$action = $_GET['action'] ?? '';$controller = new FaseCompetenciaController();

switch ($action) {
    case 'verificar_fase_registro':
        $controller->verificarAccesoRegistro();
        break;
    case 'postular_bastonera':
        $controller->procesarPostulacion();
        break;
    case 'aperturar_congresillo':
        $controller->aperturarCongresilloTecnico();
        break;
    case 'ejecutar_sorteo_vivo':
        $controller->ejecutarSorteoAleatorio();
        break;
    default:
        echo json_encode(['status' => 'error', 'message' => 'Acció no permesa o no definida.']);
        break;
}

class FaseCompetenciaController {
    private $db;

    public function __construct() {
        $this->db = new clsbdd();
    }

    /**
     * FASE 1: Verificació de terminis i tipus de competició
     */
    public function verificarAccesoRegistro() {
        $evp_id = intval($_GET['evp_id'] ?? 0);$sql = "SELECT evp_fecha, evp_fecha_limite_registro, evp_fase_actual, evp_tipo_competencia 
                FROM bas_eventos_propios WHERE evp_id = ?";
        $res =$this->db->query($sql, [$evp_id]); 
        $evento =$res->fetch_assoc();

        if (!$evento) {
            echo json_encode(['status' => 'error', 'permitir' => false, 'message' => 'Esdeveniment no trobat.']);
            return;
        }

        $ahora = new DateTime();
        $fecha_limite = new DateTime($evento['evp_fecha_limite_registro']);

        // Si el temps actual ha superat el termini o la fase no és de registre
        if ($ahora > $fecha_limite \vert{}\vert{}$evento['evp_fase_actual'] !== 'REGISTRO') {
            if ($evento['evp_fase_actual'] === 'REGISTRO') {$this->db->query("UPDATE bas_eventos_propios SET evp_fase_actual = 'CONGRESILLO' WHERE evp_id = ?", [$evp_id]);
            }
            echo json_encode([
                'status' => 'bloqueado',
                'permitir' => false,
                'tipo_competencia' => $evento['evp_tipo_competencia'],
                'message' => 'El termini d\'inscripció ha expirat per a aquesta competició.'
            ]);
            return;
        }

        echo json_encode([
            'status' => 'success', 
            'permitir' => true, 
            'tipo_competencia' => $evento['evp_tipo_competencia'],
            'message' => 'El període d\'inscripcions es troba actiu.'
        ]);
    }

    /**
     * FASE 1: Processament de la postulació (Híbrid Interna/Externa)
     */
    public function procesarPostulacion() {
        $ins_id = intval($_POST['ins_id'] ?? 0); 
        $evp_id = intval($_POST['evp_id'] ?? 0); 
        $cedula = trim($_POST['pos_cedula'] ?? '');
        $nombres = trim($_POST['pos_nombres'] ?? '');
        $apellidos = trim($_POST['pos_apellidos'] ?? '');
        $fecha_nac =$_POST['pos_fecha_nacimiento'] ?? '';
        $categoria =$_POST['pos_categoria'] ?? '';
        $estilo =$_POST['pos_estilo'] ?? 'UNICO';

        // 1. Validar terminis del servidor
        $sql = "SELECT evp_fecha, evp_fecha_limite_registro, evp_tipo_competencia, evp_fase_actual FROM bas_eventos_propios WHERE evp_id = ?";
        $evento =$this->db->query($sql, [$evp_id])->fetch_assoc();
        
        if (new DateTime() > new DateTime($evento['evp_fecha_limite_registro']) \vert{}\vert{}$evento['evp_fase_actual'] !== 'REGISTRO') {
            echo json_encode(['status' => 'error', 'message' => 'El formulari d\'inscripció ja està tancat.']);
            return;
        }

        $db_url_cedula = "INTERNA_NO_REQUERIDO";
        $db_url_auth = "INTERNA_NO_REQUERIDO";
        $db_url_rep = "INTERNA_NO_REQUERIDO";
        $estado_inicial = 'APROBADA'; // Per defecte aprovada si és Interna

        // 2. Si és externa, processar i exigir els fitxers físics obligatoris
        if ($evento['evp_tipo_competencia'] === 'EXTERNA') {$estado_inicial = 'PENDIENTE'; // Requereix auditoria manual al congresillo

            $adjuntosReq = ['url_cedula_deportista', 'url_autorizacion_imagen', 'url_cedula_representante'];$urls_guardadas = [];

            $uploadFileDir = __DIR__ . '/../uploads/cedulas_bastoneras/';
            if (!is_dir($uploadFileDir)) {
                mkdir($uploadFileDir, 0755, true);
            }

            foreach ($adjuntosReq as$adjunto) {
                if (!isset($_FILES[$adjunto]) || $_FILES[$adjunto]['error'] !== UPLOAD_ERR_OK) {
                    echo json_encode(['status' => 'error', 'message' => 'Tots els documents adjunts són obligatoris per a competicions externes.']);
                    return;
                }

                $fileTmpPath =$_FILES[$adjunto]['tmp_name'];$fileName = $_FILES[$adjunto]['name'];
                $fileExtension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));

                if (!in_array($fileExtension, ['pdf', 'jpg', 'jpeg', 'png'])) {
                    echo json_encode(['status' => 'error', 'message' => 'Format de fitxer no permès. Només PDF, JPG o PNG.']);
                    return;
                }

                $nuevoNombre =$cedula . "_" . $adjunto . "." . $fileExtension;
                $dest_path = $uploadFileDir .$nuevoNombre;

                if (move_uploaded_file($fileTmpPath, $dest_path)) {$urls_guardadas[$adjunto] = '/stage/uploads/cedulas_bastoneras/' .$nuevoNombre;
                } else {
                    echo json_encode(['status' => 'error', 'message' => 'Error en desar els fitxers al servidor.']);
                    return;
                }
            }

            $db_url_cedula =$urls_guardadas['url_cedula_deportista'];
            $db_url_auth =$urls_guardadas['url_autorizacion_imagen'];
            $db_url_rep =$urls_guardadas['url_cedula_representante'];
        }

        // 3. Inserció a la Base de Dades
        $sqlInsert = "INSERT INTO bas_postulaciones_bastoneras 
                      (ins_id, pos_cedula, pos_nombres, pos_apellidos, pos_fecha_nacimiento, pos_categoria, pos_estilo, url_cedula_deportista, url_autorizacion_imagen, url_cedula_representante, pos_estado_validacion) 
                      VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        
        $params = [$ins_id, $cedula,$nombres, $apellidos,$fecha_nac, $categoria,$estilo, $db_url_cedula,$db_url_auth, $db_url_rep,$estado_inicial];
        $this->db->query($sqlInsert, $params);$nacimiento = new DateTime($fecha_nac);$competencia = new DateTime($evento['evp_fecha']);$edad = $nacimiento->diff($competencia)->y;

        echo json_encode([
            'status' => 'success', 
            'message' => 'Registre completat correctament.',
            'edad_proyectada_evento' => $edad . ' anys'
        ]);
    }

    /**
     * FASE 2: Obertura del Congresillo Tècnic
     */
    public function aperturarCongresilloTecnico() {
        $evp_id = intval($_POST['evp_id'] ?? 0);$sql = "UPDATE bas_eventos_propios SET evp_fase_actual = 'CONGRESILLO' WHERE evp_id = ?";
        $this->db->query($sql, [$evp_id]);
        echo json_encode(['status' => 'success', 'message' => 'Congresillo Tècnic obert oficialment.']);
    }

    /**
     * FASE 2: Sorteig d'ordre de sortida (Fisher-Yates)
     */
    public function ejecutarSorteoAleatorio() {
        $evp_id = intval($_POST['evp_id'] ?? 0);

        $sqlCheck = "SELECT evp_fase_actual FROM bas_eventos_propios WHERE evp_id = ?";
        $evento =$this->db->query($sqlCheck, [$evp_id])->fetch_assoc();

        if ($evento['evp_fase_actual'] !== 'CONGRESILLO') {
            echo json_encode(['status' => 'error', 'message' => 'El congresillo ha d\'estar obert per fer el sorteig.']);
            return;
        }

        // Seleccionar combinacions de categoria i estil per fer sorteigs individuals per bloc de pista
        $sqlGrupos = "SELECT DISTINCT p.pos_categoria, p.pos_estilo 
                      FROM bas_postulaciones_bastoneras p
                      INNER JOIN bas_academias_inscritas a ON p.ins_id = a.ins_id
                      WHERE a.evp_id = ? AND p.pos_estado_validacion = 'APROBADA'";
        
        $resGrupos = $this->db->query($sqlGrupos, [$evp_id]);$hay_datos = false;

        // Esborrar qualsevol sorteig previ d'aquest esdeveniment per si es reinicia
        $this->db->query("DELETE FROM bas_escaleta_sorteo WHERE evp_id = ?", [$evp_id]);

        while ($grupo =$resGrupos->fetch_assoc()) {
            $cat =$grupo['pos_categoria'];
            $est =$grupo['pos_estilo'];

            // Obtenir les acadèmies úniques amb participants en aquesta categoria i estil
            $sqlAcad = "SELECT DISTINCT a.ins_id FROM bas_academias_inscritas a
                        INNER JOIN bas_postulaciones_bastoneras p ON a.ins_id = p.ins_id
                        WHERE a.evp_id = ? AND p.pos_categoria = ? AND p.pos_estilo = ? AND p.pos_estado_validacion = 'APROBADA'";
            
            $resAcad = $this->db->query($sqlAcad, [$evp_id,$cat, $est]);$academias = [];
            while($row =$resAcad->fetch_assoc()) {
                $academias[] =$row['ins_id'];
            }

            if (!empty($academias)) {$hay_datos = true;
                shuffle($academias); // Algorisme de desordenament Fisher-Yates nativa de PHP

                $orden = 1;
                foreach ($academias as $ins_id) {$sqlInsertEsc = "INSERT INTO bas_escaleta_sorteo (evp_id, ins_id, esc_categoria, esc_estilo, esc_orden_salida) VALUES (?, ?, ?, ?, ?)";
                    $this->db->query($sqlInsertEsc, [$evp_id,$ins_id, $cat,$est, $orden]);$orden++;
                }
            }
        }

        if (!$hay_datos) {
            echo json_encode(['status' => 'error', 'message' => 'No hi ha participants aprovats per realitzar el sorteig.']);
            return;
        }

        $this->db->query("UPDATE bas_eventos_propios SET evp_fase_actual = 'COMPETENCIA' WHERE evp_id = ?", [$evp_id]);
        echo json_encode(['status' => 'success', 'message' => 'Sorteig finalitzat amb èxit. Escaleta de pista generada.']);
    }
}