<?php
// concurso_nobel/admin/editar.php
// Editar concurso, configuración por grado y salones.
// Compatible con ADMIN_GLOBAL sin concurso fijo y con administradores ligados a concurso.

declare(strict_types=1);

session_start();

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

date_default_timezone_set('America/Lima');

const E_MAX_CUPO_SALON = 500;
const E_MAX_SALONES_AGREGAR = 100;

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

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

function e_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 e_tabla_existe(mysqli $conn, string $tabla): bool
{
    $tabla = mysqli_real_escape_string($conn, $tabla);
    $res = @mysqli_query($conn, "SHOW TABLES LIKE '{$tabla}'");
    return $res instanceof mysqli_result && mysqli_num_rows($res) > 0;
}


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

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

    /*
    Ahora el sistema trabaja con UNA SOLA imagen completa de cabecera.
    Las columnas antiguas se mantienen por compatibilidad, pero el editor
    ya solo administra cabecera_completa.
    */
    if (!e_columna_existe($conn, 'concursos', 'cabecera_completa')) {
        @mysqli_query($conn, "ALTER TABLE concursos ADD COLUMN cabecera_completa VARCHAR(255) NULL AFTER descripcion");
    }

    if (!e_columna_existe($conn, 'concursos', 'logo_principal')) {
        @mysqli_query($conn, "ALTER TABLE concursos ADD COLUMN logo_principal VARCHAR(255) NULL AFTER cabecera_completa");
    }

    if (!e_columna_existe($conn, 'concursos', 'logo_secundario')) {
        @mysqli_query($conn, "ALTER TABLE concursos ADD COLUMN logo_secundario VARCHAR(255) NULL AFTER logo_principal");
    }

    if (!e_columna_existe($conn, 'concursos', 'imagen_banner')) {
        @mysqli_query($conn, "ALTER TABLE concursos ADD COLUMN imagen_banner VARCHAR(255) NULL AFTER logo_secundario");
    }
}

function e_upload_dir(): string
{
    return __DIR__ . '/../uploads/concursos';
}

function e_upload_rel_dir(): string
{
    return 'uploads/concursos';
}

function e_asegurar_upload_dir(): void
{
    $dir = e_upload_dir();

    if (!is_dir($dir)) {
        @mkdir($dir, 0775, true);
    }

    if (!is_dir($dir) || !is_writable($dir)) {
        throw new RuntimeException('La carpeta de imágenes no existe o no tiene permiso de escritura: concurso_nobel/uploads/concursos/');
    }
}

function e_url_imagen_admin(?string $ruta): string
{
    $ruta = trim((string)$ruta);

    if ($ruta === '') {
        return '';
    }

    if (preg_match('/^https?:\/\//i', $ruta)) {
        return $ruta;
    }

    return '../' . ltrim($ruta, '/');
}


function e_cabecera_actual(array $concurso): string
{
    /*
    Prioridad de visualización/migración:
    1. cabecera_completa: nueva columna oficial.
    2. imagen_banner: por si el concurso fue creado con la versión anterior.
    3. logo_principal o logo_secundario: último recurso para no dejar vacío.
    */
    $candidatos = [
        $concurso['cabecera_completa'] ?? '',
        $concurso['imagen_banner'] ?? '',
        $concurso['logo_principal'] ?? '',
        $concurso['logo_secundario'] ?? ''
    ];

    foreach ($candidatos as $ruta) {
        $ruta = trim((string)$ruta);

        if ($ruta !== '') {
            return $ruta;
        }
    }

    return '';
}

function e_subir_imagen_concurso(string $campo, ?string $actual, string $prefijo): ?string
{
    $actual = trim((string)$actual);

    if (!isset($_FILES[$campo]) || !is_array($_FILES[$campo])) {
        return $actual !== '' ? $actual : null;
    }

    $file = $_FILES[$campo];

    if ((int)($file['error'] ?? UPLOAD_ERR_NO_FILE) === UPLOAD_ERR_NO_FILE) {
        return $actual !== '' ? $actual : 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']);
    }

    $size = (int)($file['size'] ?? 0);

    if ($size <= 0) {
        throw new RuntimeException('La imagen ' . $campo . ' está vacía.');
    }

    if ($size > 5 * 1024 * 1024) {
        throw new RuntimeException('La imagen ' . $campo . ' supera los 5 MB.');
    }

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

    if ($tmp === '' || !is_uploaded_file($tmp)) {
        throw new RuntimeException('No se pudo validar la imagen ' . $campo . '.');
    }

    $info = @getimagesize($tmp);

    if (!$info || empty($info['mime'])) {
        throw new RuntimeException('El archivo ' . $campo . ' no parece ser una imagen válida.');
    }

    $extensiones = [
        'image/jpeg' => 'jpg',
        'image/png' => 'png',
        'image/webp' => 'webp',
        'image/gif' => 'gif'
    ];

    $mime = (string)$info['mime'];

    if (!isset($extensiones[$mime])) {
        throw new RuntimeException('Formato no permitido en ' . $campo . '. Usa JPG, PNG, WEBP o GIF.');
    }

    e_asegurar_upload_dir();

    $ext = $extensiones[$mime];
    $nombre = $prefijo . '_' . date('Ymd_His') . '_' . bin2hex(random_bytes(5)) . '.' . $ext;
    $destino = e_upload_dir() . '/' . $nombre;

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

    return e_upload_rel_dir() . '/' . $nombre;
}

function e_codigo_grado(string $nivel, int $gradoOrden): string
{
    $nivel = strtoupper(trim($nivel));

    if ($nivel === 'INICIAL') {
        return 'INI-' . $gradoOrden;
    }

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

    return 'SEC-' . $gradoOrden;
}

function e_letra_salon(int $numero): string
{
    $numero = max(1, $numero);
    $letra = '';

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

    return $letra;
}

