<?php
// concurso_nobel/admin/concursos.php
// Administración de concursos NOBEX.
// Crea concurso, grados participantes, salones y códigos.
// Cada grado puede activarse/desactivarse según si participa o no.
// Solo permite acceso con códigos que tengan puede_administrar = 1.

declare(strict_types=1);

/*
|--------------------------------------------------------------------------
| DEPURACIÓN CONTROLADA
|--------------------------------------------------------------------------
| Mantener en false en producción para no exponer rutas, SQL, POST ni SESSION.
*/
const ADMIN_CONCURSOS_DEBUG = false;
const ADMIN_CAPACIDAD_SALON_MAX = 500;
const ADMIN_SALONES_MAX = 30;
const ADMIN_UPLOAD_MAX_BYTES = 5242880;

if (ADMIN_CONCURSOS_DEBUG) {
    ob_start();

    ini_set('display_errors', '1');
    ini_set('display_startup_errors', '1');
    ini_set('log_errors', '1');
    error_reporting(E_ALL);

    mysqli_report(MYSQLI_REPORT_OFF);
}

function admin_debug_text($valor): string
{
    return htmlspecialchars((string)$valor, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

function admin_debug_error_box(string $titulo, string $mensaje, array $datos = []): void
{
    if (!ADMIN_CONCURSOS_DEBUG) {
        http_response_code(500);
        die('Error interno del sistema.');
    }

    http_response_code(500);

    echo '<!doctype html><html lang="es"><head><meta charset="UTF-8">';
    echo '<title>' . admin_debug_text($titulo) . '</title>';
    echo '<meta name="viewport" content="width=device-width, initial-scale=1">';
    echo '<style>
        body{font-family:Arial,Helvetica,sans-serif;background:#f8fafc;margin:0;padding:28px;color:#111827}
        .debug-box{background:#fff;border:2px solid #dc2626;border-radius:16px;padding:22px;max-width:1150px;margin:auto;box-shadow:0 12px 35px rgba(15,23,42,.12)}
        h1{color:#dc2626;margin:0 0 12px;font-size:24px}
        .msg{font-weight:800;margin-bottom:16px;line-height:1.5}
        table{width:100%;border-collapse:collapse;margin-top:14px}
        th,td{border:1px solid #e5e7eb;padding:10px;text-align:left;vertical-align:top}
        th{width:180px;background:#f9fafb}
        pre{background:#111827;color:#f9fafb;padding:14px;border-radius:12px;white-space:pre-wrap;overflow:auto}
        .warn{background:#fef3c7;border:1px solid #fde68a;color:#92400e;border-radius:12px;padding:10px;margin-top:14px;font-weight:800}
    </style></head><body>';
    echo '<div class="debug-box">';
    echo '<h1>' . admin_debug_text($titulo) . '</h1>';
    echo '<div class="msg">' . admin_debug_text($mensaje) . '</div>';

    if (!empty($datos)) {
        echo '<table>';
        foreach ($datos as $clave => $valor) {
            echo '<tr><th>' . admin_debug_text($clave) . '</th><td><pre>' . admin_debug_text($valor) . '</pre></td></tr>';
        }
        echo '</table>';
    }

    echo '<div class="warn">Modo depuración activo. Desactívalo cuando termines: ADMIN_CONCURSOS_DEBUG = false.</div>';
    echo '</div></body></html>';
    exit;
}

function admin_sql_error(mysqli $conn, ?mysqli_stmt $stmt = null): string
{
    $partes = [];

    if ($stmt instanceof mysqli_stmt) {
        $stmtError = mysqli_stmt_error($stmt);
        $stmtErrno = mysqli_stmt_errno($stmt);

        if ($stmtError !== '') {
            $partes[] = 'STMT errno ' . $stmtErrno . ': ' . $stmtError;
        }
    }

    $connError = mysqli_error($conn);
    $connErrno = mysqli_errno($conn);

    if ($connError !== '') {
        $partes[] = 'MYSQL errno ' . $connErrno . ': ' . $connError;
    }

    if (empty($partes)) {
        return '';
    }

    $detalle = implode(' | ', $partes);
    error_log('admin/concursos.php SQL: ' . $detalle);

    if (!ADMIN_CONCURSOS_DEBUG) {
        return '';
    }

    return ' Detalle técnico: ' . $detalle;
}


function admin_lanzar_sql(mysqli $conn, string $mensaje, ?mysqli_stmt $stmt = null): void
{
    throw new RuntimeException($mensaje . admin_sql_error($conn, $stmt));
}

register_shutdown_function(function (): void {
    if (!ADMIN_CONCURSOS_DEBUG) {
        return;
    }

    $error = error_get_last();

    if (!$error) {
        return;
    }

    $fatales = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR];

    if (!in_array((int)$error['type'], $fatales, true)) {
        return;
    }

    while (ob_get_level() > 0) {
        ob_end_clean();
    }

    admin_debug_error_box(
        'Error fatal en PHP',
        (string)$error['message'],
        [
            'Tipo' => (string)$error['type'],
            'Archivo' => (string)$error['file'],
            'Línea' => (string)$error['line'],
            'REQUEST_URI' => (string)($_SERVER['REQUEST_URI'] ?? ''),
            'POST' => print_r($_POST ?? [], true),
            'SESSION' => print_r($_SESSION ?? [], true)
        ]
    );
});


session_start();

require_once __DIR__ . '/../includes/db.php';

date_default_timezone_set('America/Lima');

function admin_h($valor): string
{
    return htmlspecialchars((string)$valor, ENT_QUOTES, 'UTF-8');
}

function admin_redirigir(string $url): void
{
    header('Location: ' . $url);
    exit;
}

function admin_limpiar_sesion(): void
{
    unset(
        $_SESSION['cn_acceso_id'],
        $_SESSION['cn_concurso_id'],
        $_SESSION['cn_grupo_id'],
        $_SESSION['cn_salon_id'],
        $_SESSION['cn_codigo'],
        $_SESSION['cn_responsable'],
        $_SESSION['cn_last_activity'],
        $_SESSION['cn_admin_global'],
        $_SESSION['cn_admin_concurso_trabajo']
    );
}

function admin_tabla_existe(mysqli $conn, string $tabla): bool
{
    $tabla = mysqli_real_escape_string($conn, $tabla);
    $res = @mysqli_query($conn, "SHOW TABLES LIKE '{$tabla}'");
    return $res && mysqli_num_rows($res) > 0;
}

function admin_columna_existe(mysqli $conn, string $tabla, string $columna): bool
{
    $tablaSql = mysqli_real_escape_string($conn, $tabla);
    $columnaSql = mysqli_real_escape_string($conn, $columna);
    $res = @mysqli_query($conn, "SHOW COLUMNS FROM `{$tablaSql}` LIKE '{$columnaSql}'");
    return $res && mysqli_num_rows($res) > 0;
}

function admin_asegurar_columnas_concurso_media(mysqli $conn): void
{
    if (!admin_tabla_existe($conn, 'concursos')) {
        return;
    }

    $columnas = [
        // NUEVO: una sola imagen panorámica para ocupar todo el encabezado del reporte.
        'cabecera_completa' => "ALTER TABLE concursos ADD COLUMN cabecera_completa VARCHAR(255) NULL AFTER descripcion",

        // Compatibilidad: se mantienen estos campos por si existen concursos antiguos con 3 imágenes.
        'logo_principal' => "ALTER TABLE concursos ADD COLUMN logo_principal VARCHAR(255) NULL AFTER cabecera_completa",
        'logo_secundario' => "ALTER TABLE concursos ADD COLUMN logo_secundario VARCHAR(255) NULL AFTER logo_principal",
        'imagen_banner' => "ALTER TABLE concursos ADD COLUMN imagen_banner VARCHAR(255) NULL AFTER logo_secundario"
    ];

    foreach ($columnas as $columna => $sql) {
        if (!admin_columna_existe($conn, 'concursos', $columna)) {
            if (!mysqli_query($conn, $sql)) {
                admin_lanzar_sql($conn, 'No se pudo crear la columna ' . $columna . ' en concursos.');
            }
        }
    }
}

function admin_auditar(
    mysqli $conn,
    ?int $idConcurso,
    ?int $idGrupo,
    ?int $idAcceso,
    ?int $idParticipante,
    string $accion,
    string $detalle
): void {
    if (!admin_tabla_existe($conn, 'concurso_auditoria')) {
        return;
    }

    $ip = $_SERVER['REMOTE_ADDR'] ?? '';
    $ua = $_SERVER['HTTP_USER_AGENT'] ?? '';

    $stmt = mysqli_prepare($conn, "
        INSERT INTO concurso_auditoria
            (id_concurso, id_grupo, id_acceso, id_participante, accion, detalle, ip, user_agent, created_at)
        VALUES
            (?, ?, ?, ?, ?, ?, ?, ?, NOW())
    ");

    if (!$stmt) {
        return;
    }

    mysqli_stmt_bind_param($stmt, 'iiiissss', $idConcurso, $idGrupo, $idAcceso, $idParticipante, $accion, $detalle, $ip, $ua);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
}

function admin_post(string $key, string $default = ''): string
{
    return trim((string)($_POST[$key] ?? $default));
}

function admin_decimal(string $valor, float $default): float
{
    $valor = trim($valor);
    $valor = str_replace(',', '.', $valor);

    if ($valor === '' || !is_numeric($valor)) {
        return $default;
    }

    return round((float)$valor, 2);
}

function admin_int(string $valor, int $default): int
{
    $valor = trim($valor);

    if ($valor === '' || !preg_match('/^\d+$/', $valor)) {
        return $default;
    }

    return (int)$valor;
}

function admin_codigo_prefijo(string $valor): string
{
    $valor = strtoupper(trim($valor));
    $valor = preg_replace('/[^A-Z0-9]/', '', $valor);
    return substr((string)$valor, 0, 20);
}

function admin_codigo_grado(string $nivel, int $gradoOrden): string
{
    if ($nivel === 'INICIAL') {
        return 'INI-' . $gradoOrden;
    }

    if ($nivel === 'PRIMARIA') {
        return 'PRI-' . $gradoOrden;
    }

    return 'SEC-' . $gradoOrden;
}

function admin_letra_salon(int $indice): string
{
    // 0=A, 1=B, ... 25=Z, 26=AA, 27=AB...
    $indice++;
    $letra = '';

    while ($indice > 0) {
        $mod = ($indice - 1) % 26;
        $letra = chr(65 + $mod) . $letra;
        $indice = intdiv($indice - $mod - 1, 26);
    }

    return $letra;
}

function admin_subir_imagen_concurso(string $campo, string $prefijoArchivo): ?string
{
    if (!isset($_FILES[$campo]) || !is_array($_FILES[$campo])) {
        return null;
    }

    $file = $_FILES[$campo];

    if ((int)($file['error'] ?? UPLOAD_ERR_NO_FILE) === UPLOAD_ERR_NO_FILE) {
        return null;
    }

    if ((int)$file['error'] !== UPLOAD_ERR_OK) {
        throw new RuntimeException('No se pudo subir la imagen ' . $campo . '. Código de error: ' . (int)$file['error']);
    }

    if ((int)$file['size'] <= 0 || (int)$file['size'] > ADMIN_UPLOAD_MAX_BYTES) {
        throw new RuntimeException('La imagen ' . $campo . ' debe pesar como máximo 5 MB.');
    }

    $nombreOriginal = (string)($file['name'] ?? '');
    $extension = strtolower(pathinfo($nombreOriginal, PATHINFO_EXTENSION));
    $permitidas = ['jpg', 'jpeg', 'png', 'webp'];

    if (!in_array($extension, $permitidas, true)) {
        throw new RuntimeException('La imagen ' . $campo . ' debe ser JPG, PNG o WEBP.');
    }

    $tmp = (string)($file['tmp_name'] ?? '');

    if ($tmp === '' || !is_uploaded_file($tmp)) {
        throw new RuntimeException('Archivo temporal inválido para ' . $campo . '.');
    }

    $info = @getimagesize($tmp);

    if ($info === false) {
        throw new RuntimeException('El archivo ' . $campo . ' no parece ser una imagen válida.');
    }

    $dirAbs = __DIR__ . '/../uploads/concursos';

    if (!is_dir($dirAbs) && !mkdir($dirAbs, 0775, true)) {
        throw new RuntimeException('No se pudo crear la carpeta uploads/concursos.');
    }

    $prefijoArchivo = preg_replace('/[^A-Za-z0-9_\-]/', '_', $prefijoArchivo);
    $nombreFinal = $prefijoArchivo . '_' . date('Ymd_His') . '_' . bin2hex(random_bytes(4)) . '.' . $extension;
    $destinoAbs = $dirAbs . '/' . $nombreFinal;

    if (!move_uploaded_file($tmp, $destinoAbs)) {
        throw new RuntimeException('No se pudo guardar la imagen ' . $campo . '.');
    }

    return 'uploads/concursos/' . $nombreFinal;
}

function admin_grados_base(): array
{
    return [
        ['key' => 'ini_2', 'nivel' => 'INICIAL', 'grado_orden' => 2, 'grado_nombre' => '2 AÑOS', 'nombre' => 'INICIAL 2 AÑOS', 'preguntas' => 15, 'buena' => 20.00, 'mala' => 4.00],
        ['key' => 'ini_3', 'nivel' => 'INICIAL', 'grado_orden' => 3, 'grado_nombre' => '3 AÑOS', 'nombre' => 'INICIAL 3 AÑOS', 'preguntas' => 15, 'buena' => 20.00, 'mala' => 4.00],
        ['key' => 'ini_4', 'nivel' => 'INICIAL', 'grado_orden' => 4, 'grado_nombre' => '4 AÑOS', 'nombre' => 'INICIAL 4 AÑOS', 'preguntas' => 15, 'buena' => 20.00, 'mala' => 4.00],
        ['key' => 'ini_5', 'nivel' => 'INICIAL', 'grado_orden' => 5, 'grado_nombre' => '5 AÑOS', 'nombre' => 'INICIAL 5 AÑOS', 'preguntas' => 15, 'buena' => 20.00, 'mala' => 4.00],

        ['key' => 'pri_1', 'nivel' => 'PRIMARIA', 'grado_orden' => 1, 'grado_nombre' => '1°', 'nombre' => '1° PRIMARIA', 'preguntas' => 15, 'buena' => 10.00, 'mala' => 2.00],
        ['key' => 'pri_2', 'nivel' => 'PRIMARIA', 'grado_orden' => 2, 'grado_nombre' => '2°', 'nombre' => '2° PRIMARIA', 'preguntas' => 15, 'buena' => 10.00, 'mala' => 2.00],
        ['key' => 'pri_3', 'nivel' => 'PRIMARIA', 'grado_orden' => 3, 'grado_nombre' => '3°', 'nombre' => '3° PRIMARIA', 'preguntas' => 15, 'buena' => 10.00, 'mala' => 2.00],
        ['key' => 'pri_4', 'nivel' => 'PRIMARIA', 'grado_orden' => 4, 'grado_nombre' => '4°', 'nombre' => '4° PRIMARIA', 'preguntas' => 15, 'buena' => 10.00, 'mala' => 2.00],
        ['key' => 'pri_5', 'nivel' => 'PRIMARIA', 'grado_orden' => 5, 'grado_nombre' => '5°', 'nombre' => '5° PRIMARIA', 'preguntas' => 15, 'buena' => 10.00, 'mala' => 2.00],
        ['key' => 'pri_6', 'nivel' => 'PRIMARIA', 'grado_orden' => 6, 'grado_nombre' => '6°', 'nombre' => '6° PRIMARIA', 'preguntas' => 15, 'buena' => 10.00, 'mala' => 2.00],

        ['key' => 'sec_1', 'nivel' => 'SECUNDARIA', 'grado_orden' => 1, 'grado_nombre' => '1°', 'nombre' => '1° SECUNDARIA', 'preguntas' => 15, 'buena' => 10.00, 'mala' => 2.00],
        ['key' => 'sec_2', 'nivel' => 'SECUNDARIA', 'grado_orden' => 2, 'grado_nombre' => '2°', 'nombre' => '2° SECUNDARIA', 'preguntas' => 15, 'buena' => 10.00, 'mala' => 2.00],
        ['key' => 'sec_3', 'nivel' => 'SECUNDARIA', 'grado_orden' => 3, 'grado_nombre' => '3°', 'nombre' => '3° SECUNDARIA', 'preguntas' => 15, 'buena' => 10.00, 'mala' => 2.00],
        ['key' => 'sec_4', 'nivel' => 'SECUNDARIA', 'grado_orden' => 4, 'grado_nombre' => '4°', 'nombre' => '4° SECUNDARIA', 'preguntas' => 15, 'buena' => 10.00, 'mala' => 2.00],
        ['key' => 'sec_5', 'nivel' => 'SECUNDARIA', 'grado_orden' => 5, 'grado_nombre' => '5°', 'nombre' => '5° SECUNDARIA', 'preguntas' => 15, 'buena' => 10.00, 'mala' => 2.00],
    ];
}

function admin_insertar_concurso(
    mysqli $conn,
    string $nombre,
    string $subtitulo,
    int $anio,
    string $descripcion,
    ?string $cabeceraCompleta,
    ?string $logoPrincipal,
    ?string $logoSecundario,
    ?string $imagenBanner,
    int $totalDefault,
    float $correctaDefault,
    float $incorrectaDefault,
    float $blancoDefault,
    ?string $fechaInicio,
    ?string $fechaFin,
    string $estado
): int {
    $stmt = mysqli_prepare($conn, "
        INSERT INTO concursos
            (
                nombre,
                subtitulo,
                anio,
                descripcion,
                cabecera_completa,
                logo_principal,
                logo_secundario,
                imagen_banner,
                total_preguntas_default,
                puntos_correcta_default,
                penalizacion_incorrecta_default,
                puntos_blanco_default,
                fecha_inicio,
                fecha_fin,
                estado,
                created_at
            )
        VALUES
            (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())
    ");

    if (!$stmt) {
        admin_lanzar_sql($conn, 'No se pudo preparar el registro del concurso.');
    }

    mysqli_stmt_bind_param(
        $stmt,
        'ssisssssidddsss',
        $nombre,
        $subtitulo,
        $anio,
        $descripcion,
        $cabeceraCompleta,
        $logoPrincipal,
        $logoSecundario,
        $imagenBanner,
        $totalDefault,
        $correctaDefault,
        $incorrectaDefault,
        $blancoDefault,
        $fechaInicio,
        $fechaFin,
        $estado
    );

    if (!mysqli_stmt_execute($stmt)) {
        mysqli_stmt_close($stmt);
        admin_lanzar_sql($conn, 'No se pudo crear el concurso.', $stmt);
    }

    mysqli_stmt_close($stmt);
    return (int)mysqli_insert_id($conn);
}

function admin_insertar_grupo(
    mysqli $conn,
    int $idConcurso,
    string $nivel,
    int $gradoOrden,
    string $gradoNombre,
    string $nombre,
    int $totalPreguntas,
    float $puntosCorrecta,
    float $penalizacionIncorrecta,
    float $puntosBlanco,
    int $orden
): int {
    $stmt = mysqli_prepare($conn, "
        INSERT INTO concurso_grupos
            (
                id_concurso,
                nivel,
                grado_orden,
                grado_nombre,
                nombre,
                total_preguntas,
                puntos_correcta,
                penalizacion_incorrecta,
                puntos_blanco,
                orden,
                estado,
                created_at
            )
        VALUES
            (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, NOW())
    ");

    if (!$stmt) {
        admin_lanzar_sql($conn, 'No se pudo preparar el registro del grupo.');
    }

    mysqli_stmt_bind_param(
        $stmt,
        'isissidddi',
        $idConcurso,
        $nivel,
        $gradoOrden,
        $gradoNombre,
        $nombre,
        $totalPreguntas,
        $puntosCorrecta,
        $penalizacionIncorrecta,
        $puntosBlanco,
        $orden
    );

    if (!mysqli_stmt_execute($stmt)) {
        $error = mysqli_stmt_error($stmt);
        mysqli_stmt_close($stmt);
        admin_lanzar_sql($conn, 'No se pudo crear el grado ' . $nombre . '.', $stmt);
    }

    mysqli_stmt_close($stmt);
    return (int)mysqli_insert_id($conn);
}

function admin_insertar_salon(
    mysqli $conn,
    int $idConcurso,
    int $idGrupo,
    string $codigoSalon,
    string $nombreSalon,
    string $letraSalon,
    int $capacidad,
    int $orden
): int {
    $stmt = mysqli_prepare($conn, "
        INSERT INTO concurso_salones
            (
                id_concurso,
                id_grupo,
                codigo_salon,
                nombre_salon,
                letra_salon,
                capacidad,
                orden,
                estado,
                created_at
            )
        VALUES
            (?, ?, ?, ?, ?, ?, ?, 1, NOW())
    ");

    if (!$stmt) {
        admin_lanzar_sql($conn, 'No se pudo preparar el registro del salón.');
    }

    mysqli_stmt_bind_param(
        $stmt,
        'iisssii',
        $idConcurso,
        $idGrupo,
        $codigoSalon,
        $nombreSalon,
        $letraSalon,
        $capacidad,
        $orden
    );

    if (!mysqli_stmt_execute($stmt)) {
        $error = mysqli_stmt_error($stmt);
        mysqli_stmt_close($stmt);
        admin_lanzar_sql($conn, 'No se pudo crear el salón ' . $codigoSalon . '.', $stmt);
    }

    mysqli_stmt_close($stmt);
    return (int)mysqli_insert_id($conn);
}

function admin_insertar_acceso(
    mysqli $conn,
    int $idConcurso,
    ?int $idGrupo,
    ?int $idSalon,
    string $codigo,
    string $responsable,
    string $tipo,
    int $puedeParticipantes,
    int $puedeCalificaciones,
    int $puedeVer,
    int $puedeAdministrar,
    ?string $fechaExpiracion
): int {
    $stmt = mysqli_prepare($conn, "
        INSERT INTO concurso_accesos
            (
                id_concurso,
                id_grupo,
                id_salon,
                codigo,
                nombre_responsable,
                tipo_acceso,
                puede_registrar_participantes,
                puede_registrar_resultados,
                puede_ver_resultados,
                puede_administrar,
                activo,
                fecha_expiracion,
                created_at
            )
        VALUES
            (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?, NOW())
    ");

    if (!$stmt) {
        admin_lanzar_sql($conn, 'No se pudo preparar el registro del acceso.');
    }

    mysqli_stmt_bind_param(
        $stmt,
        'iiisssiiiis',
        $idConcurso,
        $idGrupo,
        $idSalon,
        $codigo,
        $responsable,
        $tipo,
        $puedeParticipantes,
        $puedeCalificaciones,
        $puedeVer,
        $puedeAdministrar,
        $fechaExpiracion
    );

    if (!mysqli_stmt_execute($stmt)) {
        $error = mysqli_stmt_error($stmt);
        mysqli_stmt_close($stmt);
        admin_lanzar_sql($conn, 'No se pudo crear el código ' . $codigo . '.', $stmt);
    }

    mysqli_stmt_close($stmt);
    return (int)mysqli_insert_id($conn);
}

function admin_codigo_existe(mysqli $conn, string $codigo): bool
{
    $stmt = mysqli_prepare($conn, "
        SELECT id_acceso
        FROM concurso_accesos
        WHERE codigo = ?
        LIMIT 1
    ");

    if (!$stmt) {
        admin_lanzar_sql($conn, 'No se pudo preparar la verificación del código ' . $codigo . '.');
    }

    mysqli_stmt_bind_param($stmt, 's', $codigo);
    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);
    $existe = mysqli_fetch_assoc($res);
    mysqli_stmt_close($stmt);

    return (bool)$existe;
}

$idAccesoSesion = (int)($_SESSION['cn_acceso_id'] ?? 0);
$idConcursoSesion = (int)($_SESSION['cn_concurso_id'] ?? 0);

if ($idAccesoSesion <= 0) {
    admin_redirigir('../index.php');
}

$ultimaActividad = (int)($_SESSION['cn_last_activity'] ?? 0);

if ($ultimaActividad > 0 && (time() - $ultimaActividad) > 10800) {
    admin_auditar(
        $conn,
        $idConcursoSesion > 0 ? $idConcursoSesion : null,
        null,
        $idAccesoSesion,
        null,
        'SESION_EXPIRADA_ADMIN',
        'Sesión expirada en administración de concursos.'
    );

    admin_limpiar_sesion();
    admin_redirigir('../index.php');
}

$stmtAcceso = mysqli_prepare($conn, "
    SELECT
        a.*,
        c.nombre AS concurso_nombre,
        c.subtitulo AS concurso_subtitulo,
        c.estado AS concurso_estado,
        c.fecha_inicio,
        c.fecha_fin
    FROM concurso_accesos a
    LEFT JOIN concursos c ON c.id_concurso = a.id_concurso
    WHERE a.id_acceso = ?
    LIMIT 1
");

if (!$stmtAcceso) {
    http_response_code(500);
    admin_debug_error_box('Error SQL', 'No se pudo validar el acceso administrativo.', ['MySQL' => admin_sql_error($conn)]);
}

mysqli_stmt_bind_param($stmtAcceso, 'i', $idAccesoSesion);
mysqli_stmt_execute($stmtAcceso);
$resAcceso = mysqli_stmt_get_result($stmtAcceso);
$acceso = mysqli_fetch_assoc($resAcceso);
mysqli_stmt_close($stmtAcceso);

if (!$acceso) {
    admin_limpiar_sesion();
    admin_redirigir('../index.php');
}

$hoy = date('Y-m-d');
$tipoAccesoActual = strtoupper((string)($acceso['tipo_acceso'] ?? ''));
$esAdminGlobal = $tipoAccesoActual === 'ADMIN_GLOBAL' || (int)($_SESSION['cn_admin_global'] ?? 0) === 1;
$idConcursoAcceso = $acceso['id_concurso'] !== null ? (int)$acceso['id_concurso'] : 0;

if ((int)$acceso['activo'] !== 1) {
    admin_limpiar_sesion();
    admin_redirigir('../index.php');
}

if (!empty($acceso['fecha_expiracion']) && $hoy > $acceso['fecha_expiracion']) {
    admin_limpiar_sesion();
    admin_redirigir('../index.php');
}

if (!$esAdminGlobal) {
    if ($idConcursoAcceso <= 0) {
        admin_limpiar_sesion();
        admin_redirigir('../index.php');
    }

    if (
        strtoupper((string)$acceso['concurso_estado']) !== 'ACTIVO' ||
        (!empty($acceso['fecha_inicio']) && $hoy < $acceso['fecha_inicio']) ||
        (!empty($acceso['fecha_fin']) && $hoy > $acceso['fecha_fin'])
    ) {
        admin_limpiar_sesion();
        admin_redirigir('../index.php');
    }
}

if ((int)$acceso['puede_administrar'] !== 1) {
    http_response_code(403);
    die('Acceso denegado. Este código no tiene permiso administrativo.');
}

$_SESSION['cn_last_activity'] = time();
$_SESSION['cn_admin_global'] = $esAdminGlobal ? 1 : 0;

if (empty($_SESSION['csrf_admin_concursos'])) {
    $_SESSION['csrf_admin_concursos'] = bin2hex(random_bytes(32));
}

$csrf = (string)$_SESSION['csrf_admin_concursos'];
$mensajeOk = '';
$mensajeError = '';
$codigosCreados = [];

try {
    admin_asegurar_columnas_concurso_media($conn);
} catch (Throwable $e) {
    error_log('admin/concursos.php columnas media: ' . $e->getMessage());
    $mensajeError = ADMIN_CONCURSOS_DEBUG
        ? $e->getMessage()
        : 'No se pudo preparar la tabla concursos para guardar imágenes. Revisa permisos de base de datos.';
}

$gradosBase = admin_grados_base();

$valores = [
    'nombre' => 'II Concurso Interno de Conocimientos',
    'subtitulo' => 'NOBEX ' . date('Y'),
    'anio' => (string)date('Y'),
    'descripcion' => 'Concurso de conocimientos organizado por Colegio Nobel Ingenieros.',
    'fecha_inicio' => date('Y-m-d'),
    'fecha_fin' => date('Y-m-d', strtotime('+30 days')),
    'estado' => 'ACTIVO',
    'prefijo_codigo' => 'NOBEX' . date('Y'),
    'puntos_blanco' => '0.00',
    'capacidad_salon' => '30',
    'cantidad_salones' => '4'
];

foreach ($gradosBase as $grado) {
    $key = $grado['key'];
    $valores['participa_' . $key] = '1';
    $valores['preguntas_' . $key] = (string)$grado['preguntas'];
    $valores['buena_' . $key] = number_format((float)$grado['buena'], 2, '.', '');
    $valores['mala_' . $key] = number_format((float)$grado['mala'], 2, '.', '');
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && $mensajeError === '') {
    $camposTexto = [
        'nombre',
        'subtitulo',
        'anio',
        'descripcion',
        'fecha_inicio',
        'fecha_fin',
        'estado',
        'prefijo_codigo',
        'puntos_blanco',
        'capacidad_salon',
        'cantidad_salones'
    ];

    foreach ($camposTexto as $campo) {
        $valores[$campo] = admin_post($campo, $valores[$campo]);
    }

    foreach ($gradosBase as $grado) {
        $key = $grado['key'];
        $valores['participa_' . $key] = isset($_POST['participa_' . $key]) && (string)$_POST['participa_' . $key] === '1' ? '1' : '0';
        $valores['preguntas_' . $key] = admin_post('preguntas_' . $key, $valores['preguntas_' . $key]);
        $valores['buena_' . $key] = admin_post('buena_' . $key, $valores['buena_' . $key]);
        $valores['mala_' . $key] = admin_post('mala_' . $key, $valores['mala_' . $key]);
    }

    $csrfPost = admin_post('csrf_token');

    $nombre = admin_post('nombre');
    $subtitulo = admin_post('subtitulo');
    $anio = admin_int(admin_post('anio'), (int)date('Y'));
    $descripcion = admin_post('descripcion');
    $fechaInicio = admin_post('fecha_inicio') !== '' ? admin_post('fecha_inicio') : null;
    $fechaFin = admin_post('fecha_fin') !== '' ? admin_post('fecha_fin') : null;
    $estado = admin_post('estado', 'ACTIVO');
    $prefijoCodigo = admin_codigo_prefijo(admin_post('prefijo_codigo'));
    $puntosBlanco = admin_decimal(admin_post('puntos_blanco'), 0.00);
    $capacidadSalon = admin_int(admin_post('capacidad_salon'), 30);
    $cantidadSalones = admin_int(admin_post('cantidad_salones'), 4);

    $configGrados = [];

    foreach ($gradosBase as $grado) {
        $key = $grado['key'];
        $participa = isset($_POST['participa_' . $key]) && (string)$_POST['participa_' . $key] === '1';

        if (!$participa) {
            continue;
        }

        $preguntas = admin_int(admin_post('preguntas_' . $key), (int)$grado['preguntas']);
        $buena = admin_decimal(admin_post('buena_' . $key), (float)$grado['buena']);
        $mala = admin_decimal(admin_post('mala_' . $key), (float)$grado['mala']);

        $configGrados[] = [
            'key' => $key,
            'nivel' => $grado['nivel'],
            'grado_orden' => (int)$grado['grado_orden'],
            'grado_nombre' => $grado['grado_nombre'],
            'nombre' => $grado['nombre'],
            'preguntas' => $preguntas,
            'buena' => $buena,
            'mala' => $mala
        ];
    }

    if (!hash_equals($csrf, $csrfPost)) {
        $mensajeError = 'Solicitud no válida. Recarga la página.';
    } elseif ($nombre === '') {
        $mensajeError = 'Ingresa el nombre del concurso.';
    } elseif ($subtitulo === '') {
        $mensajeError = 'Ingresa el subtítulo del concurso.';
    } elseif ($anio < 2020 || $anio > 2100) {
        $mensajeError = 'El año no es válido.';
    } elseif ($prefijoCodigo === '') {
        $mensajeError = 'Ingresa un prefijo de códigos. Ejemplo: NOBEX2025.';
    } elseif (strlen($prefijoCodigo) < 4 || strlen($prefijoCodigo) > 20) {
        $mensajeError = 'El prefijo debe tener entre 4 y 20 caracteres.';
    } elseif ($fechaInicio !== null && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $fechaInicio)) {
        $mensajeError = 'Fecha de inicio inválida.';
    } elseif ($fechaFin !== null && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $fechaFin)) {
        $mensajeError = 'Fecha de fin inválida.';
    } elseif ($fechaInicio !== null && $fechaFin !== null && $fechaFin < $fechaInicio) {
        $mensajeError = 'La fecha fin no puede ser menor que la fecha inicio.';
    } elseif (!in_array($estado, ['BORRADOR', 'ACTIVO', 'CERRADO', 'ANULADO'], true)) {
        $mensajeError = 'Estado inválido.';
    } elseif ($capacidadSalon <= 0 || $capacidadSalon > ADMIN_CAPACIDAD_SALON_MAX) {
        $mensajeError = 'La capacidad por salón debe estar entre 1 y ' . ADMIN_CAPACIDAD_SALON_MAX . '.';
    } elseif ($cantidadSalones < 1 || $cantidadSalones > ADMIN_SALONES_MAX) {
        $mensajeError = 'La cantidad de salones debe estar entre 1 y ' . ADMIN_SALONES_MAX . '.';
    } elseif (empty($configGrados)) {
        $mensajeError = 'Debes seleccionar al menos un grado participante.';
    } elseif (admin_codigo_existe($conn, 'ADMIN-' . $prefijoCodigo)) {
        $mensajeError = 'Ya existe el código ADMIN-' . $prefijoCodigo . '. Usa otro prefijo.';
    } else {
        foreach ($configGrados as $cfg) {
            if ((int)$cfg['preguntas'] <= 0) {
                $mensajeError = 'Las preguntas de ' . $cfg['nombre'] . ' deben ser mayor a cero.';
                break;
            }

            if ((float)$cfg['buena'] <= 0) {
                $mensajeError = 'El puntaje por buena de ' . $cfg['nombre'] . ' debe ser mayor a cero.';
                break;
            }

            if ((float)$cfg['mala'] < 0) {
                $mensajeError = 'La penalización por mala de ' . $cfg['nombre'] . ' no puede ser negativa.';
                break;
            }
        }

        if ($mensajeError === '') {
            $fechaExpiracion = $fechaFin ?: date('Y-m-d', strtotime('+365 days'));

            try {
                mysqli_begin_transaction($conn);

                $primerGrado = $configGrados[0];

                // Ahora el concurso usa UNA SOLA IMAGEN panorámica para la cabecera del reporte.
                $cabeceraCompleta = admin_subir_imagen_concurso('cabecera_completa', $prefijoCodigo . '_cabecera_completa');

                // Compatibilidad con concursos antiguos: estos campos se dejan en NULL al crear un concurso nuevo.
                $logoPrincipal = null;
                $logoSecundario = null;
                $imagenBanner = null;

                $idNuevoConcurso = admin_insertar_concurso(
                    $conn,
                    $nombre,
                    $subtitulo,
                    $anio,
                    $descripcion,
                    $cabeceraCompleta,
                    $logoPrincipal,
                    $logoSecundario,
                    $imagenBanner,
                    (int)$primerGrado['preguntas'],
                    (float)$primerGrado['buena'],
                    (float)$primerGrado['mala'],
                    $puntosBlanco,
                    $fechaInicio,
                    $fechaFin,
                    $estado
                );

                admin_insertar_acceso($conn, $idNuevoConcurso, null, null, 'ADMIN-' . $prefijoCodigo, 'Administrador ' . $subtitulo, 'ADMIN', 1, 1, 1, 1, $fechaExpiracion);
                admin_insertar_acceso($conn, $idNuevoConcurso, null, null, 'REG-' . $prefijoCodigo, 'Registrador general ' . $subtitulo, 'REGISTRADOR', 1, 1, 1, 0, $fechaExpiracion);
                admin_insertar_acceso($conn, $idNuevoConcurso, null, null, 'RES-' . $prefijoCodigo, 'Consulta de resultados ' . $subtitulo, 'RESULTADOS', 0, 0, 1, 0, $fechaExpiracion);

                $codigosCreados[] = 'ADMIN-' . $prefijoCodigo;
                $codigosCreados[] = 'REG-' . $prefijoCodigo;
                $codigosCreados[] = 'RES-' . $prefijoCodigo;

                $ordenGrupo = 1;

                foreach ($configGrados as $grado) {
                    $idGrupo = admin_insertar_grupo(
                        $conn,
                        $idNuevoConcurso,
                        $grado['nivel'],
                        (int)$grado['grado_orden'],
                        $grado['grado_nombre'],
                        $grado['nombre'],
                        (int)$grado['preguntas'],
                        (float)$grado['buena'],
                        (float)$grado['mala'],
                        $puntosBlanco,
                        $ordenGrupo
                    );

                    $codigoBaseGrado = admin_codigo_grado($grado['nivel'], (int)$grado['grado_orden']);

                    for ($i = 0; $i < $cantidadSalones; $i++) {
                        $letra = admin_letra_salon($i);
                        $codigoSalon = $prefijoCodigo . '-' . $codigoBaseGrado . '-' . $letra;
                        $nombreSalon = 'SALÓN ' . $letra;

                        $idSalon = admin_insertar_salon(
                            $conn,
                            $idNuevoConcurso,
                            $idGrupo,
                            $codigoSalon,
                            $nombreSalon,
                            $letra,
                            $capacidadSalon,
                            $i + 1
                        );

                        admin_insertar_acceso(
                            $conn,
                            $idNuevoConcurso,
                            $idGrupo,
                            $idSalon,
                            $codigoSalon,
                            'Responsable ' . $grado['nombre'] . ' - ' . $nombreSalon,
                            'SALON',
                            1,
                            1,
                            1,
                            0,
                            $fechaExpiracion
                        );

                        $codigosCreados[] = $codigoSalon;
                    }

                    $ordenGrupo++;
                }

                admin_auditar(
                    $conn,
                    $idNuevoConcurso,
                    null,
                    $idAccesoSesion,
                    null,
                    'CONCURSO_CREADO',
                    'Concurso creado con grados participantes seleccionados: ' . $nombre . ' ' . $subtitulo . ' con prefijo ' . $prefijoCodigo
                );

                mysqli_commit($conn);

                $_SESSION['csrf_admin_concursos'] = bin2hex(random_bytes(32));
                $csrf = (string)$_SESSION['csrf_admin_concursos'];

                $mensajeOk = 'Concurso creado correctamente. Se guardaron los grados, salones, códigos y la cabecera cargada.';
            } catch (Throwable $e) {
                mysqli_rollback($conn);
                error_log('admin/concursos.php: ' . $e->getMessage() . ' en ' . $e->getFile() . ':' . $e->getLine());

                $mensajeError = ADMIN_CONCURSOS_DEBUG
                    ? $e->getMessage() . "\nArchivo: " . $e->getFile() . "\nLínea: " . $e->getLine() . "\nTrace:\n" . $e->getTraceAsString()
                    : 'No se pudo completar la operación. Revisa el log del servidor.';

                $codigosCreados = [];
            }
        }
    }
}

$concursos = [];
$errorListadoConcursos = '';

$sqlConcursos = "
    SELECT
        c.id_concurso,
        c.nombre,
        c.subtitulo,
        c.anio,
        c.estado,
        c.fecha_inicio,
        c.fecha_fin,
        c.cabecera_completa,
        c.logo_principal,
        c.logo_secundario,
        c.imagen_banner,
        (
            SELECT COUNT(*)
            FROM concurso_grupos g
            WHERE g.id_concurso = c.id_concurso
        ) AS total_grados,
        (
            SELECT COUNT(*)
            FROM concurso_salones s
            WHERE s.id_concurso = c.id_concurso
        ) AS total_salones,
        (
            SELECT COUNT(*)
            FROM concurso_accesos a
            WHERE a.id_concurso = c.id_concurso
        ) AS total_codigos,
        (
            SELECT COUNT(*)
            FROM concurso_participantes p
            WHERE p.id_concurso = c.id_concurso
              AND p.estado = 'ACTIVO'
        ) AS total_participantes
    FROM concursos c
    ORDER BY c.id_concurso DESC
";

$resConcursos = mysqli_query($conn, $sqlConcursos);

if ($resConcursos instanceof mysqli_result) {
    while ($row = mysqli_fetch_assoc($resConcursos)) {
        $concursos[] = $row;
    }

    mysqli_free_result($resConcursos);
} else {
    $errorListadoConcursos = 'No se pudo cargar el listado de concursos.' . admin_sql_error($conn);

    if (ADMIN_CONCURSOS_DEBUG) {
        $errorListadoConcursos .= "\nSQL ejecutado:\n" . $sqlConcursos;
    }
}

$idConcursoMenu = (int)($_SESSION['cn_admin_concurso_trabajo'] ?? $idConcursoAcceso);

?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Administrar concursos | NOBEX</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Bootstrap Icons + Font Awesome + SweetAlert2 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css">
    <link rel="stylesheet" href="../assets/css/menu_concurso.css?v=4">
    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>

    <style>
        *{box-sizing:border-box}

        :root{
            --red:#dc2626;
            --red-dark:#991b1b;
            --yellow:#facc15;
            --blue:#1d4ed8;
            --green:#16a34a;
            --orange:#ea580c;
            --slate:#0f172a;
            --muted:#64748b;
            --line:#e2e8f0;
            --soft:#f8fafc;
            --card:#ffffff;
        }

        body{
            margin:0;
            font-family:Inter,Arial,Helvetica,sans-serif;
            background:linear-gradient(135deg,#f8fafc 0%,#eef2ff 45%,#fff7ed 100%);
            color:#111827;
        }

        .topbar{
            background:
                radial-gradient(circle at top left,rgba(250,204,21,.25),transparent 28%),
                linear-gradient(135deg,#0f172a,#1f2937);
            color:#fff;
            border-bottom:6px solid var(--yellow);
            padding:22px;
            box-shadow:0 18px 45px rgba(15,23,42,.24);
        }

        .topbar-inner{
            max-width:1440px;
            margin:0 auto;
            display:flex;
            justify-content:space-between;
            gap:16px;
            align-items:center;
        }

        .brand-block{
            display:flex;
            align-items:center;
            gap:14px;
        }

        .brand-icon{
            width:52px;
            height:52px;
            border-radius:17px;
            display:flex;
            align-items:center;
            justify-content:center;
            background:rgba(255,255,255,.12);
            border:1px solid rgba(255,255,255,.22);
            font-size:24px;
        }

        .topbar h1{
            margin:0;
            font-size:27px;
            font-weight:950;
            letter-spacing:-.035em;
        }

        .topbar p{
            margin:6px 0 0;
            color:#fde68a;
            font-weight:900;
            font-size:14px;
        }

        .btn-back{
            color:#fff;
            text-decoration:none;
            border:1px solid rgba(255,255,255,.35);
            border-radius:15px;
            padding:12px 16px;
            font-weight:900;
            white-space:nowrap;
            display:inline-flex;
            align-items:center;
            gap:8px;
            background:rgba(255,255,255,.10);
        }

        .btn-back:hover{background:rgba(255,255,255,.18)}

        .container{
            max-width:1440px;
            margin:24px auto;
            padding:0 18px 42px;
        }

        .notice{
            border-radius:17px;
            padding:14px 16px;
            margin-bottom:16px;
            font-weight:900;
            line-height:1.45;
            display:flex;
            align-items:flex-start;
            gap:10px;
            box-shadow:0 8px 18px rgba(15,23,42,.06);
        }

        .notice i{margin-top:2px;font-size:18px}
        .notice-ok{background:#dcfce7;color:#166534;border:1px solid #bbf7d0}
        .notice-error{background:#fee2e2;color:#991b1b;border:1px solid #fecaca;white-space:pre-wrap}
        .notice-info{background:#eff6ff;color:#1e40af;border:1px solid #bfdbfe}

        .page-summary{
            display:grid;
            grid-template-columns:repeat(4,1fr);
            gap:14px;
            margin-bottom:20px;
        }

        .summary-card{
            background:rgba(255,255,255,.94);
            border:1px solid rgba(226,232,240,.95);
            border-radius:22px;
            padding:16px;
            display:flex;
            align-items:center;
            gap:12px;
            box-shadow:0 14px 32px rgba(15,23,42,.08);
        }

        .summary-icon{
            width:44px;
            height:44px;
            border-radius:16px;
            display:flex;
            align-items:center;
            justify-content:center;
            font-size:20px;
            flex:0 0 auto;
        }

        .summary-card strong{
            display:block;
            font-size:22px;
            line-height:1;
            color:#0f172a;
        }

        .summary-card span{
            display:block;
            color:#64748b;
            font-size:12px;
            font-weight:900;
            text-transform:uppercase;
            margin-top:5px;
        }

        .icon-blue{background:#dbeafe;color:#1d4ed8}
        .icon-green{background:#dcfce7;color:#166534}
        .icon-yellow{background:#fef3c7;color:#92400e}
        .icon-red{background:#fee2e2;color:#991b1b}

        .grid{
            display:grid;
            grid-template-columns:minmax(440px,570px) 1fr;
            gap:20px;
            align-items:start;
        }

        .card{
            background:rgba(255,255,255,.95);
            border:1px solid rgba(226,232,240,.95);
            border-radius:26px;
            padding:24px;
            box-shadow:0 20px 45px rgba(15,23,42,.10);
            backdrop-filter:blur(8px);
            margin-bottom:20px;
        }

        .card-header{
            display:flex;
            justify-content:space-between;
            align-items:center;
            gap:14px;
            margin-bottom:18px;
        }

        .card-title{
            display:flex;
            align-items:center;
            gap:12px;
        }

        .card-icon{
            width:44px;
            height:44px;
            border-radius:16px;
            display:flex;
            align-items:center;
            justify-content:center;
            background:#fee2e2;
            color:#dc2626;
            font-size:20px;
            flex:0 0 auto;
        }

        .card h2{
            margin:0;
            font-size:22px;
            font-weight:950;
            letter-spacing:-.03em;
        }

        .subtle{
            color:#64748b;
            line-height:1.45;
            font-size:13px;
            margin:4px 0 0;
        }

        .badge{
            display:inline-flex;
            align-items:center;
            gap:6px;
            border-radius:999px;
            padding:6px 10px;
            font-size:12px;
            font-weight:950;
            white-space:nowrap;
        }

        .badge-blue{background:#dbeafe;color:#1e40af}
        .badge-green{background:#dcfce7;color:#166534}
        .badge-yellow{background:#fef3c7;color:#92400e}
        .badge-red{background:#fee2e2;color:#991b1b}
        .badge-gray{background:#f1f5f9;color:#475569}
        .badge.activo{background:#dcfce7;color:#166534;border:1px solid #bbf7d0}
        .badge.borrador{background:#fef3c7;color:#92400e;border:1px solid #fde68a}
        .badge.cerrado{background:#dbeafe;color:#1e40af;border:1px solid #bfdbfe}
        .badge.anulado{background:#fee2e2;color:#991b1b;border:1px solid #fecaca}

        .form-section-title{
            margin:18px 0 10px;
            padding:12px 14px;
            border-radius:16px;
            background:#f8fafc;
            border:1px solid #e5e7eb;
            color:#111827;
            font-weight:950;
            display:flex;
            gap:9px;
            align-items:center;
        }

        .form-section-title i{color:#dc2626}

        label{
            display:block;
            font-weight:900;
            margin:14px 0 7px;
            color:#1f2937;
            font-size:13px;
        }

        label i{
            color:#dc2626;
            margin-right:7px;
        }

        input,select,textarea{
            width:100%;
            border:1px solid #dbe3ef;
            border-radius:15px;
            padding:12px 13px;
            font-size:15px;
            outline:none;
            background:#fff;
            min-height:46px;
            color:#0f172a;
        }

        textarea{
            min-height:88px;
            resize:vertical;
        }

        input:focus,select:focus,textarea:focus{
            border-color:#dc2626;
            box-shadow:0 0 0 4px rgba(220,38,38,.12);
        }

        input:disabled{
            background:#f1f5f9;
            color:#94a3b8;
            cursor:not-allowed;
        }

        .input-icon{
            position:relative;
        }

        .input-icon > i{
            position:absolute;
            left:14px;
            top:50%;
            transform:translateY(-50%);
            color:#64748b;
            font-size:15px;
            pointer-events:none;
        }

        .input-icon input,
        .input-icon select{
            padding-left:42px;
        }

        .row2{
            display:grid;
            grid-template-columns:1fr 1fr;
            gap:12px;
        }

        .row3{
            display:grid;
            grid-template-columns:1fr 1fr 1fr;
            gap:12px;
        }

        .help-text{
            color:#64748b;
            font-size:12px;
            font-weight:800;
            line-height:1.45;
            margin:9px 0 0;
        }

        input[type="file"]{
            padding:10px;
            min-height:46px;
            background:#fff;
        }

        .upload-grid{
            display:grid;
            grid-template-columns:1fr;
            gap:12px;
        }

        .upload-box{
            border:1px solid #e2e8f0;
            border-radius:18px;
            padding:12px;
            background:#f8fafc;
        }

        .upload-box label{margin-top:0}

        .mini-logo{
            width:52px;
            height:52px;
            object-fit:contain;
            border-radius:12px;
            border:1px solid #e5e7eb;
            background:#fff;
            padding:4px;
        }

        .mini-banner{
            width:140px;
            height:48px;
            object-fit:cover;
            border-radius:12px;
            border:1px solid #e5e7eb;
            background:#fff;
        }

        .logos-list{
            display:flex;
            gap:6px;
            align-items:center;
        }

        .level-tabs{
            display:flex;
            gap:8px;
            flex-wrap:wrap;
            margin:8px 0 14px;
        }

        .level-tab{
            border:1px solid #e2e8f0;
            background:#fff;
            color:#334155;
            border-radius:999px;
            padding:8px 12px;
            font-size:12px;
            font-weight:950;
            cursor:pointer;
            display:inline-flex;
            align-items:center;
            gap:7px;
        }

        .level-tab.active{
            background:linear-gradient(135deg,#dc2626,#991b1b);
            border-color:transparent;
            color:#fff;
        }

        .nivel-title{
            background:linear-gradient(135deg,#0f172a,#1f2937);
            color:#fff;
            border-radius:16px;
            padding:11px 13px;
            margin:18px 0 12px;
            font-weight:950;
            display:flex;
            justify-content:space-between;
            align-items:center;
            gap:10px;
        }

        .grade-box{
            border:1px solid #e5e7eb;
            border-radius:20px;
            padding:15px;
            margin-bottom:12px;
            background:#fff;
            box-shadow:0 10px 24px rgba(15,23,42,.05);
            transition:.15s ease;
        }

        .grade-box.off{
            opacity:.62;
            background:#f8fafc;
        }

        .grade-box:hover{
            transform:translateY(-1px);
            box-shadow:0 14px 30px rgba(15,23,42,.08);
        }

        .grade-head{
            display:flex;
            align-items:center;
            justify-content:space-between;
            gap:10px;
            margin-bottom:10px;
        }

        .grade-title{
            font-weight:950;
            color:#0f172a;
            display:flex;
            align-items:center;
            gap:8px;
        }

        .participa{
            display:flex;
            align-items:center;
            gap:8px;
            font-size:13px;
            font-weight:950;
            color:#1e40af;
            white-space:nowrap;
            margin:0;
        }

        .participa input{
            width:18px;
            height:18px;
            min-height:auto;
            accent-color:#dc2626;
        }

        .save-panel{
            position:sticky;
            bottom:16px;
            z-index:5;
            margin-top:18px;
            border-radius:22px;
            background:rgba(255,255,255,.94);
            border:1px solid rgba(226,232,240,.95);
            box-shadow:0 20px 45px rgba(15,23,42,.12);
            padding:14px;
            backdrop-filter:blur(8px);
        }

        .btn-primary,.btn-secondary{
            width:100%;
            border:0;
            border-radius:17px;
            color:#fff;
            font-weight:950;
            padding:14px 16px;
            cursor:pointer;
            font-size:15px;
            display:flex;
            justify-content:center;
            align-items:center;
            gap:9px;
            text-decoration:none;
        }

        .btn-primary{
            background:linear-gradient(135deg,#1d4ed8,#2563eb);
            box-shadow:0 14px 28px rgba(37,99,235,.24);
        }

        .btn-primary:hover{background:linear-gradient(135deg,#1e40af,#1d4ed8)}

        .btn-secondary{
            background:linear-gradient(135deg,#475569,#1f2937);
            margin-top:9px;
        }

        .codes{
            display:grid;
            grid-template-columns:repeat(3,1fr);
            gap:10px;
            margin-top:12px;
        }

        .code{
            background:#fff;
            border:1px solid #e5e7eb;
            border-radius:14px;
            padding:10px;
            font-size:12px;
            font-weight:950;
            color:#1e40af;
            word-break:break-all;
            display:flex;
            align-items:center;
            justify-content:space-between;
            gap:8px;
        }

        .code-copy{
            border:0;
            background:#eff6ff;
            color:#1d4ed8;
            width:32px;
            height:32px;
            border-radius:11px;
            cursor:pointer;
            flex:0 0 auto;
        }

        .table-toolbar{
            display:flex;
            justify-content:space-between;
            align-items:center;
            gap:12px;
            margin:8px 0 14px;
            flex-wrap:wrap;
        }

        .search-box{
            max-width:340px;
            min-width:230px;
            flex:1;
            position:relative;
        }

        .search-box i{
            position:absolute;
            top:50%;
            left:13px;
            transform:translateY(-50%);
            color:#64748b;
        }

        .search-box input{
            padding-left:40px;
            min-height:42px;
        }

        .tabla-wrap{
            overflow-x:auto;
            border-radius:18px;
            border:1px solid #e5e7eb;
            background:#fff;
        }

        table{
            width:100%;
            border-collapse:separate;
            border-spacing:0;
            font-size:14px;
            min-width:980px;
        }

        th,td{
            padding:11px 10px;
            border-bottom:1px solid #e5e7eb;
            text-align:left;
            vertical-align:middle;
        }

        th{
            position:sticky;
            top:0;
            z-index:2;
            background:#f8fafc;
            color:#475569;
            text-transform:uppercase;
            font-size:12px;
            white-space:nowrap;
        }

        tbody tr:hover td{background:#f8fafc}
        tbody tr:last-child td{border-bottom:0}

        .id-cell{
            font-weight:950;
            color:#1d4ed8;
        }

        .course-name{
            font-weight:950;
            color:#0f172a;
        }

        .date-cell{
            color:#475569;
            font-size:13px;
            font-weight:800;
            line-height:1.45;
        }

        .metric{
            font-weight:950;
            color:#0f172a;
            text-align:center;
        }

        .btn-small{
            display:inline-flex;
            align-items:center;
            gap:6px;
            background:#1d4ed8;
            color:#fff;
            text-decoration:none;
            border-radius:12px;
            padding:8px 10px;
            font-weight:950;
            font-size:12px;
        }

        .btn-small:hover{background:#1e40af}

        .empty{
            border:1px dashed #cbd5e1;
            background:#f8fafc;
            border-radius:20px;
            padding:28px;
            color:#475569;
            text-align:center;
            font-weight:900;
        }

        .empty i{
            display:block;
            font-size:34px;
            color:#94a3b8;
            margin-bottom:9px;
        }

        @media(max-width:1120px){
            .grid{grid-template-columns:1fr}
            .page-summary{grid-template-columns:repeat(2,1fr)}
            .save-panel{position:static}
            .codes{grid-template-columns:1fr 1fr}
        }

        @media(max-width:700px){
            .topbar-inner{flex-direction:column;align-items:flex-start}
            .topbar h1{font-size:23px}
            .brand-icon{width:46px;height:46px}
            .card{padding:18px}
            .card-header{align-items:flex-start;flex-direction:column}
            .row2,.row3{grid-template-columns:1fr}
            .page-summary{grid-template-columns:1fr}
            .codes{grid-template-columns:1fr}
            .upload-grid{grid-template-columns:1fr}
            .grade-head{align-items:flex-start;flex-direction:column}
        }
    </style>
</head>
<body class="cn-con-sidebar">

<?php include __DIR__ . '/../includes/sidebar_concurso.php'; ?>

<?php
$totalConcursos = count($concursos);
$totalParticipantesSistema = 0;
$totalSalonesSistema = 0;
$totalCodigosSistema = 0;

foreach ($concursos as $cTmp) {
    $totalParticipantesSistema += (int)($cTmp['total_participantes'] ?? 0);
    $totalSalonesSistema += (int)($cTmp['total_salones'] ?? 0);
    $totalCodigosSistema += (int)($cTmp['total_codigos'] ?? 0);
}
?>

<header class="topbar">
    <div class="topbar-inner">
        <div class="brand-block">
            <div class="brand-icon">
                <i class="fa-solid fa-trophy"></i>
            </div>
            <div>
                <h1>Administrar concursos</h1>
                <p>
                    Código administrador:
                    <?php echo admin_h($acceso['codigo']); ?>
                    <?php if (!empty($esAdminGlobal)): ?> | ADMIN GLOBAL<?php endif; ?>
                    | Responsable:
                    <?php echo admin_h($acceso['nombre_responsable']); ?>
                </p>
            </div>
        </div>

        <a class="btn-back" href="../panel.php">
            <i class="bi bi-arrow-left-circle"></i>
            Volver al panel
        </a>
    </div>
</header>

<main class="container">
    <?php if ($mensajeOk !== ''): ?>
        <div class="notice notice-ok">
            <i class="bi bi-check-circle-fill"></i>
            <div><?php echo admin_h($mensajeOk); ?></div>
        </div>
    <?php endif; ?>

    <?php if ($mensajeError !== ''): ?>
        <div class="notice notice-error">
            <i class="bi bi-exclamation-triangle-fill"></i>
            <div><?php echo admin_h($mensajeError); ?></div>
        </div>
    <?php endif; ?>

    <?php if (!empty($codigosCreados)): ?>
        <div class="notice notice-info">
            <i class="fa-solid fa-key"></i>
            <div style="width:100%">
                <strong>Códigos creados:</strong>
                <div class="codes">
                    <?php foreach ($codigosCreados as $codigoCreado): ?>
                        <div class="code">
                            <span><?php echo admin_h($codigoCreado); ?></span>
                            <button type="button" class="code-copy" data-code="<?php echo admin_h($codigoCreado); ?>" title="Copiar código">
                                <i class="fa-regular fa-copy"></i>
                            </button>
                        </div>
                    <?php endforeach; ?>
                </div>
            </div>
        </div>
    <?php endif; ?>

    <div class="page-summary">
        <div class="summary-card">
            <div class="summary-icon icon-blue"><i class="fa-solid fa-trophy"></i></div>
            <div>
                <strong><?php echo admin_h($totalConcursos); ?></strong>
                <span>Concursos</span>
            </div>
        </div>

        <div class="summary-card">
            <div class="summary-icon icon-green"><i class="fa-solid fa-users"></i></div>
            <div>
                <strong><?php echo admin_h($totalParticipantesSistema); ?></strong>
                <span>Participantes</span>
            </div>
        </div>

        <div class="summary-card">
            <div class="summary-icon icon-yellow"><i class="fa-solid fa-door-open"></i></div>
            <div>
                <strong><?php echo admin_h($totalSalonesSistema); ?></strong>
                <span>Salones</span>
            </div>
        </div>

        <div class="summary-card">
            <div class="summary-icon icon-red"><i class="fa-solid fa-key"></i></div>
            <div>
                <strong><?php echo admin_h($totalCodigosSistema); ?></strong>
                <span>Códigos</span>
            </div>
        </div>
    </div>

    <div class="grid">
        <section class="card">
            <div class="card-header">
                <div class="card-title">
                    <div class="card-icon">
                        <i class="fa-solid fa-plus"></i>
                    </div>
                    <div>
                        <h2>Crear nuevo concurso</h2>
                        <p class="subtle">Genera concurso, grados, salones y códigos automáticamente.</p>
                    </div>
                </div>

                <span class="badge badge-blue">
                    <i class="fa-solid fa-wand-magic-sparkles"></i>
                    Auto
                </span>
            </div>

            <form method="post" action="" id="frmCrearConcurso" enctype="multipart/form-data">
                <input type="hidden" name="csrf_token" value="<?php echo admin_h($csrf); ?>">

                <div class="form-section-title">
                    <i class="fa-solid fa-circle-info"></i>
                    Datos generales
                </div>

                <label><i class="bi bi-trophy"></i> Nombre del concurso</label>
                <div class="input-icon">
                    <i class="fa-solid fa-award"></i>
                    <input type="text" name="nombre" maxlength="180" value="<?php echo admin_h($valores['nombre']); ?>" required>
                </div>

                <label><i class="bi bi-card-heading"></i> Subtítulo</label>
                <div class="input-icon">
                    <i class="fa-solid fa-heading"></i>
                    <input type="text" name="subtitulo" maxlength="180" value="<?php echo admin_h($valores['subtitulo']); ?>" required>
                </div>

                <div class="row2">
                    <div>
                        <label><i class="bi bi-calendar3"></i> Año</label>
                        <div class="input-icon">
                            <i class="fa-solid fa-calendar-days"></i>
                            <input type="number" name="anio" min="2020" max="2100" value="<?php echo admin_h($valores['anio']); ?>" required>
                        </div>
                    </div>

                    <div>
                        <label><i class="bi bi-toggle-on"></i> Estado</label>
                        <div class="input-icon">
                            <i class="fa-solid fa-power-off"></i>
                            <select name="estado">
                                <option value="ACTIVO" <?php echo $valores['estado'] === 'ACTIVO' ? 'selected' : ''; ?>>ACTIVO</option>
                                <option value="BORRADOR" <?php echo $valores['estado'] === 'BORRADOR' ? 'selected' : ''; ?>>BORRADOR</option>
                                <option value="CERRADO" <?php echo $valores['estado'] === 'CERRADO' ? 'selected' : ''; ?>>CERRADO</option>
                                <option value="ANULADO" <?php echo $valores['estado'] === 'ANULADO' ? 'selected' : ''; ?>>ANULADO</option>
                            </select>
                        </div>
                    </div>
                </div>

                <label><i class="bi bi-text-paragraph"></i> Descripción</label>
                <textarea name="descripcion"><?php echo admin_h($valores['descripcion']); ?></textarea>

                <div class="form-section-title">
                    <i class="fa-solid fa-images"></i>
                    Cabecera del concurso
                </div>

                <div class="upload-grid">
                    <div class="upload-box">
                        <label><i class="fa-regular fa-image"></i> Imagen única de cabecera</label>
                        <input type="file" name="cabecera_completa" accept=".jpg,.jpeg,.png,.webp,image/jpeg,image/png,image/webp">
                        <p class="help-text">
                            Sube una sola imagen panorámica con fondo rojo, logo izquierdo, banner central y logo derecho ya integrados.
                            Recomendado: <strong>3000 × 300 px</strong> o proporción aproximada <strong>10:1</strong>. PNG, JPG o WEBP. Máx. 5 MB.
                        </p>
                    </div>
                </div>

                <div class="row2">
                    <div>
                        <label><i class="bi bi-calendar-event"></i> Fecha inicio</label>
                        <input type="date" name="fecha_inicio" id="fechaInicio" value="<?php echo admin_h($valores['fecha_inicio']); ?>">
                    </div>

                    <div>
                        <label><i class="bi bi-calendar-x"></i> Fecha fin</label>
                        <input type="date" name="fecha_fin" id="fechaFin" value="<?php echo admin_h($valores['fecha_fin']); ?>">
                    </div>
                </div>

                <div class="form-section-title">
                    <i class="fa-solid fa-key"></i>
                    Códigos y salones
                </div>

                <label><i class="bi bi-upc-scan"></i> Prefijo de códigos</label>
                <div class="input-icon">
                    <i class="fa-solid fa-barcode"></i>
                    <input type="text" name="prefijo_codigo" id="prefijoCodigo" maxlength="20" value="<?php echo admin_h($valores['prefijo_codigo']); ?>" required>
                </div>
                <p class="help-text">Ejemplo: NOBEX2025. Se crearán códigos como ADMIN-NOBEX2025 y NOBEX2025-INI-5-A.</p>

                <div class="row3">
                    <div>
                        <label><i class="bi bi-dash-circle"></i> Blanco</label>
                        <input type="text" name="puntos_blanco" class="campo-decimal" value="<?php echo admin_h($valores['puntos_blanco']); ?>">
                    </div>

                    <div>
                        <label><i class="bi bi-people"></i> Capacidad salón</label>
                        <input type="number" name="capacidad_salon" id="capacidadSalon" min="1" max="<?php echo admin_h(ADMIN_CAPACIDAD_SALON_MAX); ?>" value="<?php echo admin_h($valores['capacidad_salon']); ?>">
                        <p class="help-text">Puedes ampliar la capacidad hasta <?php echo admin_h(ADMIN_CAPACIDAD_SALON_MAX); ?> estudiantes por salón.</p>
                    </div>

                    <div>
                        <label><i class="bi bi-door-open"></i> Salones por grado</label>
                        <input type="number" name="cantidad_salones" id="cantidadSalones" min="1" max="<?php echo admin_h(ADMIN_SALONES_MAX); ?>" value="<?php echo admin_h($valores['cantidad_salones']); ?>">
                        <p class="help-text">Escribe cuántos salones quieres por grado. Se crearán A, B, C... automáticamente.</p>
                    </div>
                </div>

                <div class="form-section-title">
                    <i class="fa-solid fa-layer-group"></i>
                    Configuración por grado
                </div>

                <div class="level-tabs">
                    <button type="button" class="level-tab active" data-filter-level="TODOS"><i class="fa-solid fa-list"></i> Todos</button>
                    <button type="button" class="level-tab" data-filter-level="INICIAL"><i class="fa-solid fa-child-reaching"></i> Inicial</button>
                    <button type="button" class="level-tab" data-filter-level="PRIMARIA"><i class="fa-solid fa-pencil"></i> Primaria</button>
                    <button type="button" class="level-tab" data-filter-level="SECUNDARIA"><i class="fa-solid fa-graduation-cap"></i> Secundaria</button>
                </div>

                <?php
                $nivelActual = '';
                foreach ($gradosBase as $grado):
                    if ($nivelActual !== $grado['nivel']):
                        $nivelActual = $grado['nivel'];
                ?>
                        <div class="nivel-title" data-level-title="<?php echo admin_h($nivelActual); ?>">
                            <span><i class="fa-solid fa-layer-group"></i> <?php echo admin_h($nivelActual); ?></span>
                            <span class="badge badge-gray">Nivel</span>
                        </div>
                <?php
                    endif;

                    $key = $grado['key'];
                    $participa = $valores['participa_' . $key] === '1';
                ?>
                    <div class="grade-box <?php echo $participa ? '' : 'off'; ?>" data-grade="<?php echo admin_h($key); ?>" data-level="<?php echo admin_h($grado['nivel']); ?>">
                        <div class="grade-head">
                            <div class="grade-title">
                                <i class="fa-solid fa-book-open"></i>
                                <?php echo admin_h($grado['nombre']); ?>
                            </div>

                            <label class="participa">
                                <input
                                    type="checkbox"
                                    name="participa_<?php echo admin_h($key); ?>"
                                    value="1"
                                    class="chk-participa"
                                    data-grade="<?php echo admin_h($key); ?>"
                                    <?php echo $participa ? 'checked' : ''; ?>
                                >
                                Participa
                            </label>
                        </div>

                        <div class="row3">
                            <div>
                                <label><i class="bi bi-list-ol"></i> Preguntas</label>
                                <input
                                    type="number"
                                    name="preguntas_<?php echo admin_h($key); ?>"
                                    min="0"
                                    value="<?php echo admin_h($valores['preguntas_' . $key]); ?>"
                                    class="inp-grade inp-<?php echo admin_h($key); ?> campo-entero"
                                >
                            </div>

                            <div>
                                <label><i class="bi bi-check-circle"></i> Buena</label>
                                <input
                                    type="text"
                                    name="buena_<?php echo admin_h($key); ?>"
                                    value="<?php echo admin_h($valores['buena_' . $key]); ?>"
                                    class="inp-grade inp-<?php echo admin_h($key); ?> campo-decimal"
                                >
                            </div>

                            <div>
                                <label><i class="bi bi-x-circle"></i> Mala</label>
                                <input
                                    type="text"
                                    name="mala_<?php echo admin_h($key); ?>"
                                    value="<?php echo admin_h($valores['mala_' . $key]); ?>"
                                    class="inp-grade inp-<?php echo admin_h($key); ?> campo-decimal"
                                >
                            </div>
                        </div>
                    </div>
                <?php endforeach; ?>

                <div class="save-panel">
                    <button type="submit" class="btn-primary" id="btnCrear">
                        <i class="fa-solid fa-circle-plus"></i>
                        Crear concurso completo
                    </button>
                </div>
            </form>
        </section>

        <section class="card">
            <div class="card-header">
                <div class="card-title">
                    <div class="card-icon">
                        <i class="fa-solid fa-table-list"></i>
                    </div>
                    <div>
                        <h2>Concursos existentes</h2>
                        <p class="subtle">Listado general con accesos rápidos para edición.</p>
                    </div>
                </div>

                <span class="badge badge-blue">
                    <i class="fa-solid fa-database"></i>
                    <?php echo admin_h($totalConcursos); ?> registros
                </span>
            </div>

            <?php if ($errorListadoConcursos !== ''): ?>
                <div class="notice notice-error">
                    <i class="bi bi-exclamation-triangle-fill"></i>
                    <div><?php echo admin_h($errorListadoConcursos); ?></div>
                </div>
            <?php endif; ?>

            <?php if (!empty($concursos)): ?>
                <div class="table-toolbar">
                    <div class="search-box">
                        <i class="fa-solid fa-magnifying-glass"></i>
                        <input type="text" id="buscarConcurso" placeholder="Buscar concurso, año o estado...">
                    </div>

                    <span class="badge badge-gray">
                        <i class="fa-solid fa-filter"></i>
                        Filtro rápido
                    </span>
                </div>

                <div class="tabla-wrap">
                    <table id="tablaConcursos">
                        <thead>
                            <tr>
                                <th>ID</th>
                                <th>Concurso</th>
                                <th>Año</th>
                                <th>Estado</th>
                                <th>Imagen</th>
                                <th>Fechas</th>
                                <th>Grados</th>
                                <th>Salones</th>
                                <th>Códigos</th>
                                <th>Participantes</th>
                                <th>Acción</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($concursos as $c): ?>
                                <tr>
                                    <td class="id-cell">#<?php echo admin_h($c['id_concurso']); ?></td>
                                    <td>
                                        <div class="course-name"><?php echo admin_h($c['nombre']); ?></div>
                                        <div class="subtle"><?php echo admin_h($c['subtitulo']); ?></div>
                                    </td>
                                    <td class="metric"><?php echo admin_h($c['anio']); ?></td>
                                    <td>
                                        <span class="badge <?php echo strtolower((string)$c['estado']); ?>">
                                            <?php echo admin_h($c['estado']); ?>
                                        </span>
                                    </td>
                                    <td>
                                        <div class="logos-list">
                                            <?php if (!empty($c['cabecera_completa'])): ?>
                                                <img class="mini-banner" src="../<?php echo admin_h($c['cabecera_completa']); ?>" alt="Cabecera completa">
                                            <?php elseif (!empty($c['imagen_banner'])): ?>
                                                <img class="mini-banner" src="../<?php echo admin_h($c['imagen_banner']); ?>" alt="Banner antiguo">
                                            <?php else: ?>
                                                <?php if (!empty($c['logo_principal'])): ?>
                                                    <img class="mini-logo" src="../<?php echo admin_h($c['logo_principal']); ?>" alt="Logo principal antiguo">
                                                <?php endif; ?>
                                                <?php if (!empty($c['logo_secundario'])): ?>
                                                    <img class="mini-logo" src="../<?php echo admin_h($c['logo_secundario']); ?>" alt="Logo secundario antiguo">
                                                <?php endif; ?>
                                            <?php endif; ?>

                                            <?php if (empty($c['cabecera_completa']) && empty($c['logo_principal']) && empty($c['logo_secundario']) && empty($c['imagen_banner'])): ?>
                                                <span class="badge badge-gray">Sin imagen</span>
                                            <?php endif; ?>
                                        </div>
                                    </td>
                                    <td class="date-cell">
                                        <i class="bi bi-calendar-event"></i> <?php echo admin_h($c['fecha_inicio'] ?: ''); ?><br>
                                        <i class="bi bi-calendar-x"></i> <?php echo admin_h($c['fecha_fin'] ?: ''); ?>
                                    </td>
                                    <td class="metric"><?php echo admin_h($c['total_grados']); ?></td>
                                    <td class="metric"><?php echo admin_h($c['total_salones']); ?></td>
                                    <td class="metric"><?php echo admin_h($c['total_codigos']); ?></td>
                                    <td class="metric"><?php echo admin_h($c['total_participantes']); ?></td>
                                    <td>
                                        <a class="btn-small" href="editar.php?id=<?php echo admin_h($c['id_concurso']); ?>">
                                            <i class="fa-solid fa-pen-to-square"></i>
                                            Editar
                                        </a>
                                    </td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>
                </div>
            <?php else: ?>
                <div class="empty">
                    <i class="fa-regular fa-folder-open"></i>
                    Todavía no hay concursos registrados.
                </div>
            <?php endif; ?>
        </section>
    </div>
</main>

<script>
document.addEventListener('DOMContentLoaded', function () {
    const mensajeOk = <?php echo json_encode($mensajeOk, JSON_UNESCAPED_UNICODE); ?>;
    const mensajeError = <?php echo json_encode($mensajeError, JSON_UNESCAPED_UNICODE); ?>;
    const codigosCreados = <?php echo json_encode($codigosCreados, JSON_UNESCAPED_UNICODE); ?>;

    const frm = document.getElementById('frmCrearConcurso');
    const prefijo = document.getElementById('prefijoCodigo');
    const checks = document.querySelectorAll('.chk-participa');
    const fechaInicio = document.getElementById('fechaInicio');
    const fechaFin = document.getElementById('fechaFin');
    const capacidadSalon = document.getElementById('capacidadSalon');
    const cantidadSalones = document.getElementById('cantidadSalones');
    const btnCrear = document.getElementById('btnCrear');
    const capacidadMaxima = <?php echo (int)ADMIN_CAPACIDAD_SALON_MAX; ?>;
    const salonesMaximo = <?php echo (int)ADMIN_SALONES_MAX; ?>;

    let enviando = false;

    function swalMensaje(texto, tipo, titulo) {
        if (!texto || typeof Swal === 'undefined') return;

        Swal.fire({
            icon: tipo || 'info',
            title: titulo || 'Aviso',
            text: texto,
            confirmButtonText: 'Entendido',
            confirmButtonColor: tipo === 'error' ? '#dc2626' : '#1d4ed8'
        });
    }

    function normalizarDecimal(valor) {
        return String(valor || '').replace(',', '.').trim();
    }

    function actualizarGrado(key, activo) {
        const box = document.querySelector('.grade-box[data-grade="' + key + '"]');
        const inputs = document.querySelectorAll('.inp-' + key);

        if (box) {
            if (activo) {
                box.classList.remove('off');
            } else {
                box.classList.add('off');
            }
        }

        inputs.forEach(function (input) {
            input.disabled = !activo;
        });
    }

    function filtrarTabla(inputId, tablaId) {
        const input = document.getElementById(inputId);
        const tabla = document.getElementById(tablaId);

        if (!input || !tabla) return;

        input.addEventListener('input', function () {
            const q = input.value.toLowerCase().trim();
            const filas = tabla.querySelectorAll('tbody tr');

            filas.forEach(function (fila) {
                const texto = fila.textContent.toLowerCase();
                fila.style.display = texto.includes(q) ? '' : 'none';
            });
        });
    }

    if (prefijo) {
        prefijo.addEventListener('input', function () {
            prefijo.value = prefijo.value.toUpperCase().replace(/[^A-Z0-9]/g, '').slice(0, 20);
        });
    }

    checks.forEach(function (chk) {
        actualizarGrado(chk.dataset.grade, chk.checked);

        chk.addEventListener('change', function () {
            actualizarGrado(chk.dataset.grade, chk.checked);
        });
    });

    document.querySelectorAll('.level-tab').forEach(function (btn) {
        btn.addEventListener('click', function () {
            const nivel = btn.dataset.filterLevel || 'TODOS';

            document.querySelectorAll('.level-tab').forEach(function (b) {
                b.classList.remove('active');
            });

            btn.classList.add('active');

            document.querySelectorAll('.grade-box').forEach(function (box) {
                box.style.display = nivel === 'TODOS' || box.dataset.level === nivel ? '' : 'none';
            });

            document.querySelectorAll('[data-level-title]').forEach(function (title) {
                title.style.display = nivel === 'TODOS' || title.dataset.levelTitle === nivel ? '' : 'none';
            });
        });
    });

    document.querySelectorAll('.campo-decimal').forEach(function (input) {
        input.addEventListener('blur', function () {
            const valor = normalizarDecimal(input.value);

            if (valor !== '' && !Number.isNaN(Number(valor))) {
                input.value = Number(valor).toFixed(2);
            }
        });
    });

    document.querySelectorAll('.campo-entero').forEach(function (input) {
        input.addEventListener('input', function () {
            input.value = input.value.replace(/\D/g, '');
        });
    });

    document.querySelectorAll('.code-copy').forEach(function (btn) {
        btn.addEventListener('click', async function () {
            const code = btn.dataset.code || '';

            try {
                await navigator.clipboard.writeText(code);
                swalMensaje('Código copiado: ' + code, 'success', 'Copiado');
            } catch (e) {
                swalMensaje('No se pudo copiar automáticamente. Código: ' + code, 'info', 'Código');
            }
        });
    });

    filtrarTabla('buscarConcurso', 'tablaConcursos');

    if (frm) {
        frm.addEventListener('submit', function (event) {
            if (enviando) {
                return;
            }

            if (fechaInicio && fechaFin && fechaInicio.value && fechaFin.value && fechaFin.value < fechaInicio.value) {
                event.preventDefault();
                swalMensaje('La fecha fin no puede ser menor que la fecha inicio.', 'error', 'Fechas inválidas');
                return;
            }

            if (capacidadSalon) {
                const cap = Number(capacidadSalon.value || 0);

                if (cap < 1 || cap > capacidadMaxima) {
                    event.preventDefault();
                    swalMensaje('La capacidad por salón debe estar entre 1 y ' + capacidadMaxima + '.', 'error', 'Capacidad inválida');
                    capacidadSalon.focus();
                    return;
                }
            }

            if (cantidadSalones) {
                const salones = Number(cantidadSalones.value || 0);

                if (salones < 1 || salones > salonesMaximo) {
                    event.preventDefault();
                    swalMensaje('La cantidad de salones debe estar entre 1 y ' + salonesMaximo + '.', 'error', 'Cantidad inválida');
                    cantidadSalones.focus();
                    return;
                }
            }

            let gradosActivos = 0;
            let invalido = false;
            let mensaje = '';

            checks.forEach(function (chk) {
                if (chk.checked) {
                    gradosActivos++;
                }
            });

            if (gradosActivos <= 0) {
                event.preventDefault();
                swalMensaje('Debes seleccionar al menos un grado participante.', 'error', 'Sin grados');
                return;
            }

            document.querySelectorAll('.grade-box:not(.off) .campo-entero').forEach(function (input) {
                const n = Number(input.value || 0);

                if (n <= 0) {
                    invalido = true;
                    mensaje = 'Las preguntas de los grados activos deben ser mayor que cero.';
                    input.focus();
                }
            });

            document.querySelectorAll('.grade-box:not(.off) .campo-decimal').forEach(function (input) {
                const valor = normalizarDecimal(input.value);

                if (valor === '' || Number.isNaN(Number(valor)) || Number(valor) < 0) {
                    invalido = true;
                    mensaje = 'Revisa los puntajes. Solo se permiten números positivos o cero.';
                    input.focus();
                }
            });

            if (invalido) {
                event.preventDefault();
                swalMensaje(mensaje, 'error', 'Datos inválidos');
                return;
            }

            event.preventDefault();

            Swal.fire({
                icon:'question',
                title:'¿Crear concurso?',
                text:'Se generarán el concurso, grados seleccionados, salones, códigos de acceso y la cabecera cargada.',
                showCancelButton:true,
                confirmButtonText:'Sí, crear',
                cancelButtonText:'Cancelar',
                confirmButtonColor:'#1d4ed8',
                cancelButtonColor:'#64748b'
            }).then(function (result) {
                if (result.isConfirmed) {
                    enviando = true;

                    if (btnCrear) {
                        btnCrear.disabled = true;
                        btnCrear.innerHTML = '<i class="fa-solid fa-spinner fa-spin"></i> Creando...';
                    }

                    frm.submit();
                }
            });
        });
    }

    if (mensajeError) {
        swalMensaje(mensajeError, 'error', 'Error');
    } else if (mensajeOk) {
        Swal.fire({
            icon:'success',
            title:'Concurso creado',
            text: mensajeOk,
            confirmButtonText:'Entendido',
            confirmButtonColor:'#1d4ed8'
        }).then(function () {
            if (Array.isArray(codigosCreados) && codigosCreados.length > 0) {
                Swal.fire({
                    icon:'info',
                    title:'Códigos generados',
                    html:'<div style="text-align:left;font-weight:700;line-height:1.7">' + codigosCreados.map(function (c) {
                        return '<div>🔑 ' + String(c).replace(/[&<>"']/g, function (m) {
                            return {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#039;'}[m];
                        }) + '</div>';
                    }).join('') + '</div>',
                    confirmButtonText:'Entendido',
                    confirmButtonColor:'#1d4ed8'
                });
            }
        });
    }
});
</script>

</body>
</html>
