<?php
// concurso_nobel/corregir_salon.php
// Módulo administrativo para corregir salón, nombre de institución o eliminar físicamente participante NOBEX.
// Corrige concurso_participantes y, si ya tiene calificación, también concurso_resultados cuando corresponde.
// La eliminación borra físicamente de concurso_resultados y concurso_participantes.

declare(strict_types=1);

session_start();

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

date_default_timezone_set('America/Lima');

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

function cs_upper(string $valor): string
{
    $valor = trim($valor);
    return function_exists('mb_strtoupper') ? mb_strtoupper($valor, 'UTF-8') : strtoupper($valor);
}

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

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

function cs_stmt_bind(mysqli_stmt $stmt, string $types, array $params): bool
{
    $refs = [];
    $refs[] = $stmt;
    $refs[] = $types;

    foreach ($params as $key => $value) {
        $refs[] = &$params[$key];
    }

    return (bool)call_user_func_array('mysqli_stmt_bind_param', $refs);
}

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


function cs_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 instanceof mysqli_result && mysqli_num_rows($res) > 0;
}

function cs_columna_estado_anulable_NO_USAR(mysqli $conn, string $tabla): string
{
    $tablaSql = mysqli_real_escape_string($conn, $tabla);
    $res = @mysqli_query($conn, "SHOW COLUMNS FROM `{$tablaSql}` LIKE 'estado'");

    if (!$res instanceof mysqli_result) {
        throw new RuntimeException('No se pudo verificar la columna estado de la tabla ' . $tabla . '.');
    }

    $row = mysqli_fetch_assoc($res);

    if (!$row) {
        throw new RuntimeException('La tabla ' . $tabla . ' no tiene columna estado.');
    }

    $tipo = (string)($row['Type'] ?? '');

    // Si es enum, usar un valor existente para no romper por restricción.
    if (preg_match('/^enum\((.*)\)$/i', $tipo, $m)) {
        preg_match_all("/'((?:[^'\\\\]|\\\\.)*)'/", $m[1], $matches);
        $permitidos = array_map(
            static fn($v) => strtoupper(str_replace("\\'", "'", $v)),
            $matches[1] ?? []
        );

        foreach (['ANULADO', 'ELIMINADO', 'INACTIVO', 'CERRADO'] as $candidato) {
            if (in_array($candidato, $permitidos, true)) {
                return $candidato;
            }
        }

        throw new RuntimeException('La columna estado de ' . $tabla . ' no tiene un valor permitido para anular. Valores actuales: ' . implode(', ', $permitidos));
    }

    // Si no es enum, usamos ANULADO.
    return 'ANULADO';
}