function e_prefijo_concurso(mysqli $conn, int $idConcurso): string
{
    $stmt = mysqli_prepare($conn, "
        SELECT codigo
        FROM concurso_accesos
        WHERE id_concurso = ?
          AND codigo LIKE 'ADMIN-%'
        ORDER BY id_acceso ASC
        LIMIT 1
    ");

    if ($stmt) {
        mysqli_stmt_bind_param($stmt, 'i', $idConcurso);
        mysqli_stmt_execute($stmt);
        $res = mysqli_stmt_get_result($stmt);
        $row = $res instanceof mysqli_result ? mysqli_fetch_assoc($res) : null;
        mysqli_stmt_close($stmt);

        if ($row && !empty($row['codigo'])) {
            return preg_replace('/^ADMIN-/i', '', (string)$row['codigo']);
        }
    }

    $stmt = mysqli_prepare($conn, "
        SELECT codigo_salon
        FROM concurso_salones
        WHERE id_concurso = ?
        ORDER BY id_salon ASC
        LIMIT 1
    ");

    if ($stmt) {
        mysqli_stmt_bind_param($stmt, 'i', $idConcurso);
        mysqli_stmt_execute($stmt);
        $res = mysqli_stmt_get_result($stmt);
        $row = $res instanceof mysqli_result ? mysqli_fetch_assoc($res) : null;
        mysqli_stmt_close($stmt);

        if ($row && !empty($row['codigo_salon']) && preg_match('/^(.+)-(INI|PRI|SEC)-\d+-[A-Z]+$/', (string)$row['codigo_salon'], $m)) {
            return (string)$m[1];
        }
    }

    return 'NOBEX' . date('Y');
}

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

    if (!$stmt) {
        return false;
    }

    mysqli_stmt_bind_param($stmt, 's', $codigo);
    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);
    $existe = $res instanceof mysqli_result ? mysqli_fetch_assoc($res) : null;
    mysqli_stmt_close($stmt);

    return (bool)$existe;
}

