<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

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

require_once __DIR__ . '/../modelo/Db.php'; 
$bd = new clsbdd();

$action = $_GET['action'] ?? '';

switch ($action) {
    case 'guardar':
        $evp_id                    = $_POST['evp_id'] ?? '';
        $nombre                    = strtoupper($bd->esc($_POST['evp_nombre']));
        $tipo_competencia          = $bd->esc($_POST['evp_tipo_competencia'] ?? 'EXTERNA');
        $fecha                     = $bd->esc($_POST['evp_fecha']);
        $fase_actual               = $bd->esc($_POST['evp_fase_actual'] ?? 'REGISTRO');
        $estado                    = $bd->esc($_POST['evp_estado']);
        $lugar                     = strtoupper($bd->esc($_POST['evp_lugar']));
        
        $fecha_congresillo         = !empty($_POST['evp_fecha_congresillo']) ? $bd->esc($_POST['evp_fecha_congresillo']) : '0000-00-00 00:00:00';
        $fecha_limite_registro     = !empty($_POST['evp_fecha_limite_registro']) ? $bd->esc($_POST['evp_fecha_limite_registro']) : '0000-00-00 00:00:00';
        
        $entrada                   = floatval($_POST['evp_costo_entrada_publico'] ?? 0);
        $inscripcion               = floatval($_POST['evp_costo_inscripcion_bastonera'] ?? 0);
        $obs                       = $bd->esc($_POST['evp_observaciones']);

        if (empty($evp_id)) {
            $token = ($tipo_competencia === 'EXTERNA') ? bin2hex(random_bytes(16)) : '';

            $sql = "INSERT INTO bas_eventos_propios (
                        evp_nombre, evp_tipo_competencia, evp_fecha, evp_fecha_congresillo, 
                        evp_fecha_limite_registro, evp_fase_actual, evp_lugar, 
                        evp_costo_entrada_publico, evp_costo_inscripcion_bastonera, 
                        evp_estado, evp_observaciones, evp_token_registro
                    ) VALUES (
                        '$nombre', '$tipo_competencia', '$fecha', '$fecha_congresillo', 
                        '$fecha_limite_registro', '$fase_actual', '$lugar', 
                        '$entrada', '$inscripcion', 
                        '$estado', '$obs', '$token'
                    )";
            $bd->ejecutar($sql);
        } else {
            $token_sql = "";
            if ($tipo_competencia === 'EXTERNA') {
                $resTok = $bd->ejecutar("SELECT evp_token_registro FROM bas_eventos_propios WHERE evp_id = '$evp_id' LIMIT 1");
                if ($resTok && $rTok = $resTok->fetch_assoc()) {
                    if (empty($rTok['evp_token_registro'])) {
                        $nuevo_token = bin2hex(random_bytes(16));
                        $token_sql = ", evp_token_registro='$nuevo_token'";
                    }
                }
            }

            $sql = "UPDATE bas_eventos_propios SET 
                        evp_nombre='$nombre', 
                        evp_tipo_competencia='$tipo_competencia', 
                        evp_fecha='$fecha', 
                        evp_fecha_congresillo='$fecha_congresillo', 
                        evp_fecha_limite_registro='$fecha_limite_registro', 
                        evp_fase_actual='$fase_actual', 
                        evp_lugar='$lugar', 
                        evp_costo_entrada_publico='$entrada', 
                        evp_costo_inscripcion_bastonera='$inscripcion', 
                        evp_estado='$estado', 
                        evp_observaciones='$obs'
                        $token_sql
                    WHERE evp_id='$evp_id'";
            $bd->ejecutar($sql);
        }
        header("Location: ../index.php?page=eventos_propios/listar");
        exit();
        break;

    case 'inscribir_interna_individual':
        // Asegurar que las respuestas limpien cualquier buffer previo
        if (!headers_sent()) header('Content-Type: application/json');
        if (ob_get_length()) ob_clean();

        $evp_id       = intval($_POST['evp_id'] ?? 0);
        $modalidad    = strtoupper($bd->esc($_POST['int_modalidad'] ?? $_POST['ins_modalidad'] ?? 'SOLISTAS'));
        $detalles_nom = strtoupper($bd->esc($_POST['int_nombres_participantes'] ?? $_POST['ins_nombres_participantes'] ?? ''));
        $cla_id       = intval($_POST['cla_id'] ?? $_POST['int_cla_id'] ?? 0);

        if (empty($evp_id) || empty($detalles_nom) || empty($cla_id)) {
            echo json_encode([
                'status' => 'error', 
                'message' => 'Faltan datos obligatorios para la inscripción interna.'
            ]);
            exit();
        }

        $nombre_final_registro = $modalidad . " - " . $detalles_nom;

        // 1. Insertar la cabecera de la inscripción
        $sqlIns = "INSERT INTO bas_academias_inscritas (evp_id, ins_nombre_academia, ins_responsable, ins_telefono, created_at) 
                   VALUES ('$evp_id', '$nombre_final_registro', 'STAGE DANCE CORP', 'INTERNO', NOW())";
        
        if (!$bd->ejecutar($sqlIns)) {
            echo json_encode([
                'status' => 'error', 
                'message' => 'Error al insertar en bas_academias_inscritas.'
            ]);
            exit();
        }

        // Obtener el ID insertado
        $ins_id = method_exists($bd, 'getInsertId') ? $bd->getInsertId() : null;
        if (empty($ins_id)) {
            $res = $bd->ejecutar("SELECT ins_id FROM bas_academias_inscritas WHERE evp_id = '$evp_id' AND ins_nombre_academia = '$nombre_final_registro' ORDER BY ins_id DESC LIMIT 1");
            $ins_id = ($res && $row = $res->fetch_assoc()) ? $row['ins_id'] : 0;
        }

        // 2. Buscar en bas_clasificaciones
        // NOTA: Si en tu base de datos las columnas no llevan el prefijo "cla_", 
        // cambia "cla_categoria" por "categoria" y "cla_rango" por "rango"
        $sqlCheck = "SELECT * FROM bas_clasificaciones WHERE cla_id = '$cla_id' LIMIT 1";
        $resData = $bd->ejecutar($sqlCheck);
        
        if ($resData && $d = $resData->fetch_assoc()) {
            // Mapeo flexible por si las columnas se llaman distinto
            $cat = $bd->esc($d['cla_categoria'] ?? $d['categoria'] ?? '');
            $ran = $bd->esc($d['cla_rango'] ?? $d['rango'] ?? '');
            
            $sqlAsig = "INSERT INTO bas_inscripciones_niveles (ins_id, niv_categoria, niv_rango, niv_orden_salida, created_at, puntaje_final, calificado) 
                        VALUES ('$ins_id', '$cat', '$ran', 1, NOW(), 0.00, 0)";
            
            if ($bd->ejecutar($sqlAsig)) {
                echo json_encode([
                    'status' => 'success', 
                    'message' => '¡Inscrita con éxito en la copa interna!'
                ]);
            } else {
                echo json_encode([
                    'status' => 'error', 
                    'message' => 'Error en la consulta bas_inscripciones_niveles.'
                ]);
            }
        } else {
            echo json_encode([
                'status' => 'error', 
                'message' => 'No se encontró la clasificación con ID ' . $cla_id . ' en la tabla bas_clasificaciones.'
            ]);
        }
        exit();
        break;

    case 'eliminar_inscripcion':
        if (!headers_sent()) header('Content-Type: application/json');
        if (ob_get_length()) ob_clean();

        $ins_id = intval($_POST['ins_id'] ?? 0);

        if (empty($ins_id)) {
            echo json_encode(['status' => 'error', 'message' => 'ID de inscripción no válido o no recibido.']);
            exit();
        }

        // 1. Al usar un esquema relacional, primero se borran los niveles hijos asociados
        $sqlNiveles = "DELETE FROM bas_inscripciones_niveles WHERE ins_id = '$ins_id'";
        $bd->ejecutar($sqlNiveles);

        // 2. Posteriormente se borra el registro de la cabecera (academia o participante interno)
        $sqlAcademia = "DELETE FROM bas_academias_inscritas WHERE ins_id = '$ins_id'";
        
        if ($bd->ejecutar($sqlAcademia)) {
            echo json_encode(['status' => 'success', 'message' => 'Inscripción eliminada correctamente del festival.']);
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Error al intentar eliminar el registro de la base de datos.']);
        }
        exit();
        break;
        
    case 'buscar_alumnas_ajax':
        header('Content-Type: application/json');
        $term = $bd->esc($_GET['term'] ?? '');
        
        $sql = "SELECT usu_id as id, CONCAT(usu_apellido, ' ', usu_nombre) as text 
                FROM bas_usuarios 
                WHERE usu_rol = 'ESTUDIANTE' AND (usu_nombre LIKE '%$term%' OR usu_apellido LIKE '%$term%') 
                ORDER BY usu_apellido ASC LIMIT 10";
        
        $res = $bd->ejecutar($sql);
        $alumnas = [];
        if ($res && $res->num_rows > 0) {
            while ($r = $res->fetch_assoc()) {
                $alumnas[] = $r;
            }
        }
        echo json_encode($alumnas);
        exit();
        break;

    case 'inscribir_academia_con_niveles':
        $evp_id = intval($_POST['evp_id'] ?? 0);
        $ins_nombre_academia = strtoupper($bd->esc($_POST['ins_nombre_academia'] ?? ''));
        $ins_responsable = strtoupper($bd->esc($_POST['ins_responsable'] ?? ''));
        $ins_telefono = $bd->esc($_POST['ins_telefono'] ?? '');
        $niveles_ids = $_POST['niveles_ids'] ?? [];

        if (empty($evp_id) || empty($ins_nombre_academia)) {
            echo json_encode(['status' => 'error', 'message' => 'Faltan parámetros obligatorios.']);
            exit();
        }
        if (empty($niveles_ids)) {
            echo json_encode(['status' => 'error', 'message' => 'Debe seleccionar al menos un nivel.']);
            exit();
        }

        $sqlCheck = "SELECT ins_id FROM bas_academias_inscritas WHERE evp_id = '$evp_id' AND ins_nombre_academia = '$ins_nombre_academia' LIMIT 1";
        $resCheck = $bd->ejecutar($sqlCheck);
        $ins_id = null;

        if ($resCheck && $resCheck->num_rows > 0) {
            $row = $resCheck->fetch_assoc();
            $ins_id = $row['ins_id'];
            $sqlUpdate = "UPDATE bas_academias_inscritas SET ins_responsable = '$ins_responsable', ins_telefono = '$ins_telefono' WHERE ins_id = '$ins_id'";
            $bd->ejecutar($sqlUpdate);
        } else {
            $sqlIns = "INSERT INTO bas_academias_inscritas (evp_id, ins_nombre_academia, ins_responsable, ins_telefono, created_at) VALUES ('$evp_id', '$ins_nombre_academia', '$ins_responsable', '$ins_telefono', NOW())";
            $bd->ejecutar($sqlIns);
            
            $ins_id = $bd->getInsertId();
            if(empty($ins_id)) {
                $sqlGetId = "SELECT ins_id FROM bas_academias_inscritas WHERE evp_id = '$evp_id' AND ins_nombre_academia = '$ins_nombre_academia' LIMIT 1";
                $resGetId = $bd->ejecutar($sqlGetId);
                if ($resGetId && $resGetId->num_rows > 0) {
                    $rowId = $resGetId->fetch_assoc();
                    $ins_id = $rowId['ins_id'];
                }
            }
        }

        $insertados = 0;
        foreach ($niveles_ids as $nvc_id) {
            $sqlNivData = "SELECT nvc_categoria, nvc_rango FROM bas_niveles_config WHERE nvc_id = '$nvc_id' LIMIT 1";
            $resData = $bd->ejecutar($sqlNivData);
            
            if ($resData && $d = $resData->fetch_assoc()) {
                $cat = $bd->esc($d['nvc_categoria']);
                $ran = $bd->esc($d['nvc_rango']);
                
                $sqlCheckAsig = "SELECT niv_id FROM bas_inscripciones_niveles WHERE ins_id = '$ins_id' AND niv_categoria = '$cat' AND niv_rango = '$ran' LIMIT 1";
                $resCheckAsig = $bd->ejecutar($sqlCheckAsig);
                
                if ($resCheckAsig && $resCheckAsig->num_rows == 0) {
                    $sqlAsig = "INSERT INTO bas_inscripciones_niveles (ins_id, niv_categoria, niv_rango, niv_orden_salida, created_at, puntaje_final, calificado) VALUES ('$ins_id', '$cat', '$ran', 1, NOW(), 0.00, 0)";
                    if ($bd->ejecutar($sqlAsig)) $insertados++;
                } else {
                    $insertados++;
                }
            }
        }
        echo json_encode(['status' => 'success', 'message' => 'Inscripción externa procesada.']);
        exit();
        break;

    case 'obtener_inscritos':
        if (ob_get_length()) ob_clean();
        $evp_id = intval($_GET['evp_id'] ?? 0);

        if ($evp_id <= 0) {
            echo '<p class="text-danger small text-center py-3">ID de evento no válido.</p>';
            exit();
        }

        $sql = "SELECT ai.ins_id, ai.ins_nombre_academia, ai.ins_responsable, ai.ins_telefono,
                       GROUP_CONCAT(CONCAT(iniv.niv_categoria, ' (', iniv.niv_rango, ')') SEPARATOR ', ') as categorias_detalles
                FROM bas_academias_inscritas ai
                LEFT JOIN bas_inscripciones_niveles iniv ON ai.ins_id = iniv.ins_id
                WHERE ai.evp_id = '$evp_id'
                GROUP BY ai.ins_id
                ORDER BY ai.ins_id DESC";

        $res = $bd->ejecutar($sql);

        if ($res && $res->num_rows > 0) {
            echo '<div class="table-responsive">';
            echo '  <table class="table table-sm table-hover align-middle mb-0" style="font-size: 11px;">';
            echo '    <thead class="table-light text-secondary small text-uppercase">';
            echo '      <tr>';
            echo '        <th>Participante / Academia</th>';
            echo '        <th>Detalles / Categorías</th>';
            echo '        <th class="text-end">Acciones</th>';
            echo '      </tr>';
            echo '    </thead>';
            echo '    <tbody>';
            
            while ($r = $res->fetch_assoc()) {
                $es_interna = ($r['ins_responsable'] === 'STAGE DANCE CORP' || $r['ins_telefono'] === 'INTERNO');
                
                echo '      <tr>';
                echo '        <td>';
                if ($es_interna) {
                    echo '          <span class="badge bg-purple-light text-purple mb-1 d-inline-block" style="font-size: 9px; background-color: #f1ecf9; color: #6f42c1;">COPA INTERNA</span>';
                    echo '          <div class="fw-bold text-dark"><i class="fas fa-user-graceful text-purple me-1"></i>' . htmlspecialchars($r['ins_nombre_academia']) . '</div>';
                } else {
                    echo '          <span class="badge bg-light text-primary border mb-1 d-inline-block" style="font-size: 9px;">EXTERNO</span>';
                    echo '          <div class="fw-bold text-dark"><i class="fas fa-school text-primary me-1"></i>' . htmlspecialchars($r['ins_nombre_academia']) . '</div>';
                    echo '          <div class="text-muted small" style="font-size: 10px;">Dir: ' . htmlspecialchars($r['ins_responsable'] ?? '') . '</div>';
                }
                echo '        </td>';
                echo '        <td>';
                echo '          <div class="text-secondary fw-semibold">' . htmlspecialchars($r['categorias_detalles'] ?? 'Sin niveles asignados') . '</div>';
                echo '        </td>';
                echo '        <td class="text-end">';
                echo '          <button type="button" class="btn btn-link btn-sm text-danger p-0 px-2" onclick="eliminarInscripcion(' . $r['ins_id'] . ', ' . $evp_id . ')" title="Eliminar">';
                echo '            <i class="fas fa-trash-alt"></i>';
                echo '          </button>';
                echo '        </td>';
                echo '      </tr>';
            }
            
            echo '    </tbody>';
            echo '  </table>';
            echo '</div>';
        } else {
            echo '<div class="text-muted text-center py-4 small">
                    <i class="fas fa-folder-open d-block mb-2 fs-4 text-secondary"></i>
                    Aún no hay deportistas o academias inscritas en este festival.
                  </div>';
        }
        exit();
        break;

    case 'obtener_escaleta':
    case 'listar_inscritos':
        if (ob_get_length()) ob_clean();
        $evp_id = intval($_GET['evp_id'] ?? 0);
        
        $sql = "SELECT ai.ins_nombre_academia, GROUP_CONCAT(CONCAT(iniv.niv_categoria, ' (', iniv.niv_rango, ')') SEPARATOR ', ') as listas 
                FROM bas_academias_inscritas ai 
                JOIN bas_inscripciones_niveles iniv ON ai.ins_id = iniv.ins_id 
                WHERE ai.evp_id = '$evp_id' 
                GROUP BY ai.ins_id 
                ORDER BY ai.ins_nombre_academia ASC";
        $res = $bd->ejecutar($sql);
        
        echo "<table class='table table-sm table-striped table-bordered mb-0' style='font-size: 12px;'>";
        echo "<thead class='table-light text-muted small text-uppercase'><tr><th>Participante / Academia</th><th>Modalidad y Categoría</th></tr></thead><tbody>";
        if ($res && $res->num_rows > 0) {
            while ($r = $res->fetch_assoc()) {
                echo "<tr>";
                echo "<td><strong class='text-dark'>" . htmlspecialchars($r['ins_nombre_academia']) . "</strong></td>";
                echo "<td><span class='badge bg-light text-dark border py-1 px-2'>" . htmlspecialchars($r['listas']) . "</span></td>";
                echo "</tr>";
            }
        } else {
            echo "<tr><td colspan='2' class='text-muted text-center py-3'>No hay registros en la escaleta de este festival.</td></tr>";
        }
        echo "</tbody></table>";
        exit();
        break;

    case 'calificar_avanzado':
        header('Content-Type: application/json');
        $niv_id = intval($_POST['niv_id'] ?? 0);
        
        if (empty($niv_id)) {
            echo json_encode(['status' => 'error', 'message' => 'Identificador no válido.']);
            exit();
        }

        $estilo   = floatval($_POST['pnt_estilo'] ?? 0);
        $precis   = floatval($_POST['pnt_precision'] ?? 0);
        $ritmo    = floatval($_POST['pnt_ritmo'] ?? 0);
        $sincro   = floatval($_POST['pnt_sincronizacion'] ?? 0);
        $caidas   = intval($_POST['pen_caida_baston'] ?? 0);
        $invasion = intval($_POST['pen_cruze_padres'] ?? 0);
        $gritos   = intval($_POST['pen_gritos'] ?? 0);

        $total = ($estilo + $precis + $ritmo + $sincro) - (($caidas * 2) + ($invasion * 5) + ($gritos * 1.5));
        if ($total < 0) $total = 0;

        $sqlCalificar = "UPDATE bas_inscripciones_niveles SET 
                            pnt_estilo = '$estilo', pnt_precision = '$precis', pnt_ritmo = '$ritmo', pnt_sincronizacion = '$sincro', 
                            pen_caida_baston = '$caidas', pen_cruze_padres = '$invasion', pen_gritos = '$gritos', 
                            puntaje_final = '$total', calificado = 1 
                         WHERE niv_id = '$niv_id'";
        
        if ($bd->ejecutar($sqlCalificar)) {
            echo json_encode(['status' => 'success', 'message' => 'Puntaje guardado con éxito.']);
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Error al guardar.']);
        }
        exit();
        break;
        
    case 'sortear_orden_salida':
        // Desactivar impresión directa de errores para resguardar la consistencia JSON
        ini_set('display_errors', 0);
        if (!headers_sent()) header('Content-Type: application/json');
        if (ob_get_length()) ob_clean();

        $evp_id = intval($_POST['evp_id'] ?? 0);

        if (empty($evp_id)) {
            echo json_encode(['status' => 'error', 'message' => 'ID de evento no válido.']);
            exit();
        }

        /**
         * Realizamos la ordenación por bloques de edad (Divisiones):
         * - Primero: Categorías que contengan 'INFANTIL'
         * - Segundo: Categorías que contengan 'JUVENIL'
         * - Tercero: Cualquier otra categoría o grupo restante.
         * Dentro de cada uno de estos bloques de edad se aplica RAND() para barajar de forma aleatoria.
         */
        $sqlInscritos = "SELECT bin.niv_id 
                         FROM bas_inscripciones_niveles bin
                         INNER JOIN bas_academias_inscritas bai ON bin.ins_id = bai.ins_id
                         WHERE bai.evp_id = '$evp_id'
                         ORDER BY 
                            CASE 
                                WHEN bin.niv_categoria LIKE '%INFANTIL%' THEN 1
                                WHEN bin.niv_categoria LIKE '%JUVENIL%' THEN 2
                                ELSE 3
                            END ASC,
                            RAND()";
                         
        $res = $bd->ejecutar($sqlInscritos);
        
        if (!$res || $res->num_rows === 0) {
            echo json_encode(['status' => 'error', 'message' => 'No se encontraron inscripciones para ordenar en este evento.']);
            exit();
        }

        $errores = 0;
        $orden_cronograma = 1;

        // Se recorren secuencialmente todos los registros ya ordenados jerárquicamente
        while ($row = $res->fetch_assoc()) {
            $id_nivel = intval($row['niv_id']);
            
            // Asignamos el orden correlativo y reestablecemos el estado de calificación a 0 (No calificado / PENDIENTE)
            $sqlUpd = "UPDATE bas_inscripciones_niveles 
                       SET niv_orden_salida = $orden_cronograma, 
                           calificado = 0 
                       WHERE niv_id = '$id_nivel'";
            
            if (!$bd->ejecutar($sqlUpd)) {
                $errores++;
            }
            $orden_cronograma++;
        }

        if ($errores === 0) {
            echo json_encode([
                'status' => 'success', 
                'message' => '¡Sorteo completado con éxito! Se estructuraron los bloques (Infantiles primero, luego Juveniles) con un orden consecutivo en estado PENDIENTE.'
            ]);
        } else {
            echo json_encode([
                'status' => 'warning', 
                'message' => "El sorteo se procesó, pero ocurrieron $errores errores al guardar los cambios en la base de datos."
            ]);
        }
        exit();
        break;
}
?>