function cs_obtener_salon(mysqli $conn, int $idConcurso, int $idSalon): ?array
{
    if ($idConcurso <= 0 || $idSalon <= 0) {
        return null;
    }

    $stmt = mysqli_prepare($conn, "
        SELECT
            s.id_salon,
            s.id_concurso,
            s.id_grupo,
            s.codigo_salon,
            s.nombre_salon,
            s.capacidad,
            g.nombre AS grupo_nombre,
            g.nivel AS grupo_nivel,
            COUNT(p.id_participante) AS ocupados
        FROM concurso_salones s
        INNER JOIN concurso_grupos g
            ON g.id_grupo = s.id_grupo
        LEFT JOIN concurso_participantes p
            ON p.id_salon = s.id_salon
           AND p.estado = 'ACTIVO'
        WHERE s.id_concurso = ?
          AND s.id_salon = ?
          AND s.estado = 1
        GROUP BY
            s.id_salon,
            s.id_concurso,
            s.id_grupo,
            s.codigo_salon,
            s.nombre_salon,
            s.capacidad,
            g.nombre,
            g.nivel
        LIMIT 1
    ");

    if (!$stmt) {
        return null;
    }

    mysqli_stmt_bind_param($stmt, 'ii', $idConcurso, $idSalon);
    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 cs_listar_salones(mysqli $conn, int $idConcurso): array
{
    $items = [];

    if ($idConcurso <= 0) {
        return $items;
    }

    $stmt = mysqli_prepare($conn, "
        SELECT
            g.id_grupo,
            g.nombre AS grupo_nombre,
            g.nivel AS grupo_nivel,
            s.id_salon,
            s.codigo_salon,
            s.nombre_salon,
            s.capacidad,
            s.orden,
            COUNT(p.id_participante) AS ocupados
        FROM concurso_grupos g
        INNER JOIN concurso_salones s
            ON s.id_grupo = g.id_grupo
           AND s.id_concurso = g.id_concurso
        LEFT JOIN concurso_participantes p
            ON p.id_salon = s.id_salon
           AND p.estado = 'ACTIVO'
        WHERE g.id_concurso = ?
          AND s.estado = 1
        GROUP BY
            g.id_grupo,
            g.nombre,
            g.nivel,
            s.id_salon,
            s.codigo_salon,
            s.nombre_salon,
            s.capacidad,
            s.orden
        ORDER BY
            g.id_grupo ASC,
            s.orden ASC,
            s.nombre_salon ASC
    ");

    if (!$stmt) {
        return $items;
    }

    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 cs_buscar_participantes(mysqli $conn, int $idConcurso, string $q): array
{
    $q = trim($q);
    $items = [];

    if ($idConcurso <= 0 || $q === '') {
        return $items;
    }

    $sql = "
        SELECT
            p.id_participante,
            p.id_concurso,
            p.id_grupo,
            p.id_salon,
            p.codigo_participante,
            p.documento,
            p.apellidos_nombres,
            p.apellido_paterno,
            p.apellido_materno,
            p.nombres,
            p.institucion_educativa,
            p.tipo_institucion,
            p.codigo_modular_ie,
            p.nivel_modalidad_ie,
            p.estado,
            p.created_at,
            p.updated_at,
            g.nombre AS grupo_nombre,
            g.nivel AS grupo_nivel,
            s.codigo_salon,
            s.nombre_salon,
            r.id_resultado,
            r.correctas,
            r.incorrectas,
            r.blanco,
            r.puntaje,
            r.tiempo_texto
        FROM concurso_participantes p
        LEFT JOIN concurso_grupos g
            ON g.id_grupo = p.id_grupo
        LEFT JOIN concurso_salones s
            ON s.id_salon = p.id_salon
        LEFT JOIN concurso_resultados r
            ON r.id_participante = p.id_participante
           AND r.estado = 'ACTIVO'
        WHERE p.id_concurso = ?
          AND p.estado = 'ACTIVO'
          AND (
                p.documento = ?
             OR p.codigo_participante = ?
             OR p.apellidos_nombres LIKE CONCAT('%', ?, '%')
          )
        ORDER BY
            CASE WHEN p.documento = ? THEN 0 ELSE 1 END,
            p.apellidos_nombres ASC,
            p.id_participante DESC
        LIMIT 20
    ";

    $stmt = mysqli_prepare($conn, $sql);

    if (!$stmt) {
        return $items;
    }

    mysqli_stmt_bind_param($stmt, 'issss', $idConcurso, $q, $q, $q, $q);
    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 cs_obtener_participante(mysqli $conn, int $idConcurso, int $idParticipante): ?array
{
    if ($idConcurso <= 0 || $idParticipante <= 0) {
        return null;
    }

    $stmt = mysqli_prepare($conn, "
        SELECT
            p.id_participante,
            p.id_concurso,
            p.id_grupo,
            p.id_salon,
            p.codigo_participante,
            p.documento,
            p.apellidos_nombres,
            p.apellido_paterno,
            p.apellido_materno,
            p.nombres,
            p.institucion_educativa,
            p.tipo_institucion,
            p.codigo_modular_ie,
            p.nivel_modalidad_ie,
            p.estado,
            p.created_at,
            p.updated_at,
            g.nombre AS grupo_nombre,
            g.nivel AS grupo_nivel,
            s.codigo_salon,
            s.nombre_salon,
            r.id_resultado,
            r.correctas,
            r.incorrectas,
            r.blanco,
            r.puntaje,
            r.tiempo_texto
        FROM concurso_participantes p
        LEFT JOIN concurso_grupos g
            ON g.id_grupo = p.id_grupo
        LEFT JOIN concurso_salones s
            ON s.id_salon = p.id_salon
        LEFT JOIN concurso_resultados r
            ON r.id_participante = p.id_participante
           AND r.estado = 'ACTIVO'
        WHERE p.id_concurso = ?
          AND p.id_participante = ?
          AND p.estado = 'ACTIVO'
        LIMIT 1
    ");

    if (!$stmt) {
        return null;
    }

    mysqli_stmt_bind_param($stmt, 'ii', $idConcurso, $idParticipante);
    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 cs_recalcular_puestos_categoria(mysqli $conn, int $idConcurso, int $idGrupo, string $tipoInstitucion): void
{
    if ($idConcurso <= 0 || $idGrupo <= 0 || !in_array($tipoInstitucion, ['PRIVADA', 'PUBLICA'], true)) {
        return;
    }

    $stmt = mysqli_prepare($conn, "
        SELECT r.id_resultado
        FROM concurso_resultados r
        INNER JOIN concurso_participantes p
            ON p.id_participante = r.id_participante
        WHERE r.id_concurso = ?
          AND r.id_grupo = ?
          AND r.estado = 'ACTIVO'
          AND p.estado = 'ACTIVO'
          AND p.tipo_institucion = ?
        ORDER BY
          r.puntaje DESC,
          (r.tiempo_segundos IS NULL) ASC,
          r.tiempo_segundos ASC,
          r.correctas DESC,
          r.incorrectas ASC,
          r.id_resultado ASC
    ");

    if (!$stmt) {
        return;
    }

    mysqli_stmt_bind_param($stmt, 'iis', $idConcurso, $idGrupo, $tipoInstitucion);
    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);

    $puesto = 1;

    if ($res instanceof mysqli_result) {
        while ($row = mysqli_fetch_assoc($res)) {
            $idResultado = (int)$row['id_resultado'];

            $up = mysqli_prepare($conn, "
                UPDATE concurso_resultados
                SET puesto = ?
                WHERE id_resultado = ?
                LIMIT 1
            ");

            if ($up) {
                mysqli_stmt_bind_param($up, 'ii', $puesto, $idResultado);
                mysqli_stmt_execute($up);
                mysqli_stmt_close($up);
            }

            $puesto++;
        }
    }

    mysqli_stmt_close($stmt);
}

function cs_recalcular_puestos_grupo(mysqli $conn, int $idConcurso, int $idGrupo): void
{
    cs_recalcular_puestos_categoria($conn, $idConcurso, $idGrupo, 'PRIVADA');
    cs_recalcular_puestos_categoria($conn, $idConcurso, $idGrupo, 'PUBLICA');
}

$acceso = cn_validar_acceso($conn, 'index.php');

if (!cn_es_admin($acceso)) {
    http_response_code(403);
    die('Solo el administrador puede corregir salón o eliminar participantes.');
}

$idAcceso = (int)$acceso['id_acceso'];
$idConcurso = cn_concurso_trabajo($conn, $acceso);

if (isset($_GET['id_concurso']) && is_numeric($_GET['id_concurso'])) {
    $idConcurso = (int)$_GET['id_concurso'];
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['id_concurso']) && is_numeric($_POST['id_concurso'])) {
    $idConcurso = (int)$_POST['id_concurso'];
}

$concursosActivos = cn_concursos_activos($conn);

if ($idConcurso <= 0 && !empty($concursosActivos)) {
    $idConcurso = (int)$concursosActivos[0]['id_concurso'];
}

if ($idConcurso <= 0) {
    http_response_code(500);
    die('No hay concurso activo disponible.');
}

$concursoTrabajo = cn_datos_concurso($conn, $idConcurso);

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

$csrf = (string)$_SESSION['csrf_corregir_salon_nobex'];
$mensajeOk = '';
$mensajeError = '';
$q = cs_get('q');
$participantes = [];
$participanteSeleccionado = null;

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $accion = cs_post('accion');
    $csrfPost = cs_post('csrf_token');

    if (!hash_equals($csrf, $csrfPost)) {
        $mensajeError = 'Solicitud no válida. Recarga la página.';
    } elseif ($accion === 'buscar') {
        $q = cs_post('q');
        $participantes = cs_buscar_participantes($conn, $idConcurso, $q);

        if (count($participantes) === 1) {
            $participanteSeleccionado = $participantes[0];
        } elseif (count($participantes) === 0) {
            $mensajeError = 'No se encontró ningún participante activo con ese DNI, código o nombre.';
        }
    } elseif ($accion === 'seleccionar') {
        $idParticipante = (int)cs_post('id_participante');
        $participanteSeleccionado = cs_obtener_participante($conn, $idConcurso, $idParticipante);

        if (!$participanteSeleccionado) {
            $mensajeError = 'No se encontró el participante seleccionado.';
        }
    } elseif ($accion === 'corregir') {
        $idParticipante = (int)cs_post('id_participante');
        $idSalonNuevo = (int)cs_post('id_salon_nuevo');
        $motivo = trim(cs_post('motivo'));
        $forzarCupo = cs_post('forzar_cupo') === '1';

        try {
            if ($idParticipante <= 0) {
                throw new RuntimeException('Selecciona un participante válido.');
            }

            if ($idSalonNuevo <= 0) {
                throw new RuntimeException('Selecciona el nuevo salón.');
            }

            if ($motivo === '') {
                throw new RuntimeException('Escribe el motivo de la corrección.');
            }

            $participante = cs_obtener_participante($conn, $idConcurso, $idParticipante);

            if (!$participante) {
                throw new RuntimeException('El participante no existe o está inactivo.');
            }

            $salonNuevo = cs_obtener_salon($conn, $idConcurso, $idSalonNuevo);

            if (!$salonNuevo) {
                throw new RuntimeException('El nuevo salón no existe, está inactivo o no pertenece al concurso.');
            }

            $idSalonActual = (int)($participante['id_salon'] ?? 0);
            $idGrupoActual = (int)($participante['id_grupo'] ?? 0);
            $idGrupoNuevo = (int)$salonNuevo['id_grupo'];
            $tieneResultado = !empty($participante['id_resultado']);

            if ($idSalonActual === $idSalonNuevo) {
                throw new RuntimeException('El participante ya pertenece a ese salón.');
            }

            if ($tieneResultado && $idGrupoActual !== $idGrupoNuevo) {
                throw new RuntimeException('Este participante ya tiene calificación. Por seguridad solo se puede mover entre salones del mismo grado/grupo. Si necesitas cambiar de grado, primero revisa su calificación.');
            }

            $ocupados = (int)$salonNuevo['ocupados'];
            $capacidad = (int)$salonNuevo['capacidad'];

            if (!$forzarCupo && $capacidad > 0 && $ocupados >= $capacidad) {
                throw new RuntimeException('El salón destino ya no tiene cupos. Marca "Forzar cupo" solo si estás seguro de corregirlo administrativamente.');
            }

            mysqli_begin_transaction($conn);

            $stmtPart = mysqli_prepare($conn, "
                UPDATE concurso_participantes
                SET
                    id_grupo = ?,
                    id_salon = ?,
                    id_acceso_registro = ?,
                    observacion = TRIM(CONCAT(COALESCE(observacion, ''), '\nCORRECCIÓN DE SALÓN: ', ?)),
                    updated_at = NOW()
                WHERE id_participante = ?
                  AND id_concurso = ?
                  AND estado = 'ACTIVO'
                LIMIT 1
            ");

            if (!$stmtPart) {
                throw new RuntimeException('No se pudo preparar la corrección del participante.');
            }

            $detalleObs = 'Movido de salón ID ' . $idSalonActual . ' a salón ID ' . $idSalonNuevo . '. Motivo: ' . $motivo;
            mysqli_stmt_bind_param($stmtPart, 'iiisii', $idGrupoNuevo, $idSalonNuevo, $idAcceso, $detalleObs, $idParticipante, $idConcurso);

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

            mysqli_stmt_close($stmtPart);

            if ($tieneResultado) {
                $stmtRes = mysqli_prepare($conn, "
                    UPDATE concurso_resultados
                    SET
                        id_grupo = ?,
                        id_salon = ?,
                        id_acceso_registro = ?,
                        observacion = TRIM(CONCAT(COALESCE(observacion, ''), '\nCORRECCIÓN DE SALÓN: ', ?)),
                        updated_at = NOW()
                    WHERE id_participante = ?
                      AND id_concurso = ?
                      AND estado = 'ACTIVO'
                ");

                if (!$stmtRes) {
                    throw new RuntimeException('No se pudo preparar la corrección de resultados.');
                }

                mysqli_stmt_bind_param($stmtRes, 'iiisii', $idGrupoNuevo, $idSalonNuevo, $idAcceso, $detalleObs, $idParticipante, $idConcurso);

                if (!mysqli_stmt_execute($stmtRes)) {
                    $error = mysqli_stmt_error($stmtRes);
                    mysqli_stmt_close($stmtRes);
                    throw new RuntimeException('No se pudo actualizar la calificación/resultados. ' . $error);
                }

                mysqli_stmt_close($stmtRes);
            }

            cn_auditar(
                $conn,
                $idConcurso,
                $idGrupoNuevo,
                $idAcceso,
                $idParticipante,
                'SALON_CORREGIDO_ADMIN',
                'Participante: ' . $participante['apellidos_nombres']
                . ' | Documento: ' . $participante['documento']
                . ' | De salón: ' . ($participante['nombre_salon'] ?: 'SIN SALÓN')
                . ' | A salón: ' . $salonNuevo['nombre_salon']
                . ' | Motivo: ' . $motivo
            );

            mysqli_commit($conn);

            if ($tieneResultado) {
                cs_recalcular_puestos_grupo($conn, $idConcurso, $idGrupoActual);
                if ($idGrupoActual !== $idGrupoNuevo) {
                    cs_recalcular_puestos_grupo($conn, $idConcurso, $idGrupoNuevo);
                }
            }

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

            $mensajeOk = 'Salón corregido correctamente. '
                . $participante['apellidos_nombres']
                . ' fue movido a '
                . $salonNuevo['nombre_salon']
                . '.';

            $q = (string)$participante['documento'];
            $participanteSeleccionado = cs_obtener_participante($conn, $idConcurso, $idParticipante);
            $participantes = [];
        } catch (Throwable $e) {
            mysqli_rollback($conn);
            $mensajeError = $e->getMessage();
            $participanteSeleccionado = isset($idParticipante) && $idParticipante > 0
                ? cs_obtener_participante($conn, $idConcurso, $idParticipante)
                : null;
        }
    } elseif ($accion === 'corregir_institucion') {
        $idParticipante = (int)cs_post('id_participante');
        $institucionNueva = cs_upper(cs_post('institucion_educativa_nueva'));
        $motivoInstitucion = trim(cs_post('motivo_institucion'));

        try {
            if ($idParticipante <= 0) {
                throw new RuntimeException('Selecciona un participante válido.');
            }

            if ($institucionNueva === '') {
                throw new RuntimeException('Escribe el nombre correcto de la institución educativa.');
            }

            if (mb_strlen($institucionNueva, 'UTF-8') < 3) {
                throw new RuntimeException('El nombre de la institución educativa es demasiado corto.');
            }

            if ($motivoInstitucion === '') {
                throw new RuntimeException('Escribe el motivo de la corrección del nombre de la institución.');
            }

            $participante = cs_obtener_participante($conn, $idConcurso, $idParticipante);

            if (!$participante) {
                throw new RuntimeException('El participante no existe o está inactivo.');
            }

            $idGrupoActual = (int)($participante['id_grupo'] ?? 0);
            $institucionAnterior = (string)($participante['institucion_educativa'] ?? '');

            if (cs_upper($institucionAnterior) === $institucionNueva) {
                throw new RuntimeException('No hay cambios para guardar. El nombre de la institución es el mismo.');
            }

            $detalleObs = 'Nombre de I.E. anterior: ' . ($institucionAnterior ?: 'SIN INSTITUCIÓN')
                . ' | Nombre de I.E. nuevo: ' . $institucionNueva
                . ' | Motivo: ' . $motivoInstitucion;

            mysqli_begin_transaction($conn);

            $stmtPart = mysqli_prepare($conn, "
                UPDATE concurso_participantes
                SET
                    institucion_educativa = ?,
                    id_acceso_registro = ?,
                    observacion = TRIM(CONCAT(COALESCE(observacion, ''), '\nCORRECCIÓN DE NOMBRE DE I.E.: ', ?)),
                    updated_at = NOW()
                WHERE id_participante = ?
                  AND id_concurso = ?
                  AND estado = 'ACTIVO'
                LIMIT 1
            ");

            if (!$stmtPart) {
                throw new RuntimeException('No se pudo preparar la corrección del nombre de la institución.');
            }

            mysqli_stmt_bind_param(
                $stmtPart,
                'sisii',
                $institucionNueva,
                $idAcceso,
                $detalleObs,
                $idParticipante,
                $idConcurso
            );

            if (!mysqli_stmt_execute($stmtPart)) {
                $error = mysqli_stmt_error($stmtPart);
                mysqli_stmt_close($stmtPart);
                throw new RuntimeException('No se pudo actualizar el nombre de la institución. ' . $error);
            }

            $afectadosPart = mysqli_stmt_affected_rows($stmtPart);
            mysqli_stmt_close($stmtPart);

            if ($afectadosPart <= 0) {
                throw new RuntimeException('No se guardó ningún cambio. Verifica si el nombre ya estaba actualizado.');
            }

            cn_auditar(
                $conn,
                $idConcurso,
                $idGrupoActual,
                $idAcceso,
                $idParticipante,
                'NOMBRE_INSTITUCION_PARTICIPANTE_CORREGIDO',
                'Participante: ' . $participante['apellidos_nombres']
                . ' | Documento: ' . $participante['documento']
                . ' | ' . $detalleObs
            );

            mysqli_commit($conn);

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

            $mensajeOk = 'Nombre de institución corregido correctamente para '
                . $participante['apellidos_nombres']
                . '.';

            $q = (string)$participante['documento'];
            $participanteSeleccionado = cs_obtener_participante($conn, $idConcurso, $idParticipante);
            $participantes = [];
        } catch (Throwable $e) {
            mysqli_rollback($conn);
            $mensajeError = $e->getMessage();
            $participanteSeleccionado = isset($idParticipante) && $idParticipante > 0
                ? cs_obtener_participante($conn, $idConcurso, $idParticipante)
                : null;
        }
    } elseif ($accion === 'anular') {
        $idParticipante = (int)cs_post('id_participante');
        $motivoEliminar = trim(cs_post('motivo_eliminar'));

        try {
            if ($idParticipante <= 0) {
                throw new RuntimeException('Selecciona un participante válido para eliminar.');
            }

            if ($motivoEliminar === '') {
                throw new RuntimeException('Escribe el motivo de eliminación.');
            }

            $participante = cs_obtener_participante($conn, $idConcurso, $idParticipante);

            if (!$participante) {
                throw new RuntimeException('El participante no existe o ya no está activo.');
            }

            $idGrupoActual = (int)($participante['id_grupo'] ?? 0);
            $idSalonActual = (int)($participante['id_salon'] ?? 0);
            $tieneResultado = !empty($participante['id_resultado']);

            mysqli_begin_transaction($conn);

            /*
             * ELIMINACIÓN FÍSICA:
             * 1. Se registra auditoría con id_participante NULL para no bloquear el DELETE si existe FK.
             * 2. Se limpian referencias antiguas en auditoría si existieran.
             * 3. Se elimina la calificación/resultado del participante.
             * 4. Se elimina el participante de concurso_participantes.
             */

            cn_auditar(
                $conn,
                $idConcurso,
                $idGrupoActual,
                $idAcceso,
                null,
                'PARTICIPANTE_ELIMINADO_FISICAMENTE',
                'Participante eliminado físicamente: ' . $participante['apellidos_nombres']
                . ' | ID participante: ' . $idParticipante
                . ' | Documento: ' . $participante['documento']
                . ' | Grupo: ' . ($participante['grupo_nombre'] ?: 'SIN GRUPO')
                . ' | Salón: ' . ($participante['nombre_salon'] ?: 'SIN SALÓN')
                . ' | Salón ID: ' . $idSalonActual
                . ' | Tenía resultado: ' . ($tieneResultado ? 'SI' : 'NO')
                . ' | Motivo: ' . $motivoEliminar
            );

            if (cs_tabla_existe($conn, 'concurso_auditoria')) {
                $stmtAud = mysqli_prepare($conn, "
                    UPDATE concurso_auditoria
                    SET id_participante = NULL
                    WHERE id_participante = ?
                ");

                if ($stmtAud) {
                    mysqli_stmt_bind_param($stmtAud, 'i', $idParticipante);
                    mysqli_stmt_execute($stmtAud);
                    mysqli_stmt_close($stmtAud);
                }
            }

            if (cs_tabla_existe($conn, 'concurso_resultados')) {
                $stmtRes = mysqli_prepare($conn, "
                    DELETE FROM concurso_resultados
                    WHERE id_participante = ?
                      AND id_concurso = ?
                ");

                if (!$stmtRes) {
                    throw new RuntimeException('No se pudo preparar el borrado de la calificación/resultados.');
                }

                mysqli_stmt_bind_param($stmtRes, 'ii', $idParticipante, $idConcurso);

                if (!mysqli_stmt_execute($stmtRes)) {
                    $error = mysqli_stmt_error($stmtRes);
                    mysqli_stmt_close($stmtRes);
                    throw new RuntimeException('No se pudo eliminar la calificación/resultados. ' . $error);
                }

                mysqli_stmt_close($stmtRes);
            }

            $stmtPart = mysqli_prepare($conn, "
                DELETE FROM concurso_participantes
                WHERE id_participante = ?
                  AND id_concurso = ?
                  AND estado = 'ACTIVO'
                LIMIT 1
            ");

            if (!$stmtPart) {
                throw new RuntimeException('No se pudo preparar el borrado del participante.');
            }

            mysqli_stmt_bind_param($stmtPart, 'ii', $idParticipante, $idConcurso);

            if (!mysqli_stmt_execute($stmtPart)) {
                $error = mysqli_stmt_error($stmtPart);
                mysqli_stmt_close($stmtPart);
                throw new RuntimeException('No se pudo eliminar el participante. ' . $error);
            }

            $afectadosPart = mysqli_stmt_affected_rows($stmtPart);
            mysqli_stmt_close($stmtPart);

            if ($afectadosPart <= 0) {
                throw new RuntimeException('No se pudo eliminar porque el participante ya no está activo o no pertenece al concurso.');
            }

            mysqli_commit($conn);

            if ($tieneResultado && $idGrupoActual > 0) {
                cs_recalcular_puestos_grupo($conn, $idConcurso, $idGrupoActual);
            }

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

            $mensajeOk = 'Participante eliminado físicamente de la tabla: '
                . $participante['apellidos_nombres']
                . ' | Documento: '
                . $participante['documento']
                . '. También se eliminaron sus resultados si existían.';

            $q = '';
            $participantes = [];
            $participanteSeleccionado = null;
        } catch (Throwable $e) {
            mysqli_rollback($conn);
            $mensajeError = $e->getMessage();
            $participanteSeleccionado = isset($idParticipante) && $idParticipante > 0
                ? cs_obtener_participante($conn, $idConcurso, $idParticipante)
                : null;
        }
    }
} elseif ($q !== '') {
    $participantes = cs_buscar_participantes($conn, $idConcurso, $q);

    if (count($participantes) === 1) {
        $participanteSeleccionado = $participantes[0];
    }
}

$salones = cs_listar_salones($conn, $idConcurso);

$salonesPorGrupo = [];
foreach ($salones as $salon) {
    $key = (string)$salon['id_grupo'];
    if (!isset($salonesPorGrupo[$key])) {
        $salonesPorGrupo[$key] = [
            'nombre' => (string)$salon['grupo_nombre'],
            'nivel' => (string)$salon['grupo_nivel'],
            'items' => []
        ];
    }
    $salonesPorGrupo[$key]['items'][] = $salon;
}

$nombreConcursoVista = $concursoTrabajo['nombre'] ?? ('Concurso ID ' . $idConcurso);
?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Corregir salón, nombre de institución y eliminar físicamente | 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;
            --gold:#facc15;
            --blue:#1d4ed8;
            --green:#16a34a;
            --orange:#ea580c;
            --ink:#0f172a;
            --muted:#64748b;
            --line:#e2e8f0;
            --soft:#f8fafc;
            --card:#fff;
            --shadow:0 22px 50px rgba(15,23,42,.10);
        }
        body{
            margin:0;
            min-height:100vh;
            font-family:Inter,Arial,Helvetica,sans-serif;
            background:
                radial-gradient(circle at top left,rgba(250,204,21,.16),transparent 32%),
                linear-gradient(135deg,#f8fafc 0%,#eef2ff 48%,#fff7ed 100%);
            color:var(--ink);
        }
        a{text-decoration:none;color:inherit}
        .topbar{
            color:#fff;
            background:
                radial-gradient(circle at 18% 0%,rgba(250,204,21,.28),transparent 28%),
                linear-gradient(135deg,#0f172a,#1f2937 52%,#991b1b);
            border-bottom:7px solid var(--gold);
            box-shadow:0 20px 50px rgba(15,23,42,.22);
        }
        .topbar-inner{
            max-width:1320px;
            margin:0 auto;
            padding:22px 18px;
            display:flex;
            justify-content:space-between;
            align-items:center;
            gap:16px;
        }
        .brand{display:flex;gap:14px;align-items:center}
        .brand-mark{
            width:56px;height:56px;border-radius:19px;
            display:flex;align-items:center;justify-content:center;
            background:rgba(255,255,255,.13);
            border:1px solid rgba(255,255,255,.22);
            font-size:24px;
        }
        .eyebrow{
            margin:0 0 5px;
            color:#fde68a;
            font-size:12px;
            font-weight:950;
            letter-spacing:.08em;
            text-transform:uppercase;
        }
        h1{
            margin:0;
            font-size:clamp(25px,3.2vw,36px);
            line-height:1.05;
            letter-spacing:-.04em;
            font-weight:950;
        }
        .topbar p{margin:7px 0 0;color:#e5e7eb;font-weight:850;font-size:14px}
        .top-actions{display:flex;gap:10px;flex-wrap:wrap;justify-content:flex-end}
        .btn-top{
            display:inline-flex;align-items:center;justify-content:center;gap:8px;
            border-radius:15px;padding:12px 15px;color:#fff;
            border:1px solid rgba(255,255,255,.28);
            background:rgba(255,255,255,.10);
            font-weight:950;white-space:nowrap;
        }
        .btn-top:hover{background:rgba(255,255,255,.18)}
        .container{max-width:1320px;margin:22px auto;padding:0 18px 42px}
        .grid{display:grid;grid-template-columns:410px 1fr;gap:18px;align-items:start}
        .card{
            background:rgba(255,255,255,.96);
            border:1px solid rgba(226,232,240,.95);
            border-radius:24px;
            box-shadow:var(--shadow);
            overflow:hidden;
        }
        .card-head{
            padding:18px 20px;
            border-bottom:1px solid var(--line);
            background:linear-gradient(135deg,#ffffff,#f8fafc);
        }
        .card-head h2{
            margin:0;
            font-size:19px;
            letter-spacing:-.02em;
            font-weight:950;
        }
        .card-head p{margin:6px 0 0;color:var(--muted);font-weight:750;line-height:1.45;font-size:13px}
        .card-body{padding:20px}
        .msg{
            border-radius:16px;
            padding:14px 16px;
            font-weight:850;
            line-height:1.5;
            margin-bottom:16px;
        }
        .ok{background:#dcfce7;color:#166534;border:1px solid #86efac}
        .error{background:#fee2e2;color:#991b1b;border:1px solid #fca5a5}
        .warn{background:#fef3c7;color:#92400e;border:1px solid #fcd34d}
        .danger-box{background:#fff1f2;color:#991b1b;border:1px solid #fecdd3}
        label{display:block;font-weight:950;color:#334155;margin-bottom:7px;font-size:13px}
        input,select,textarea{
            width:100%;
            border:1px solid #cbd5e1;
            border-radius:14px;
            padding:12px 13px;
            outline:none;
            font-size:14px;
            background:#fff;
            color:#0f172a;
        }
        textarea{min-height:86px;resize:vertical}
        input:focus,select:focus,textarea:focus{border-color:var(--blue);box-shadow:0 0 0 4px rgba(29,78,216,.12)}
        .field{margin-bottom:14px}
        .btn{
            border:0;
            border-radius:15px;
            padding:13px 16px;
            font-weight:950;
            cursor:pointer;
            display:inline-flex;
            align-items:center;
            justify-content:center;
            gap:8px;
        }
        .btn-primary{background:linear-gradient(135deg,#1d4ed8,#1e40af);color:#fff;box-shadow:0 12px 24px rgba(29,78,216,.18)}
        .btn-danger{background:linear-gradient(135deg,#dc2626,#991b1b);color:#fff;box-shadow:0 12px 24px rgba(220,38,38,.18)}
        .btn-soft{background:#f1f5f9;color:#334155;border:1px solid #e2e8f0}
        .btn-full{width:100%}
        .info-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px}
        .info{
            border:1px solid #e2e8f0;
            border-radius:18px;
            padding:13px;
            background:#f8fafc;
        }
        .info span{display:block;color:var(--muted);font-size:11px;font-weight:950;text-transform:uppercase;letter-spacing:.04em;margin-bottom:4px}
        .info strong{display:block;color:#0f172a;font-size:15px;font-weight:950;line-height:1.25}
        .participant-title{
            display:flex;
            justify-content:space-between;
            align-items:flex-start;
            gap:12px;
            margin-bottom:14px;
        }
        .participant-title h3{
            margin:0;
            font-size:22px;
            letter-spacing:-.03em;
            line-height:1.15;
        }
        .badge{
            display:inline-flex;
            align-items:center;
            justify-content:center;
            gap:6px;
            border-radius:999px;
            padding:7px 10px;
            font-size:12px;
            font-weight:950;
            white-space:nowrap;
        }
        .badge-red{background:#fee2e2;color:#991b1b}
        .badge-green{background:#dcfce7;color:#166534}
        .badge-blue{background:#dbeafe;color:#1d4ed8}
        .badge-gray{background:#f1f5f9;color:#475569}
        table{width:100%;border-collapse:separate;border-spacing:0 9px}
        th{
            text-align:left;
            font-size:11px;
            color:#64748b;
            text-transform:uppercase;
            letter-spacing:.05em;
            padding:0 10px;
        }
        td{
            background:#fff;
            border-top:1px solid #e2e8f0;
            border-bottom:1px solid #e2e8f0;
            padding:12px 10px;
            vertical-align:middle;
            font-weight:780;
            font-size:13px;
        }
        td:first-child{border-left:1px solid #e2e8f0;border-radius:14px 0 0 14px}
        td:last-child{border-right:1px solid #e2e8f0;border-radius:0 14px 14px 0;text-align:right}
        .muted{color:var(--muted)}
        .mini{font-size:12px;color:var(--muted);font-weight:800;line-height:1.45}
        .checkline{display:flex;gap:9px;align-items:flex-start;font-weight:850;color:#334155}
        .checkline input{width:auto;margin-top:3px}
        .section-title{
            margin:18px 0 10px;
            font-size:14px;
            font-weight:950;
            color:#334155;
            text-transform:uppercase;
            letter-spacing:.04em;
        }
        .danger-zone{
            margin-top:22px;
            padding-top:18px;
            border-top:2px dashed #fecdd3;
        }
        @media(max-width:950px){
            .topbar-inner{flex-direction:column;align-items:flex-start}
            .grid{grid-template-columns:1fr}
            .info-grid{grid-template-columns:1fr}
        }
    </style>
</head>
<body class="cn-con-sidebar">
<?php include __DIR__ . '/includes/sidebar_concurso.php'; ?>
<header class="topbar">
    <div class="topbar-inner">
        <div class="brand">
            <div class="brand-mark"><i class="fa-solid fa-right-left"></i></div>
            <div>
                <p class="eyebrow">NOBEX · Administración</p>
                <h1>Corregir salón, nombre de institución y eliminar físicamente</h1>
                <p><?php echo cs_h($nombreConcursoVista); ?> · corrige salón, nombre de institución o elimina físicamente registros de la tabla.</p>
            </div>
        </div>
        <div class="top-actions">
            <a class="btn-top" href="panel.php"><i class="fa-solid fa-table-columns"></i> Panel</a>
            <a class="btn-top" href="asignar_salon.php?id_concurso=<?php echo (int)$idConcurso; ?>"><i class="fa-solid fa-user-plus"></i> Asignar salón</a>
        </div>
    </div>
</header>

<main class="container">
    <?php if ($mensajeOk !== ''): ?>
        <div class="msg ok"><i class="fa-solid fa-circle-check"></i> <?php echo cs_h($mensajeOk); ?></div>
    <?php endif; ?>

    <?php if ($mensajeError !== ''): ?>
        <div class="msg error"><i class="fa-solid fa-triangle-exclamation"></i> <?php echo cs_h($mensajeError); ?></div>
    <?php endif; ?>

    <div class="grid">
        <section class="card">
            <div class="card-head">
                <h2>Buscar participante</h2>
                <p>Busca por DNI, código NOBEX o nombres. Luego corrige salón, nombre de institución o elimina físicamente el registro.</p>
            </div>
            <div class="card-body">
                <form method="post" action="">
                    <input type="hidden" name="csrf_token" value="<?php echo cs_h($csrf); ?>">
                    <input type="hidden" name="accion" value="buscar">

                    <?php if (count($concursosActivos) > 1): ?>
                        <div class="field">
                            <label for="id_concurso">Concurso</label>
                            <select name="id_concurso" id="id_concurso" onchange="this.form.submit()">
                                <?php foreach ($concursosActivos as $c): ?>
                                    <option value="<?php echo (int)$c['id_concurso']; ?>" <?php echo (int)$c['id_concurso'] === (int)$idConcurso ? 'selected' : ''; ?>>
                                        <?php echo cs_h($c['nombre'] ?? ('Concurso ID ' . $c['id_concurso'])); ?>
                                    </option>
                                <?php endforeach; ?>
                            </select>
                        </div>
                    <?php else: ?>
                        <input type="hidden" name="id_concurso" value="<?php echo (int)$idConcurso; ?>">
                    <?php endif; ?>

                    <div class="field">
                        <label for="q">DNI / Código / Nombre</label>
                        <input
                            type="text"
                            id="q"
                            name="q"
                            value="<?php echo cs_h($q); ?>"
                            placeholder="Ejemplo: 71234567"
                            autocomplete="off"
                            required
                        >
                    </div>

                    <button class="btn btn-primary btn-full" type="submit">
                        <i class="fa-solid fa-magnifying-glass"></i> Buscar participante
                    </button>
                </form>

                <?php if (count($participantes) > 1): ?>
                    <div class="section-title">Coincidencias encontradas</div>
                    <table>
                        <thead>
                            <tr>
                                <th>Participante</th>
                                <th>Actual</th>
                                <th></th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($participantes as $p): ?>
                                <tr>
                                    <td>
                                        <strong><?php echo cs_h($p['apellidos_nombres']); ?></strong>
                                        <div class="mini"><?php echo cs_h($p['documento']); ?> · <?php echo cs_h($p['institucion_educativa']); ?></div>
                                    </td>
                                    <td>
                                        <?php echo cs_h(($p['grupo_nombre'] ?: 'Sin grado') . ' · ' . ($p['nombre_salon'] ?: 'Sin salón')); ?>
                                    </td>
                                    <td>
                                        <form method="post" action="">
                                            <input type="hidden" name="csrf_token" value="<?php echo cs_h($csrf); ?>">
                                            <input type="hidden" name="accion" value="seleccionar">
                                            <input type="hidden" name="id_concurso" value="<?php echo (int)$idConcurso; ?>">
                                            <input type="hidden" name="id_participante" value="<?php echo (int)$p['id_participante']; ?>">
                                            <button class="btn btn-soft" type="submit">Elegir</button>
                                        </form>
                                    </td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>
                <?php endif; ?>

                <div class="msg warn" style="margin-top:16px;margin-bottom:0">
                    <i class="fa-solid fa-circle-info"></i>
                    La eliminación es física: borra el resultado si existe y luego borra el participante de concurso_participantes.
                </div>
            </div>
        </section>

        <section class="card">
            <div class="card-head">
                <h2>Acciones del participante</h2>
                <p>Verifica bien antes de confirmar. Toda corrección queda registrada en auditoría.</p>
            </div>
            <div class="card-body">
                <?php if (!$participanteSeleccionado): ?>
                    <div class="msg warn" style="margin-bottom:0">
                        <i class="fa-solid fa-arrow-left"></i>
                        Busca y selecciona un participante para corregir o eliminar.
                    </div>
                <?php else: ?>
                    <div class="participant-title">
                        <div>
                            <h3><?php echo cs_h($participanteSeleccionado['apellidos_nombres']); ?></h3>
                            <div class="mini">
                                Documento: <strong><?php echo cs_h($participanteSeleccionado['documento']); ?></strong>
                                · Código: <?php echo cs_h($participanteSeleccionado['codigo_participante']); ?>
                            </div>
                        </div>
                        <?php if (!empty($participanteSeleccionado['id_resultado'])): ?>
                            <span class="badge badge-green"><i class="fa-solid fa-check"></i> Calificado</span>
                        <?php else: ?>
                            <span class="badge badge-gray"><i class="fa-regular fa-clock"></i> Sin nota</span>
                        <?php endif; ?>
                    </div>

                    <div class="info-grid">
                        <div class="info">
                            <span>Grado / grupo actual</span>
                            <strong><?php echo cs_h($participanteSeleccionado['grupo_nombre'] ?: 'No definido'); ?></strong>
                        </div>
                        <div class="info">
                            <span>Salón actual</span>
                            <strong><?php echo cs_h($participanteSeleccionado['nombre_salon'] ?: 'No asignado'); ?></strong>
                        </div>
                        <div class="info">
                            <span>Institución</span>
                            <strong><?php echo cs_h($participanteSeleccionado['institucion_educativa']); ?></strong>
                        </div>
                    </div>

                    <?php if (!empty($participanteSeleccionado['id_resultado'])): ?>
                        <div class="info-grid">
                            <div class="info">
                                <span>Correctas</span>
                                <strong><?php echo (int)$participanteSeleccionado['correctas']; ?></strong>
                            </div>
                            <div class="info">
                                <span>Incorrectas / blanco</span>
                                <strong><?php echo (int)$participanteSeleccionado['incorrectas']; ?> / <?php echo (int)$participanteSeleccionado['blanco']; ?></strong>
                            </div>
                            <div class="info">
                                <span>Puntaje</span>
                                <strong><?php echo number_format((float)$participanteSeleccionado['puntaje'], 2, '.', ''); ?></strong>
                            </div>
                        </div>
                    <?php endif; ?>

                    <div class="section-title">Corregir nombre de institución</div>

                    <form method="post" action="" id="frmInstitucion">
                        <input type="hidden" name="csrf_token" value="<?php echo cs_h($csrf); ?>">
                        <input type="hidden" name="accion" value="corregir_institucion">
                        <input type="hidden" name="id_concurso" value="<?php echo (int)$idConcurso; ?>">
                        <input type="hidden" name="id_participante" value="<?php echo (int)$participanteSeleccionado['id_participante']; ?>">

                        <div class="field">
                            <label for="institucion_educativa_nueva">Nombre correcto de la institución educativa</label>
                            <input
                                type="text"
                                id="institucion_educativa_nueva"
                                name="institucion_educativa_nueva"
                                value="<?php echo cs_h($participanteSeleccionado['institucion_educativa']); ?>"
                                placeholder="Ejemplo: I.E.P. NOBEL INGENIEROS"
                                required
                            >
                            <div class="mini">Solo se corregirá el nombre escrito en la columna institucion_educativa. No cambia tipo, código modular, nivel, salón, grado ni puntaje.</div>
                        </div>

                        <div class="field">
                            <label for="motivo_institucion">Motivo de la corrección</label>
                            <textarea name="motivo_institucion" id="motivo_institucion" placeholder="Ejemplo: El nombre de la institución fue digitado incorrectamente." required></textarea>
                        </div>

                        <button class="btn btn-primary btn-full" type="submit">
                            <i class="fa-solid fa-school"></i> Confirmar corrección del nombre de institución
                        </button>
                    </form>

                    <div class="section-title">Corregir salón</div>

                    <form method="post" action="" id="frmCorregir">
                        <input type="hidden" name="csrf_token" value="<?php echo cs_h($csrf); ?>">
                        <input type="hidden" name="accion" value="corregir">
                        <input type="hidden" name="id_concurso" value="<?php echo (int)$idConcurso; ?>">
                        <input type="hidden" name="id_participante" value="<?php echo (int)$participanteSeleccionado['id_participante']; ?>">

                        <div class="field">
                            <label for="id_salon_nuevo">Nuevo salón correcto</label>
                            <select name="id_salon_nuevo" id="id_salon_nuevo">
                                <option value="">Seleccionar salón...</option>
                                <?php foreach ($salonesPorGrupo as $grupo): ?>
                                    <optgroup label="<?php echo cs_h($grupo['nombre'] . ($grupo['nivel'] ? ' · ' . $grupo['nivel'] : '')); ?>">
                                        <?php foreach ($grupo['items'] as $salon): ?>
                                            <?php
                                            $ocupados = (int)$salon['ocupados'];
                                            $capacidad = (int)$salon['capacidad'];
                                            $libres = max(0, $capacidad - $ocupados);
                                            $esActual = (int)$salon['id_salon'] === (int)$participanteSeleccionado['id_salon'];
                                            ?>
                                            <option
                                                value="<?php echo (int)$salon['id_salon']; ?>"
                                                <?php echo $esActual ? 'disabled' : ''; ?>
                                            >
                                                <?php echo cs_h($salon['nombre_salon']); ?>
                                                <?php echo cs_h($salon['codigo_salon'] ? ' · ' . $salon['codigo_salon'] : ''); ?>
                                                · Cupos: <?php echo $libres; ?>/<?php echo $capacidad; ?>
                                                <?php echo $esActual ? ' · ACTUAL' : ''; ?>
                                            </option>
                                        <?php endforeach; ?>
                                    </optgroup>
                                <?php endforeach; ?>
                            </select>
                            <div class="mini">Si el estudiante ya tiene calificación, solo se permitirá moverlo dentro del mismo grado/grupo.</div>
                        </div>

                        <div class="field">
                            <label for="motivo">Motivo de la corrección</label>
                            <textarea name="motivo" id="motivo" placeholder="Ejemplo: Se asignó por error al salón B, corresponde al salón A."></textarea>
                        </div>

                        <div class="field">
                            <label class="checkline">
                                <input type="checkbox" name="forzar_cupo" value="1">
                                <span>Forzar cupo si el salón destino está lleno. Usar solo cuando sea una corrección real.</span>
                            </label>
                        </div>

                        <button class="btn btn-primary btn-full" type="submit">
                            <i class="fa-solid fa-right-left"></i> Confirmar corrección de salón
                        </button>
                    </form>

                    <div class="danger-zone">
                        <div class="section-title" style="color:#991b1b">Eliminar participante</div>

                        <div class="msg danger-box">
                            <i class="fa-solid fa-triangle-exclamation"></i>
                            Esta opción elimina físicamente al participante de la tabla. Si tenía calificación, primero se eliminará su resultado.
                        </div>

                        <form method="post" action="" id="frmAnular">
                            <input type="hidden" name="csrf_token" value="<?php echo cs_h($csrf); ?>">
                            <input type="hidden" name="accion" value="anular">
                            <input type="hidden" name="id_concurso" value="<?php echo (int)$idConcurso; ?>">
                            <input type="hidden" name="id_participante" value="<?php echo (int)$participanteSeleccionado['id_participante']; ?>">

                            <div class="field">
                                <label for="motivo_eliminar">Motivo de eliminación</label>
                                <textarea name="motivo_eliminar" id="motivo_eliminar" placeholder="Ejemplo: El participante no corresponde a este concurso / fue registrado por error." required></textarea>
                            </div>

                            <button class="btn btn-danger btn-full" type="submit">
                                <i class="fa-solid fa-trash-can"></i> Eliminar físicamente participante
                            </button>
                        </form>
                    </div>
                <?php endif; ?>
            </div>
        </section>
    </div>
</main>

<script>
document.addEventListener('DOMContentLoaded', function () {
    const frmCorregir = document.getElementById('frmCorregir');
    const frmInstitucion = document.getElementById('frmInstitucion');
    const frmAnular = document.getElementById('frmAnular');
    const q = document.getElementById('q');

    if (q) {
        q.focus();
        q.addEventListener('input', function () {
            q.value = q.value.toUpperCase();
        });
    }

    ['institucion_educativa_nueva'].forEach(function (id) {
        const input = document.getElementById(id);
        if (input) {
            input.addEventListener('input', function () {
                input.value = input.value.toUpperCase();
            });
        }
    });

    if (frmCorregir) {
        frmCorregir.addEventListener('submit', function (e) {
            if (frmCorregir.dataset.confirmado === '1') {
                return;
            }

            const salon = document.getElementById('id_salon_nuevo');
            const motivo = document.getElementById('motivo');

            if (!salon || salon.value === '') {
                e.preventDefault();
                Swal.fire({
                    icon: 'warning',
                    title: 'Selecciona el nuevo salón',
                    text: 'Primero debes elegir el salón correcto.'
                });
                return;
            }

            if (!motivo || motivo.value.trim() === '') {
                e.preventDefault();
                Swal.fire({
                    icon: 'warning',
                    title: 'Motivo obligatorio',
                    text: 'Escribe el motivo de la corrección.'
                });
                return;
            }

            e.preventDefault();

            Swal.fire({
                icon: 'warning',
                title: '¿Corregir salón?',
                text: 'Se moverá al participante al nuevo salón seleccionado. Si ya tiene calificación, también se actualizará su salón en resultados.',
                showCancelButton: true,
                confirmButtonText: 'Sí, corregir',
                cancelButtonText: 'Cancelar',
                confirmButtonColor: '#1d4ed8',
                cancelButtonColor: '#64748b'
            }).then(function (result) {
                if (result.isConfirmed) {
                    frmCorregir.dataset.confirmado = '1';
                    frmCorregir.submit();
                }
            });
        });
    }

    if (frmInstitucion) {
        frmInstitucion.addEventListener('submit', function (e) {
            if (frmInstitucion.dataset.confirmado === '1') {
                return;
            }

            const institucion = document.getElementById('institucion_educativa_nueva');
            const motivo = document.getElementById('motivo_institucion');

            if (!institucion || institucion.value.trim() === '') {
                e.preventDefault();
                Swal.fire({
                    icon: 'warning',
                    title: 'Nombre obligatorio',
                    text: 'Escribe el nombre correcto de la institución educativa.'
                });
                return;
            }

            if (!motivo || motivo.value.trim() === '') {
                e.preventDefault();
                Swal.fire({
                    icon: 'warning',
                    title: 'Motivo obligatorio',
                    text: 'Escribe el motivo de la corrección.'
                });
                return;
            }

            e.preventDefault();

            Swal.fire({
                icon: 'warning',
                title: '¿Corregir nombre de institución?',
                text: 'Solo se cambiará el nombre escrito de la institución educativa. No se modificará tipo, código modular, nivel, salón, grado ni puntaje.',
                showCancelButton: true,
                confirmButtonText: 'Sí, corregir nombre',
                cancelButtonText: 'Cancelar',
                confirmButtonColor: '#1d4ed8',
                cancelButtonColor: '#64748b'
            }).then(function (result) {
                if (result.isConfirmed) {
                    frmInstitucion.dataset.confirmado = '1';
                    frmInstitucion.submit();
                }
            });
        });
    }

    if (frmAnular) {
        frmAnular.addEventListener('submit', function (e) {
            if (frmAnular.dataset.confirmado === '1') {
                return;
            }

            const motivo = document.getElementById('motivo_eliminar');

            if (!motivo || motivo.value.trim() === '') {
                e.preventDefault();
                Swal.fire({
                    icon: 'warning',
                    title: 'Motivo obligatorio',
                    text: 'Escribe el motivo de eliminación.'
                });
                return;
            }

            e.preventDefault();

            Swal.fire({
                icon: 'error',
                title: '¿Eliminar físicamente participante?',
                html: 'Esta acción borrará el participante de la tabla y también su resultado si existe.<br><strong>Quedará registrado en auditoría sin enlazar el ID eliminado.</strong>',
                showCancelButton: true,
                confirmButtonText: 'Sí, eliminar físicamente',
                cancelButtonText: 'Cancelar',
                confirmButtonColor: '#dc2626',
                cancelButtonColor: '#64748b'
            }).then(function (result) {
                if (result.isConfirmed) {
                    frmAnular.dataset.confirmado = '1';
                    frmAnular.submit();
                }
            });
        });
    }
});
</script>
</body>
</html>