function e_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) {
        throw new RuntimeException('No se pudo preparar el nuevo 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);
        throw new RuntimeException('No se pudo crear el salón ' . $codigoSalon . '. ' . $error);
    }

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

function e_insertar_acceso_salon(
    mysqli $conn,
    int $idConcurso,
    int $idGrupo,
    int $idSalon,
    string $codigo,
    string $responsable,
    ?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
            (?, ?, ?, ?, ?, 'SALON', 1, 1, 1, 0, 1, ?, NOW())
    ");

    if (!$stmt) {
        throw new RuntimeException('No se pudo preparar el acceso del salón.');
    }

    mysqli_stmt_bind_param($stmt, 'iiisss', $idConcurso, $idGrupo, $idSalon, $codigo, $responsable, $fechaExpiracion);

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

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

function e_auditar(mysqli $conn, ?int $idConcurso, ?int $idGrupo, ?int $idAcceso, ?int $idParticipante, string $accion, string $detalle): void
{
    if (!e_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 e_post(string $key, string $default = ''): string
{
    return trim((string)($_POST[$key] ?? $default));
}

function e_int($valor, int $default): int
{
    $valor = trim((string)$valor);
    return preg_match('/^\d+$/', $valor) ? (int)$valor : $default;
}

function e_decimal($valor, float $default): float
{
    $valor = str_replace(',', '.', trim((string)$valor));
    return is_numeric($valor) ? round((float)$valor, 2) : $default;
}

function e_estado_valido(string $estado): bool
{
    return in_array($estado, ['BORRADOR', 'ACTIVO', 'CERRADO', 'ANULADO'], true);
}

function e_obtener_concurso(mysqli $conn, int $idConcurso): ?array
{
    $stmt = mysqli_prepare($conn, "SELECT * FROM concursos WHERE id_concurso = ? LIMIT 1");

    if (!$stmt) {
        return null;
    }

    mysqli_stmt_bind_param($stmt, 'i', $idConcurso);
    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);
    $row = $res instanceof mysqli_result ? mysqli_fetch_assoc($res) : null;
    mysqli_stmt_close($stmt);

    return $row ?: null;
}

function e_obtener_grupos(mysqli $conn, int $idConcurso): array
{
    $items = [];
    $stmt = mysqli_prepare($conn, "
        SELECT *
        FROM concurso_grupos
        WHERE id_concurso = ?
        ORDER BY orden ASC, id_grupo ASC
    ");

    if ($stmt) {
        mysqli_stmt_bind_param($stmt, 'i', $idConcurso);
        mysqli_stmt_execute($stmt);
        $res = mysqli_stmt_get_result($stmt);

        if ($res instanceof mysqli_result) {
            while ($row = mysqli_fetch_assoc($res)) {
                $items[] = $row;
            }
        }

        mysqli_stmt_close($stmt);
    }

    return $items;
}

function e_obtener_salones(mysqli $conn, int $idConcurso): array
{
    $items = [];
    $stmt = mysqli_prepare($conn, "
        SELECT
            s.*,
            g.nombre AS grupo_nombre
        FROM concurso_salones s
        INNER JOIN concurso_grupos g ON g.id_grupo = s.id_grupo
        WHERE s.id_concurso = ?
        ORDER BY g.orden ASC, s.orden ASC, s.id_salon ASC
    ");

    if ($stmt) {
        mysqli_stmt_bind_param($stmt, 'i', $idConcurso);
        mysqli_stmt_execute($stmt);
        $res = mysqli_stmt_get_result($stmt);

        if ($res instanceof mysqli_result) {
            while ($row = mysqli_fetch_assoc($res)) {
                $items[] = $row;
            }
        }

        mysqli_stmt_close($stmt);
    }

    return $items;
}

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

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

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

if ($ultimaActividad > 0 && (time() - $ultimaActividad) > 10800) {
    e_auditar($conn, $idConcursoSesion > 0 ? $idConcursoSesion : null, null, $idAccesoSesion, null, 'SESION_EXPIRADA_ADMIN_EDITAR', 'Sesión expirada en edición de concurso.');
    e_limpiar_sesion();
    e_redirigir('../index.php');
}

$stmtAcceso = mysqli_prepare($conn, "
    SELECT
        a.*,
        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);
    die('No se pudo validar el acceso administrativo.');
}

mysqli_stmt_bind_param($stmtAcceso, 'i', $idAccesoSesion);
mysqli_stmt_execute($stmtAcceso);
$resAcceso = mysqli_stmt_get_result($stmtAcceso);
$acceso = $resAcceso instanceof mysqli_result ? mysqli_fetch_assoc($resAcceso) : null;
mysqli_stmt_close($stmtAcceso);

if (!$acceso) {
    e_limpiar_sesion();
    e_redirigir('../index.php');
}

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

if ((int)$acceso['activo'] !== 1 || (!empty($acceso['fecha_expiracion']) && $hoy > (string)$acceso['fecha_expiracion'])) {
    e_limpiar_sesion();
    e_redirigir('../index.php');
}

if (!$esAdminGlobal) {
    if (
        $idConcursoAcceso <= 0 ||
        strtoupper((string)$acceso['concurso_estado']) !== 'ACTIVO' ||
        (!empty($acceso['fecha_inicio']) && $hoy < (string)$acceso['fecha_inicio']) ||
        (!empty($acceso['fecha_fin']) && $hoy > (string)$acceso['fecha_fin'])
    ) {
        e_limpiar_sesion();
        e_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();

$idEditar = (int)($_GET['id'] ?? ($_POST['id_concurso'] ?? 0));

if ($idEditar <= 0) {
    e_redirigir('concursos.php');
}

if (!$esAdminGlobal && $idEditar !== $idConcursoAcceso) {
    http_response_code(403);
    die('Acceso denegado. Este código solo puede editar su concurso asignado.');
}

e_asegurar_columnas_imagenes($conn);

$concurso = e_obtener_concurso($conn, $idEditar);

if (!$concurso) {
    e_redirigir('concursos.php');
}

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

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

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $csrfPost = e_post('csrf_token');
    $nombre = e_post('nombre');
    $subtitulo = e_post('subtitulo');
    $anio = e_int(e_post('anio'), (int)date('Y'));
    $descripcion = e_post('descripcion');
    $fechaInicio = e_post('fecha_inicio') !== '' ? e_post('fecha_inicio') : null;
    $fechaFin = e_post('fecha_fin') !== '' ? e_post('fecha_fin') : null;
    $estado = e_post('estado', 'ACTIVO');
    $quitarCabeceraCompleta = isset($_POST['quitar_cabecera_completa']) && (string)$_POST['quitar_cabecera_completa'] === '1';
    $gruposPost = $_POST['grupos'] ?? [];
    $salonesPost = $_POST['salones'] ?? [];
    $agregarSalonesPost = $_POST['agregar_salones'] ?? [];

    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 ($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 (!e_estado_valido($estado)) {
        $mensajeError = 'Estado inválido.';
    } else {
        $configGrupos = [];
        $configSalones = [];
        $configAgregarSalones = [];

        if (is_array($gruposPost)) {
            foreach ($gruposPost as $idGrupoRaw => $g) {
                if (!is_array($g)) {
                    continue;
                }

                $idGrupo = (int)$idGrupoRaw;
                $total = e_int($g['total_preguntas'] ?? '', 15);
                $buena = e_decimal($g['puntos_correcta'] ?? '', 10.00);
                $mala = e_decimal($g['penalizacion_incorrecta'] ?? '', 2.00);
                $blanco = e_decimal($g['puntos_blanco'] ?? '', 0.00);
                $estadoGrupo = isset($g['estado']) && (string)$g['estado'] === '1' ? 1 : 0;

                if ($idGrupo <= 0 || $total <= 0 || $buena <= 0 || $mala < 0 || $blanco < 0) {
                    $mensajeError = 'Hay una configuración inválida en grados.';
                    break;
                }

                $configGrupos[] = [
                    'id_grupo' => $idGrupo,
                    'total' => $total,
                    'buena' => $buena,
                    'mala' => $mala,
                    'blanco' => $blanco,
                    'estado' => $estadoGrupo
                ];
            }
        }

        if ($mensajeError === '' && is_array($salonesPost)) {
            foreach ($salonesPost as $idSalonRaw => $s) {
                if (!is_array($s)) {
                    continue;
                }

                $idSalon = (int)$idSalonRaw;
                $capacidad = e_int($s['capacidad'] ?? '', E_MAX_CUPO_SALON);
                $estadoSalon = isset($s['estado']) && (string)$s['estado'] === '1' ? 1 : 0;

                if ($idSalon <= 0 || $capacidad <= 0 || $capacidad > E_MAX_CUPO_SALON) {
                    $mensajeError = 'La capacidad de los salones debe estar entre 1 y ' . E_MAX_CUPO_SALON . '.';
                    break;
                }

                $configSalones[] = [
                    'id_salon' => $idSalon,
                    'capacidad' => $capacidad,
                    'estado' => $estadoSalon
                ];
            }
        }

        if ($mensajeError === '' && is_array($agregarSalonesPost)) {
            foreach ($agregarSalonesPost as $idGrupoRaw => $datosAgregar) {
                if (!is_array($datosAgregar)) {
                    continue;
                }

                $idGrupoAgregar = (int)$idGrupoRaw;
                $cantidadAgregar = e_int($datosAgregar['cantidad'] ?? '', 0);
                $capacidadAgregar = e_int($datosAgregar['capacidad'] ?? '', E_MAX_CUPO_SALON);

                if ($cantidadAgregar <= 0) {
                    continue;
                }

                if ($idGrupoAgregar <= 0 || $cantidadAgregar > E_MAX_SALONES_AGREGAR) {
                    $mensajeError = 'La cantidad de salones nuevos debe estar entre 1 y ' . E_MAX_SALONES_AGREGAR . ' por grado.';
                    break;
                }

                if ($capacidadAgregar <= 0 || $capacidadAgregar > E_MAX_CUPO_SALON) {
                    $mensajeError = 'La capacidad de los salones nuevos debe estar entre 1 y ' . E_MAX_CUPO_SALON . '.';
                    break;
                }

                $configAgregarSalones[] = [
                    'id_grupo' => $idGrupoAgregar,
                    'cantidad' => $cantidadAgregar,
                    'capacidad' => $capacidadAgregar
                ];
            }
        }

        if ($mensajeError === '') {
            try {
                mysqli_begin_transaction($conn);

                $cabeceraCompleta = $quitarCabeceraCompleta ? null : e_cabecera_actual($concurso);
                $cabeceraCompleta = e_subir_imagen_concurso('cabecera_completa', $cabeceraCompleta, 'cabecera_' . $idEditar);

                if (!empty($configGrupos)) {
                    $primerGrupo = $configGrupos[0];
                    $totalDefault = (int)$primerGrupo['total'];
                    $buenaDefault = (float)$primerGrupo['buena'];
                    $malaDefault = (float)$primerGrupo['mala'];
                    $blancoDefault = (float)$primerGrupo['blanco'];
                } else {
                    $totalDefault = (int)($concurso['total_preguntas_default'] ?? 15);
                    $buenaDefault = (float)($concurso['puntos_correcta_default'] ?? 10);
                    $malaDefault = (float)($concurso['penalizacion_incorrecta_default'] ?? 2);
                    $blancoDefault = (float)($concurso['puntos_blanco_default'] ?? 0);
                }

                $stmtUpdateConcurso = mysqli_prepare($conn, "
                    UPDATE concursos
                    SET
                        nombre = ?,
                        subtitulo = ?,
                        anio = ?,
                        descripcion = ?,
                        cabecera_completa = ?,
                        logo_principal = NULL,
                        logo_secundario = NULL,
                        imagen_banner = NULL,
                        total_preguntas_default = ?,
                        puntos_correcta_default = ?,
                        penalizacion_incorrecta_default = ?,
                        puntos_blanco_default = ?,
                        fecha_inicio = ?,
                        fecha_fin = ?,
                        estado = ?
                    WHERE id_concurso = ?
                    LIMIT 1
                ");

                if (!$stmtUpdateConcurso) {
                    throw new RuntimeException('No se pudo preparar la actualización del concurso.');
                }

                mysqli_stmt_bind_param(
                    $stmtUpdateConcurso,
                    'ssissidddsssi',
                    $nombre,
                    $subtitulo,
                    $anio,
                    $descripcion,
                    $cabeceraCompleta,
                    $totalDefault,
                    $buenaDefault,
                    $malaDefault,
                    $blancoDefault,
                    $fechaInicio,
                    $fechaFin,
                    $estado,
                    $idEditar
                );

                if (!mysqli_stmt_execute($stmtUpdateConcurso)) {
                    $error = mysqli_stmt_error($stmtUpdateConcurso);
                    mysqli_stmt_close($stmtUpdateConcurso);
                    throw new RuntimeException('No se pudo actualizar el concurso. ' . $error);
                }

                mysqli_stmt_close($stmtUpdateConcurso);

                foreach ($configGrupos as $cfg) {
                    $stmtGrupo = mysqli_prepare($conn, "
                        UPDATE concurso_grupos
                        SET
                            total_preguntas = ?,
                            puntos_correcta = ?,
                            penalizacion_incorrecta = ?,
                            puntos_blanco = ?,
                            estado = ?
                        WHERE id_grupo = ?
                          AND id_concurso = ?
                        LIMIT 1
                    ");

                    if (!$stmtGrupo) {
                        throw new RuntimeException('No se pudo preparar la actualización de grados.');
                    }

                    mysqli_stmt_bind_param($stmtGrupo, 'idddiii', $cfg['total'], $cfg['buena'], $cfg['mala'], $cfg['blanco'], $cfg['estado'], $cfg['id_grupo'], $idEditar);

                    if (!mysqli_stmt_execute($stmtGrupo)) {
                        $error = mysqli_stmt_error($stmtGrupo);
                        mysqli_stmt_close($stmtGrupo);
                        throw new RuntimeException('No se pudo actualizar un grado. ' . $error);
                    }

                    mysqli_stmt_close($stmtGrupo);
                }

                foreach ($configSalones as $salon) {
                    $stmtSalon = mysqli_prepare($conn, "
                        UPDATE concurso_salones
                        SET
                            capacidad = ?,
                            estado = ?
                        WHERE id_salon = ?
                          AND id_concurso = ?
                        LIMIT 1
                    ");

                    if (!$stmtSalon) {
                        throw new RuntimeException('No se pudo preparar la actualización de salones.');
                    }

                    mysqli_stmt_bind_param($stmtSalon, 'iiii', $salon['capacidad'], $salon['estado'], $salon['id_salon'], $idEditar);

                    if (!mysqli_stmt_execute($stmtSalon)) {
                        $error = mysqli_stmt_error($stmtSalon);
                        mysqli_stmt_close($stmtSalon);
                        throw new RuntimeException('No se pudo actualizar un salón. ' . $error);
                    }

                    mysqli_stmt_close($stmtSalon);
                }

                $salonesNuevosCreados = 0;

                foreach ($configAgregarSalones as $nuevoSalonCfg) {
                    $idGrupoNuevo = (int)$nuevoSalonCfg['id_grupo'];
                    $cantidadNueva = (int)$nuevoSalonCfg['cantidad'];
                    $capacidadNueva = (int)$nuevoSalonCfg['capacidad'];

                    $stmtGrupoNuevo = mysqli_prepare($conn, "
                        SELECT id_grupo, nivel, grado_orden, nombre
                        FROM concurso_grupos
                        WHERE id_concurso = ?
                          AND id_grupo = ?
                        LIMIT 1
                    ");

                    if (!$stmtGrupoNuevo) {
                        throw new RuntimeException('No se pudo validar el grado para agregar salones.');
                    }

                    mysqli_stmt_bind_param($stmtGrupoNuevo, 'ii', $idEditar, $idGrupoNuevo);
                    mysqli_stmt_execute($stmtGrupoNuevo);
                    $resGrupoNuevo = mysqli_stmt_get_result($stmtGrupoNuevo);
                    $grupoNuevo = $resGrupoNuevo instanceof mysqli_result ? mysqli_fetch_assoc($resGrupoNuevo) : null;
                    mysqli_stmt_close($stmtGrupoNuevo);

                    if (!$grupoNuevo) {
                        throw new RuntimeException('Uno de los grados seleccionados para nuevos salones no existe.');
                    }

                    $stmtMaxOrden = mysqli_prepare($conn, "
                        SELECT COALESCE(MAX(orden), 0) AS max_orden
                        FROM concurso_salones
                        WHERE id_concurso = ?
                          AND id_grupo = ?
                    ");

                    if (!$stmtMaxOrden) {
                        throw new RuntimeException('No se pudo calcular el último salón.');
                    }

                    mysqli_stmt_bind_param($stmtMaxOrden, 'ii', $idEditar, $idGrupoNuevo);
                    mysqli_stmt_execute($stmtMaxOrden);
                    $resMaxOrden = mysqli_stmt_get_result($stmtMaxOrden);
                    $rowMaxOrden = $resMaxOrden instanceof mysqli_result ? mysqli_fetch_assoc($resMaxOrden) : null;
                    mysqli_stmt_close($stmtMaxOrden);

                    $ordenInicio = (int)($rowMaxOrden['max_orden'] ?? 0);
                    $prefijoConcurso = e_prefijo_concurso($conn, $idEditar);
                    $codigoBaseGrado = e_codigo_grado((string)$grupoNuevo['nivel'], (int)$grupoNuevo['grado_orden']);
                    $fechaExpiracionSalon = $fechaFin ?: ((string)($concurso['fecha_fin'] ?? '') ?: date('Y-m-d', strtotime('+365 days')));

                    for ($i = 1; $i <= $cantidadNueva; $i++) {
                        $ordenNuevo = $ordenInicio + $i;
                        $letraNueva = e_letra_salon($ordenNuevo);
                        $codigoSalonNuevo = $prefijoConcurso . '-' . $codigoBaseGrado . '-' . $letraNueva;
                        $nombreSalonNuevo = 'SALÓN ' . $letraNueva;

                        if (e_codigo_existe($conn, $codigoSalonNuevo)) {
                            throw new RuntimeException('Ya existe el código ' . $codigoSalonNuevo . '. No se puede crear salón duplicado.');
                        }

                        $idSalonNuevo = e_insertar_salon(
                            $conn,
                            $idEditar,
                            $idGrupoNuevo,
                            $codigoSalonNuevo,
                            $nombreSalonNuevo,
                            $letraNueva,
                            $capacidadNueva,
                            $ordenNuevo
                        );

                        e_insertar_acceso_salon(
                            $conn,
                            $idEditar,
                            $idGrupoNuevo,
                            $idSalonNuevo,
                            $codigoSalonNuevo,
                            'Responsable ' . (string)$grupoNuevo['nombre'] . ' - ' . $nombreSalonNuevo,
                            $fechaExpiracionSalon
                        );

                        $salonesNuevosCreados++;
                    }
                }

                e_auditar($conn, $idEditar, null, $idAccesoSesion, null, 'CONCURSO_EDITADO', 'Concurso editado desde administración. Salones nuevos creados: ' . $salonesNuevosCreados);
                mysqli_commit($conn);

                $_SESSION['csrf_admin_editar_concurso'] = bin2hex(random_bytes(32));
                $csrf = (string)$_SESSION['csrf_admin_editar_concurso'];
                $mensajeOk = 'Concurso actualizado correctamente.';
                if (!empty($salonesNuevosCreados)) {
                    $mensajeOk .= ' Salones nuevos creados: ' . $salonesNuevosCreados . '.';
                }
                $concurso = e_obtener_concurso($conn, $idEditar) ?: $concurso;
            } catch (Throwable $e) {
                mysqli_rollback($conn);
                $mensajeError = $e->getMessage();
            }
        }
    }
}

$grupos = e_obtener_grupos($conn, $idEditar);
$salones = e_obtener_salones($conn, $idEditar);
$rolTexto = $esAdminGlobal ? 'ADMIN_GLOBAL' : 'ADMIN DE CONCURSO';
$idConcursoMenu = $idEditar;
?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Editar concurso | NOBEX</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <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=5">
    <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;
            --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}
        .topbar h1{margin:0;font-size:27px;font-weight:950;letter-spacing:-.035em;display:flex;align-items:center;gap:12px}
        .topbar h1::before{content:"\f044";font-family:"Font Awesome 6 Free";font-weight:900;width:52px;height:52px;border-radius:17px;display:inline-flex;align-items:center;justify-content:center;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.22);font-size:22px}
        .topbar p{margin:6px 0 0 64px;color:#fde68a;font-weight:900;font-size:14px;line-height:1.35}
        .topbar a{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)}
        .topbar a::before{content:"\f060";font-family:"Font Awesome 6 Free";font-weight:900}.topbar a:hover{background:rgba(255,255,255,.18)}
        .container{max-width:1440px;margin:24px auto;padding:0 18px 42px}
        .alert-ok,.alert-error,.alert-info{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)}
        .alert-ok::before,.alert-error::before,.alert-info::before{font-family:"Bootstrap Icons";font-size:18px;margin-top:1px}.alert-ok::before{content:"\F26B"}.alert-error::before{content:"\F33A"}.alert-info::before{content:"\F430"}
        .alert-ok{background:#dcfce7;color:#166534;border:1px solid #bbf7d0}.alert-error{background:#fee2e2;color:#991b1b;border:1px solid #fecaca}.alert-info{background:#eff6ff;color:#1e40af;border:1px solid #bfdbfe}
        .summary-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:0 0 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-blue{background:#dbeafe;color:#1d4ed8}.summary-green{background:#dcfce7;color:#166534}.summary-yellow{background:#fef3c7;color:#92400e}.summary-red{background:#fee2e2;color:#991b1b}
        .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}
        .grid{display:grid;grid-template-columns:minmax(390px,455px) 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 h2{margin:0 0 14px;font-size:22px;font-weight:950;letter-spacing:-.03em;display:flex;align-items:center;gap:10px}.card h2::before{content:"\f013";font-family:"Font Awesome 6 Free";font-weight:900;width:42px;height:42px;border-radius:15px;display:inline-flex;align-items:center;justify-content:center;background:#fee2e2;color:#dc2626;font-size:18px}.card:nth-child(2) h2::before{content:"\f52b"}
        .muted{color:#64748b;line-height:1.5;font-size:14px;font-weight:700}.row2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
        label{display:block;font-weight:900;margin:14px 0 7px;color:#1f2937;font-size:13px}label::first-letter{text-transform:uppercase}
        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:96px;resize:vertical}input:focus,select:focus,textarea:focus{border-color:#dc2626;box-shadow:0 0 0 4px rgba(220,38,38,.12)}
        .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:900px}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}
        .inp-small{max-width:118px;min-height:40px;padding:9px 10px;border-radius:12px}.grado{font-weight:950;color:#0f172a;white-space:nowrap}
        button{width:100%;border:0;border-radius:17px;background:linear-gradient(135deg,#1d4ed8,#2563eb);color:#fff;font-weight:950;padding:14px 16px;margin-top:18px;cursor:pointer;font-size:15px;display:flex;justify-content:center;align-items:center;gap:9px;box-shadow:0 14px 28px rgba(37,99,235,.24)}button::before{content:"\f0c7";font-family:"Font Awesome 6 Free";font-weight:900}button:hover{background:linear-gradient(135deg,#1e40af,#1d4ed8)}button:disabled{background:#9ca3af;cursor:not-allowed;box-shadow:none}
        .btn-secondary{display:flex;justify-content:center;align-items:center;gap:9px;background:linear-gradient(135deg,#475569,#1f2937);color:#fff;text-decoration:none;border-radius:17px;padding:14px 16px;font-weight:950;margin-top:9px}.btn-secondary::before{content:"\f00d";font-family:"Font Awesome 6 Free";font-weight:900}.btn-secondary:hover{background:#111827}
        .switch-select{min-width:82px;min-height:40px;padding:8px 10px;border-radius:999px;font-weight:900}.table-tools{display:flex;gap:10px;flex-wrap:wrap;margin:10px 0 14px}.table-search{max-width:320px;min-width:230px;flex:1;position:relative}.table-search i{position:absolute;left:13px;top:50%;transform:translateY(-50%);color:#64748b}.table-search input{padding-left:40px;min-height:42px}.table-note{margin-top:12px;padding:12px 14px;border-radius:16px;background:#fff7ed;color:#9a3412;border:1px solid #fed7aa;font-size:13px;font-weight:900;line-height:1.45}
        @media(max-width:1100px){.grid{grid-template-columns:1fr}.summary-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:700px){.topbar-inner{flex-direction:column;align-items:flex-start}.topbar h1{font-size:23px}.topbar p{margin-left:0}.row2{grid-template-columns:1fr}.summary-grid{grid-template-columns:1fr}.card{padding:18px}}
    </style>
</head>
<body class="cn-con-sidebar">

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

<header class="topbar">
    <div class="topbar-inner">
        <div>
            <h1>Editar concurso</h1>
            <p>
                ID concurso: <?php echo e_h($concurso['id_concurso']); ?> |
                <?php echo e_h($concurso['nombre']); ?> <?php echo e_h($concurso['subtitulo']); ?> |
                Acceso: <?php echo e_h($rolTexto); ?>
            </p>
        </div>
        <a href="concursos.php">Volver a concursos</a>
    </div>
</header>

<main class="container">
    <?php if ($mensajeOk !== ''): ?>
        <div class="alert-ok"><?php echo e_h($mensajeOk); ?></div>
    <?php endif; ?>

    <?php if ($mensajeError !== ''): ?>
        <div class="alert-error"><?php echo e_h($mensajeError); ?></div>
    <?php endif; ?>

    <?php if ($esAdminGlobal): ?>
        <div class="alert-info">Estás editando como administrador global. Este acceso no está ligado a un concurso fijo.</div>
    <?php endif; ?>

    <?php
        $salonesActivosVista = 0;
        $capacidadTotalVista = 0;
        foreach ($salones as $sVista) {
            if ((int)($sVista['estado'] ?? 0) === 1) {
                $salonesActivosVista++;
            }
            $capacidadTotalVista += max(1, min(E_MAX_CUPO_SALON, (int)($sVista['capacidad'] ?? 0)));
        }
    ?>

    <div class="summary-grid">
        <div class="summary-card"><div class="summary-icon summary-blue"><i class="fa-solid fa-calendar-days"></i></div><div><strong><?php echo e_h($concurso['anio']); ?></strong><span>Año</span></div></div>
        <div class="summary-card"><div class="summary-icon summary-green"><i class="fa-solid fa-layer-group"></i></div><div><strong><?php echo e_h(count($grupos)); ?></strong><span>Grados</span></div></div>
        <div class="summary-card"><div class="summary-icon summary-yellow"><i class="fa-solid fa-door-open"></i></div><div><strong><?php echo e_h($salonesActivosVista . '/' . count($salones)); ?></strong><span>Salones activos</span></div></div>
        <div class="summary-card"><div class="summary-icon summary-red"><i class="fa-solid fa-users"></i></div><div><strong><?php echo e_h($capacidadTotalVista); ?></strong><span>Capacidad total</span></div></div>
    </div>

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

        <div class="grid">
            <section class="card">
                <h2>Datos generales</h2>

                <label>Nombre</label>
                <input type="text" name="nombre" maxlength="180" value="<?php echo e_h($concurso['nombre']); ?>" required>

                <label>Subtítulo</label>
                <input type="text" name="subtitulo" maxlength="180" value="<?php echo e_h($concurso['subtitulo']); ?>" required>

                <div class="row2">
                    <div>
                        <label>Año</label>
                        <input type="number" name="anio" min="2020" max="2100" value="<?php echo e_h($concurso['anio']); ?>" required>
                    </div>
                    <div>
                        <label>Estado</label>
                        <select name="estado">
                            <option value="BORRADOR" <?php echo $concurso['estado'] === 'BORRADOR' ? 'selected' : ''; ?>>BORRADOR</option>
                            <option value="ACTIVO" <?php echo $concurso['estado'] === 'ACTIVO' ? 'selected' : ''; ?>>ACTIVO</option>
                            <option value="CERRADO" <?php echo $concurso['estado'] === 'CERRADO' ? 'selected' : ''; ?>>CERRADO</option>
                            <option value="ANULADO" <?php echo $concurso['estado'] === 'ANULADO' ? 'selected' : ''; ?>>ANULADO</option>
                        </select>
                    </div>
                </div>

                <label>Descripción</label>
                <textarea name="descripcion"><?php echo e_h($concurso['descripcion'] ?? ''); ?></textarea>

                <label>Imagen única de cabecera</label>
                <?php $cabeceraActual = e_cabecera_actual($concurso); ?>

                <div class="image-single">
                    <div class="image-preview-wide">
                        <?php if ($cabeceraActual !== ''): ?>
                            <img src="<?php echo e_h(e_url_imagen_admin($cabeceraActual)); ?>" alt="Cabecera completa del concurso">
                        <?php else: ?>
                            <div class="no-image">
                                <i class="fa-regular fa-image"></i>
                                <span>Sin cabecera cargada</span>
                            </div>
                        <?php endif; ?>
                    </div>

                    <div class="image-actions">
                        <input type="file" name="cabecera_completa" accept="image/png,image/jpeg,image/webp,image/gif">

                        <?php if ($cabeceraActual !== ''): ?>
                            <label class="check-remove">
                                <input type="checkbox" name="quitar_cabecera_completa" value="1">
                                Quitar cabecera actual
                            </label>
                        <?php endif; ?>

                        <p class="muted">
                            Sube una sola imagen horizontal para todo el encabezado del PDF/resultados.
                            Recomendado: <strong>3000 × 300 px</strong> o proporción aproximada <strong>10:1</strong>.
                            Formatos permitidos: JPG, PNG, WEBP o GIF. Tamaño máximo: 5 MB.
                        </p>
                    </div>
                </div>

                <div class="row2">
                    <div>
                        <label>Fecha inicio</label>
                        <input type="date" name="fecha_inicio" value="<?php echo e_h($concurso['fecha_inicio'] ?? ''); ?>">
                    </div>
                    <div>
                        <label>Fecha fin</label>
                        <input type="date" name="fecha_fin" value="<?php echo e_h($concurso['fecha_fin'] ?? ''); ?>">
                    </div>
                </div>

                <p class="muted">El estado controla si el concurso queda disponible para sus códigos de acceso.</p>

                <button type="submit" id="btnGuardar">Guardar cambios</button>
                <a class="btn-secondary" href="concursos.php">Cancelar</a>
            </section>

            <section>
                <div class="card">
                    <h2>Configuración por grado</h2>
                    <p class="muted">Puedes cambiar preguntas, puntaje por buena, penalización por mala, blanco y estado de cada grado.</p>

                    <div class="table-tools">
                        <div class="table-search"><i class="fa-solid fa-magnifying-glass"></i><input type="text" id="buscarGrado" placeholder="Buscar grado..."></div>
                    </div>

                    <div class="tabla-wrap">
                        <table id="tablaGrados">
                            <thead>
                                <tr>
                                    <th>Grado</th>
                                    <th>Preguntas</th>
                                    <th>Buena</th>
                                    <th>Mala</th>
                                    <th>Blanco</th>
                                    <th>Activo</th>
                                </tr>
                            </thead>
                            <tbody>
                                <?php foreach ($grupos as $g): ?>
                                    <tr>
                                        <td class="grado"><?php echo e_h($g['nombre']); ?></td>
                                        <td><input class="inp-small campo-entero" type="number" min="1" name="grupos[<?php echo e_h($g['id_grupo']); ?>][total_preguntas]" value="<?php echo e_h($g['total_preguntas']); ?>"></td>
                                        <td><input class="inp-small campo-decimal" type="text" name="grupos[<?php echo e_h($g['id_grupo']); ?>][puntos_correcta]" value="<?php echo e_h($g['puntos_correcta']); ?>"></td>
                                        <td><input class="inp-small campo-decimal" type="text" name="grupos[<?php echo e_h($g['id_grupo']); ?>][penalizacion_incorrecta]" value="<?php echo e_h($g['penalizacion_incorrecta']); ?>"></td>
                                        <td><input class="inp-small campo-decimal" type="text" name="grupos[<?php echo e_h($g['id_grupo']); ?>][puntos_blanco]" value="<?php echo e_h($g['puntos_blanco']); ?>"></td>
                                        <td>
                                            <select class="switch-select" name="grupos[<?php echo e_h($g['id_grupo']); ?>][estado]">
                                                <option value="1" <?php echo (int)$g['estado'] === 1 ? 'selected' : ''; ?>>Sí</option>
                                                <option value="0" <?php echo (int)$g['estado'] === 0 ? 'selected' : ''; ?>>No</option>
                                            </select>
                                        </td>
                                    </tr>
                                <?php endforeach; ?>

                                <?php if (empty($grupos)): ?>
                                    <tr>
                                        <td colspan="6">Este concurso todavía no tiene grados registrados.</td>
                                    </tr>
                                <?php endif; ?>
                            </tbody>
                        </table>
                    </div>
                </div>

                <div class="card">
                    <h2>Salones</h2>
                    <p class="muted">Puedes cambiar capacidad o desactivar un salón sin eliminarlo. Máximo permitido: <?php echo E_MAX_CUPO_SALON; ?> participantes.</p>

                    <div class="table-tools">
                        <div class="table-search"><i class="fa-solid fa-magnifying-glass"></i><input type="text" id="buscarSalon" placeholder="Buscar salón, grado o código..."></div>
                    </div>

                    <div class="tabla-wrap">
                        <table id="tablaSalones">
                            <thead>
                                <tr>
                                    <th>Grado</th>
                                    <th>Salón</th>
                                    <th>Código</th>
                                    <th>Capacidad</th>
                                    <th>Activo</th>
                                </tr>
                            </thead>
                            <tbody>
                                <?php foreach ($salones as $s): ?>
                                    <?php $capacidadActual = max(1, min(E_MAX_CUPO_SALON, (int)$s['capacidad'])); ?>
                                    <tr>
                                        <td class="grado"><?php echo e_h($s['grupo_nombre']); ?></td>
                                        <td><?php echo e_h($s['nombre_salon']); ?></td>
                                        <td><?php echo e_h($s['codigo_salon']); ?></td>
                                        <td>
                                            <input class="inp-small campo-capacidad" type="number" min="1" max="<?php echo E_MAX_CUPO_SALON; ?>" name="salones[<?php echo e_h($s['id_salon']); ?>][capacidad]" value="<?php echo e_h($capacidadActual); ?>">
                                        </td>
                                        <td>
                                            <select class="switch-select" name="salones[<?php echo e_h($s['id_salon']); ?>][estado]">
                                                <option value="1" <?php echo (int)$s['estado'] === 1 ? 'selected' : ''; ?>>Sí</option>
                                                <option value="0" <?php echo (int)$s['estado'] === 0 ? 'selected' : ''; ?>>No</option>
                                            </select>
                                        </td>
                                    </tr>
                                <?php endforeach; ?>

                                <?php if (empty($salones)): ?>
                                    <tr>
                                        <td colspan="5">Este concurso todavía no tiene salones registrados.</td>
                                    </tr>
                                <?php endif; ?>
                            </tbody>
                        </table>
                    </div>
                </div>

                <div class="card">
                    <h2>Agregar más salones</h2>
                    <p class="muted">
                        Escribe cuántos salones nuevos quieres agregar por grado. El sistema continuará la secuencia automáticamente:
                        A, B, C... Z, AA, AB...
                    </p>

                    <div class="tabla-wrap">
                        <table id="tablaAgregarSalones">
                            <thead>
                                <tr>
                                    <th>Grado</th>
                                    <th>Salones nuevos</th>
                                    <th>Capacidad por nuevo salón</th>
                                </tr>
                            </thead>
                            <tbody>
                                <?php foreach ($grupos as $g): ?>
                                    <tr>
                                        <td class="grado"><?php echo e_h($g['nombre']); ?></td>
                                        <td>
                                            <input
                                                class="inp-small campo-agregar-salones"
                                                type="text"
                                                inputmode="numeric"
                                                name="agregar_salones[<?php echo e_h($g['id_grupo']); ?>][cantidad]"
                                                value=""
                                                placeholder="0"
                                            >
                                        </td>
                                        <td>
                                            <input
                                                class="inp-small campo-capacidad"
                                                type="text"
                                                inputmode="numeric"
                                                name="agregar_salones[<?php echo e_h($g['id_grupo']); ?>][capacidad]"
                                                value="<?php echo E_MAX_CUPO_SALON >= 30 ? '30' : e_h(E_MAX_CUPO_SALON); ?>"
                                            >
                                        </td>
                                    </tr>
                                <?php endforeach; ?>

                                <?php if (empty($grupos)): ?>
                                    <tr>
                                        <td colspan="3">Primero debe existir al menos un grado.</td>
                                    </tr>
                                <?php endif; ?>
                            </tbody>
                        </table>
                    </div>

                    <div class="table-note">
                        No elimina salones anteriores. Solo agrega nuevos salones y genera también su código de acceso.
                    </div>
                </div>
            </section>
        </div>
    </form>
</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 frm = document.getElementById('frmEditarConcurso');
    const fechaInicio = document.querySelector('input[name="fecha_inicio"]');
    const fechaFin = document.querySelector('input[name="fecha_fin"]');
    const btnGuardar = document.getElementById('btnGuardar');
    const maxCupoSalon = <?php echo (int)E_MAX_CUPO_SALON; ?>;
    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 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();
            tabla.querySelectorAll('tbody tr').forEach(function (fila) {
                fila.style.display = fila.textContent.toLowerCase().includes(q) ? '' : 'none';
            });
        });
    }

    function marcarSelectEstado(select) {
        if (!select) return;
        const activo = select.value === '1';
        select.style.borderColor = activo ? '#bbf7d0' : '#fecaca';
        select.style.background = activo ? '#f0fdf4' : '#fef2f2';
        select.style.color = activo ? '#166534' : '#991b1b';
    }

    document.querySelectorAll('.switch-select').forEach(function (select) {
        marcarSelectEstado(select);
        select.addEventListener('change', function () { marcarSelectEstado(select); });
    });

    document.querySelectorAll('.campo-decimal').forEach(function (input) {
        input.addEventListener('blur', function () {
            const valor = String(input.value || '').replace(',', '.').trim();
            if (valor !== '' && !Number.isNaN(Number(valor))) {
                input.value = Number(valor).toFixed(2);
            }
        });
    });

    document.querySelectorAll('.campo-entero,.campo-capacidad,.campo-agregar-salones').forEach(function (input) {
        input.addEventListener('input', function () {
            input.value = input.value.replace(/\D/g, '');
            if (input.classList.contains('campo-capacidad')) {
                const n = Number(input.value || 0);
                if (n > maxCupoSalon) input.value = String(maxCupoSalon);
            }

            if (input.classList.contains('campo-agregar-salones')) {
                const n = Number(input.value || 0);
                if (n > <?php echo (int)E_MAX_SALONES_AGREGAR; ?>) input.value = String(<?php echo (int)E_MAX_SALONES_AGREGAR; ?>);
            }
        });
    });

    filtrarTabla('buscarGrado', 'tablaGrados');
    filtrarTabla('buscarSalon', 'tablaSalones');

    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;
            }

            let error = '';
            document.querySelectorAll('.campo-capacidad').forEach(function (input) {
                const n = Number(input.value || 0);
                if (!error && (n < 1 || n > maxCupoSalon)) {
                    error = 'La capacidad de los salones debe estar entre 1 y ' + maxCupoSalon + '.';
                    input.focus();
                }
            });
            document.querySelectorAll('.campo-entero').forEach(function (input) {
                const n = Number(input.value || 0);
                if (!error && n <= 0) {
                    error = 'El número de preguntas debe ser mayor que cero.';
                    input.focus();
                }
            });
            document.querySelectorAll('.campo-decimal').forEach(function (input) {
                const valor = String(input.value || '').replace(',', '.').trim();
                if (!error && (valor === '' || Number.isNaN(Number(valor)) || Number(valor) < 0)) {
                    error = 'Revisa los puntajes. Solo se permiten números positivos o cero.';
                    input.focus();
                }
            });

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

            event.preventDefault();
            Swal.fire({
                icon:'question',
                title:'¿Guardar cambios?',
                text:'Se actualizará el concurso, la cabecera, los grados y los salones.',
                showCancelButton:true,
                confirmButtonText:'Sí, guardar',
                cancelButtonText:'Cancelar',
                confirmButtonColor:'#1d4ed8',
                cancelButtonColor:'#64748b'
            }).then(function (result) {
                if (result.isConfirmed) {
                    enviando = true;
                    if (btnGuardar) {
                        btnGuardar.disabled = true;
                        btnGuardar.innerHTML = '<i class="fa-solid fa-spinner fa-spin"></i> Guardando...';
                    }
                    frm.submit();
                }
            });
        });
    }

    if (mensajeError) {
        swalMensaje(mensajeError, 'error', 'Error');
    } else if (mensajeOk) {
        swalMensaje(mensajeOk, 'success', 'Actualizado');
    }
});
</script>

</body>
</html>
