<?php
// concurso_nobel/panel.php
// Panel principal NOBEX.
// Compatible con ADMIN_GLOBAL sin concurso fijo y con accesos operativos ligados a concurso/grupo/salón.

declare(strict_types=1);

session_start();

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

date_default_timezone_set('America/Lima');

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

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

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

function nobex_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_concurso_trabajo'],
        $_SESSION['cn_admin_global'],
        $_SESSION['cn_tipo_acceso']
    );
}

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

    $ip = $_SERVER['REMOTE_ADDR'] ?? '';
    $userAgent = $_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,
        $userAgent
    );

    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);
}

function nobex_count_simple(mysqli $conn, string $sql): int
{
    $res = mysqli_query($conn, $sql);

    if (!$res) {
        return 0;
    }

    $row = mysqli_fetch_assoc($res);
    mysqli_free_result($res);

    return (int)($row['total'] ?? 0);
}

function nobex_count_i(mysqli $conn, string $sql, int $p1): int
{
    $stmt = mysqli_prepare($conn, $sql);

    if (!$stmt) {
        return 0;
    }

    mysqli_stmt_bind_param($stmt, 'i', $p1);

    if (!mysqli_stmt_execute($stmt)) {
        mysqli_stmt_close($stmt);
        return 0;
    }

    $res = mysqli_stmt_get_result($stmt);
    $row = $res ? mysqli_fetch_assoc($res) : null;
    mysqli_stmt_close($stmt);

    return (int)($row['total'] ?? 0);
}

function nobex_count_ii(mysqli $conn, string $sql, int $p1, int $p2): int
{
    $stmt = mysqli_prepare($conn, $sql);

    if (!$stmt) {
        return 0;
    }

    mysqli_stmt_bind_param($stmt, 'ii', $p1, $p2);

    if (!mysqli_stmt_execute($stmt)) {
        mysqli_stmt_close($stmt);
        return 0;
    }

    $res = mysqli_stmt_get_result($stmt);
    $row = $res ? mysqli_fetch_assoc($res) : null;
    mysqli_stmt_close($stmt);

    return (int)($row['total'] ?? 0);
}

function nobex_es_admin_global(array $acceso): bool
{
    $tipo = strtoupper(trim((string)($acceso['tipo_acceso'] ?? '')));
    $idConcurso = $acceso['id_concurso'];

    return $tipo === 'ADMIN_GLOBAL'
        || ((int)($acceso['puede_administrar'] ?? 0) === 1 && ($idConcurso === null || (int)$idConcurso === 0));
}

function nobex_concursos_activos(mysqli $conn): array
{
    $items = [];

    $res = mysqli_query($conn, "
        SELECT id_concurso, nombre, subtitulo, anio, estado, fecha_inicio, fecha_fin
        FROM concursos
        WHERE estado = 'ACTIVO'
        ORDER BY anio DESC, id_concurso DESC
    ");

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

        mysqli_free_result($res);
    }

    return $items;
}

function nobex_concurso_activo(mysqli $conn, int $idConcurso): ?array
{
    $stmt = mysqli_prepare($conn, "
        SELECT id_concurso, nombre, subtitulo, anio, estado, fecha_inicio, fecha_fin
        FROM concursos
        WHERE id_concurso = ?
          AND estado = 'ACTIVO'
        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 ? mysqli_fetch_assoc($res) : null;
    mysqli_stmt_close($stmt);

    return $row ?: null;
}

function nobex_resolver_concurso_trabajo(mysqli $conn, array $acceso, bool $puedeAdministrar): array
{
    $concursosActivos = nobex_concursos_activos($conn);
    $idTrabajo = 0;

    if ($puedeAdministrar) {
        $idSolicitado = (int)($_GET['id_concurso'] ?? $_POST['id_concurso'] ?? $_SESSION['cn_admin_concurso_trabajo'] ?? 0);

        if ($idSolicitado > 0 && nobex_concurso_activo($conn, $idSolicitado)) {
            $idTrabajo = $idSolicitado;
        } elseif (!nobex_es_admin_global($acceso) && (int)($acceso['id_concurso'] ?? 0) > 0 && nobex_concurso_activo($conn, (int)$acceso['id_concurso'])) {
            $idTrabajo = (int)$acceso['id_concurso'];
        } elseif (!empty($concursosActivos)) {
            $idTrabajo = (int)$concursosActivos[0]['id_concurso'];
        }

        if ($idTrabajo > 0) {
            $_SESSION['cn_admin_concurso_trabajo'] = $idTrabajo;
        } else {
            unset($_SESSION['cn_admin_concurso_trabajo']);
        }

        return [$idTrabajo, $concursosActivos];
    }

    $idTrabajo = (int)($acceso['id_concurso'] ?? 0);

    return [$idTrabajo, $concursosActivos];
}

function nobex_contar_grupos(mysqli $conn, int $idConcurso): int
{
    if ($idConcurso > 0) {
        return nobex_count_i($conn, "SELECT COUNT(*) AS total FROM concurso_grupos WHERE id_concurso = ? AND estado = 1", $idConcurso);
    }

    return nobex_count_simple($conn, "SELECT COUNT(*) AS total FROM concurso_grupos WHERE estado = 1");
}

function nobex_contar_salones(mysqli $conn, int $idConcurso, int $idGrupo): int
{
    if ($idConcurso > 0 && $idGrupo > 0) {
        return nobex_count_ii(
            $conn,
            "SELECT COUNT(*) AS total FROM concurso_salones WHERE id_concurso = ? AND id_grupo = ? AND estado = 1",
            $idConcurso,
            $idGrupo
        );
    }

    if ($idConcurso > 0) {
        return nobex_count_i(
            $conn,
            "SELECT COUNT(*) AS total FROM concurso_salones WHERE id_concurso = ? AND estado = 1",
            $idConcurso
        );
    }

    return nobex_count_simple($conn, "SELECT COUNT(*) AS total FROM concurso_salones WHERE estado = 1");
}

function nobex_contar_participantes(mysqli $conn, int $idConcurso, int $idGrupo, int $idSalon): int
{
    if ($idConcurso > 0 && $idSalon > 0) {
        return nobex_count_ii(
            $conn,
            "SELECT COUNT(*) AS total FROM concurso_participantes WHERE id_concurso = ? AND id_salon = ? AND estado = 'ACTIVO'",
            $idConcurso,
            $idSalon
        );
    }

    if ($idConcurso > 0 && $idGrupo > 0) {
        return nobex_count_ii(
            $conn,
            "SELECT COUNT(*) AS total FROM concurso_participantes WHERE id_concurso = ? AND id_grupo = ? AND estado = 'ACTIVO'",
            $idConcurso,
            $idGrupo
        );
    }

    if ($idConcurso > 0) {
        return nobex_count_i(
            $conn,
            "SELECT COUNT(*) AS total FROM concurso_participantes WHERE id_concurso = ? AND estado = 'ACTIVO'",
            $idConcurso
        );
    }

    return nobex_count_simple($conn, "SELECT COUNT(*) AS total FROM concurso_participantes WHERE estado = 'ACTIVO'");
}

function nobex_contar_resultados(mysqli $conn, int $idConcurso, int $idGrupo, int $idSalon): int
{
    if ($idConcurso > 0 && $idSalon > 0) {
        return nobex_count_ii(
            $conn,
            "SELECT COUNT(*) AS total FROM concurso_resultados WHERE id_concurso = ? AND id_salon = ? AND estado = 'ACTIVO'",
            $idConcurso,
            $idSalon
        );
    }

    if ($idConcurso > 0 && $idGrupo > 0) {
        return nobex_count_ii(
            $conn,
            "SELECT COUNT(*) AS total FROM concurso_resultados WHERE id_concurso = ? AND id_grupo = ? AND estado = 'ACTIVO'",
            $idConcurso,
            $idGrupo
        );
    }

    if ($idConcurso > 0) {
        return nobex_count_i(
            $conn,
            "SELECT COUNT(*) AS total FROM concurso_resultados WHERE id_concurso = ? AND estado = 'ACTIVO'",
            $idConcurso
        );
    }

    return nobex_count_simple($conn, "SELECT COUNT(*) AS total FROM concurso_resultados WHERE estado = 'ACTIVO'");
}

function nobex_contar_pendientes(mysqli $conn, int $idConcurso, int $idGrupo): int
{
    if ($idConcurso > 0 && $idGrupo > 0) {
        return nobex_count_ii(
            $conn,
            "SELECT COUNT(*) AS total FROM concurso_participantes WHERE id_concurso = ? AND id_grupo = ? AND id_salon IS NULL AND estado = 'ACTIVO'",
            $idConcurso,
            $idGrupo
        );
    }

    if ($idConcurso > 0) {
        return nobex_count_i(
            $conn,
            "SELECT COUNT(*) AS total FROM concurso_participantes WHERE id_concurso = ? AND id_salon IS NULL AND estado = 'ACTIVO'",
            $idConcurso
        );
    }

    return nobex_count_simple($conn, "SELECT COUNT(*) AS total FROM concurso_participantes WHERE id_salon IS NULL AND estado = 'ACTIVO'");
}

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

    return nobex_count_ii(
        $conn,
        "SELECT COUNT(*) AS total FROM concurso_participantes WHERE id_concurso = ? AND id_salon = ? AND estado = 'ACTIVO'",
        $idConcurso,
        $idSalon
    );
}

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

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

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

if ($ultimaActividad > 0 && (time() - $ultimaActividad) > $timeout) {
    nobex_auditar($conn, $idConcursoSesion > 0 ? $idConcursoSesion : null, null, $idAccesoSesion, null, 'SESION_EXPIRADA', 'Sesión expirada en panel.');
    nobex_limpiar_sesion();
    nobex_redirigir('index.php');
}

$stmtAcceso = mysqli_prepare($conn, "
    SELECT
        a.id_acceso,
        a.id_concurso,
        a.id_grupo,
        a.id_salon,
        a.codigo,
        a.nombre_responsable,
        a.tipo_acceso,
        a.puede_registrar_participantes,
        a.puede_registrar_resultados,
        a.puede_ver_resultados,
        a.puede_administrar,
        a.activo,
        a.fecha_expiracion,
        c.nombre AS concurso_nombre,
        c.subtitulo AS concurso_subtitulo,
        c.anio,
        c.estado AS concurso_estado,
        c.fecha_inicio,
        c.fecha_fin,
        g.nombre AS grupo_nombre,
        g.nivel,
        g.grado_nombre,
        s.nombre_salon,
        s.codigo_salon,
        s.capacidad
    FROM concurso_accesos a
    LEFT JOIN concursos c
        ON c.id_concurso = a.id_concurso
    LEFT JOIN concurso_grupos g
        ON g.id_grupo = a.id_grupo
    LEFT JOIN concurso_salones s
        ON s.id_salon = a.id_salon
    WHERE a.id_acceso = ?
    LIMIT 1
");

if (!$stmtAcceso) {
    http_response_code(500);
    die('No se pudo preparar el panel.');
}

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

if (!$acceso) {
    nobex_limpiar_sesion();
    nobex_redirigir('index.php');
}

$esAdminGlobal = nobex_es_admin_global($acceso);

if (!$esAdminGlobal && $idConcursoSesion <= 0) {
    nobex_limpiar_sesion();
    nobex_redirigir('index.php');
}

if (!$esAdminGlobal && (int)$acceso['id_concurso'] !== $idConcursoSesion) {
    nobex_limpiar_sesion();
    nobex_redirigir('index.php');
}

$hoy = date('Y-m-d');

if ((int)$acceso['activo'] !== 1) {
    nobex_limpiar_sesion();
    nobex_redirigir('index.php');
}

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

if (!$esAdminGlobal) {
    if (empty($acceso['id_concurso']) || empty($acceso['concurso_estado'])) {
        nobex_limpiar_sesion();
        nobex_redirigir('index.php');
    }

    if (strtoupper((string)$acceso['concurso_estado']) !== 'ACTIVO') {
        nobex_limpiar_sesion();
        nobex_redirigir('index.php');
    }

    if (!empty($acceso['fecha_inicio']) && $hoy < $acceso['fecha_inicio']) {
        nobex_limpiar_sesion();
        nobex_redirigir('index.php');
    }

    if (!empty($acceso['fecha_fin']) && $hoy > $acceso['fecha_fin']) {
        nobex_limpiar_sesion();
        nobex_redirigir('index.php');
    }
}

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

$puedeRegistrarParticipantes = (int)$acceso['puede_registrar_participantes'] === 1;
$puedeRegistrarCalificaciones = (int)$acceso['puede_registrar_resultados'] === 1;
$puedeVerResultados = (int)$acceso['puede_ver_resultados'] === 1;
$puedeAdministrar = (int)$acceso['puede_administrar'] === 1;

[$idConcursoTrabajo, $concursosActivos] = nobex_resolver_concurso_trabajo($conn, $acceso, $puedeAdministrar);

$idConcurso = $puedeAdministrar ? $idConcursoTrabajo : (int)$acceso['id_concurso'];
$idGrupo = $acceso['id_grupo'] !== null ? (int)$acceso['id_grupo'] : 0;
$idSalon = $acceso['id_salon'] !== null ? (int)$acceso['id_salon'] : 0;

$concursoTrabajo = $idConcurso > 0 ? nobex_concurso_activo($conn, $idConcurso) : null;

$totalConcursos = nobex_count_simple($conn, "SELECT COUNT(*) AS total FROM concursos");
$totalConcursosActivos = nobex_count_simple($conn, "SELECT COUNT(*) AS total FROM concursos WHERE estado = 'ACTIVO'");
$totalGrupos = nobex_contar_grupos($conn, $idConcurso);
$totalSalones = nobex_contar_salones($conn, $idConcurso, $idGrupo);
$totalParticipantes = nobex_contar_participantes($conn, $idConcurso, $idGrupo, $idSalon);
$totalCalificaciones = nobex_contar_resultados($conn, $idConcurso, $idGrupo, $idSalon);
$totalPendientes = nobex_contar_pendientes($conn, $idConcurso, $idGrupo);

$capacidadMaximaSalon = 30;
$ocupadosSalon = nobex_salon_ocupados($conn, $idConcurso, $idSalon);
$cuposLibresSalon = max(0, $capacidadMaximaSalon - $ocupadosSalon);

if ($esAdminGlobal) {
    $ambito = $concursoTrabajo
        ? 'Administrador global | Trabajando en: ' . $concursoTrabajo['nombre'] . ' ' . $concursoTrabajo['subtitulo']
        : 'Administrador global | Sin concurso activo seleccionado';
} elseif ($puedeAdministrar) {
    $ambito = $concursoTrabajo
        ? $concursoTrabajo['nombre'] . ' ' . $concursoTrabajo['subtitulo'] . ' | Todos los grados y salones'
        : 'Administrador de concurso';
} else {
    $ambito = trim((string)$acceso['concurso_nombre'] . ' ' . (string)$acceso['concurso_subtitulo']);

    if (!empty($acceso['grupo_nombre'])) {
        $ambito .= ' | ' . (string)$acceso['grupo_nombre'];
    }

    if (!empty($acceso['nombre_salon'])) {
        $ambito .= ' - ' . (string)$acceso['nombre_salon'];
    }
}

$ultimosParticipantes = [];

if ($idConcurso > 0 && $idSalon > 0) {
    $stmtUltimos = mysqli_prepare($conn, "
        SELECT
            p.codigo_participante,
            p.apellidos_nombres,
            p.institucion_educativa,
            p.tipo_institucion,
            p.documento,
            p.created_at,
            c.nombre AS concurso_nombre,
            c.subtitulo AS concurso_subtitulo,
            g.nombre AS grupo,
            s.nombre_salon
        FROM concurso_participantes p
        INNER JOIN concursos c ON c.id_concurso = p.id_concurso
        LEFT JOIN concurso_grupos g ON g.id_grupo = p.id_grupo
        LEFT JOIN concurso_salones s ON s.id_salon = p.id_salon
        WHERE p.id_concurso = ?
          AND p.id_salon = ?
          AND p.estado = 'ACTIVO'
        ORDER BY p.id_participante DESC
        LIMIT 10
    ");

    if ($stmtUltimos) {
        mysqli_stmt_bind_param($stmtUltimos, 'ii', $idConcurso, $idSalon);
    }
} elseif ($idConcurso > 0 && $idGrupo > 0) {
    $stmtUltimos = mysqli_prepare($conn, "
        SELECT
            p.codigo_participante,
            p.apellidos_nombres,
            p.institucion_educativa,
            p.tipo_institucion,
            p.documento,
            p.created_at,
            c.nombre AS concurso_nombre,
            c.subtitulo AS concurso_subtitulo,
            g.nombre AS grupo,
            s.nombre_salon
        FROM concurso_participantes p
        INNER JOIN concursos c ON c.id_concurso = p.id_concurso
        LEFT JOIN concurso_grupos g ON g.id_grupo = p.id_grupo
        LEFT JOIN concurso_salones s ON s.id_salon = p.id_salon
        WHERE p.id_concurso = ?
          AND p.id_grupo = ?
          AND p.estado = 'ACTIVO'
        ORDER BY p.id_participante DESC
        LIMIT 10
    ");

    if ($stmtUltimos) {
        mysqli_stmt_bind_param($stmtUltimos, 'ii', $idConcurso, $idGrupo);
    }
} elseif ($idConcurso > 0) {
    $stmtUltimos = mysqli_prepare($conn, "
        SELECT
            p.codigo_participante,
            p.apellidos_nombres,
            p.institucion_educativa,
            p.tipo_institucion,
            p.documento,
            p.created_at,
            c.nombre AS concurso_nombre,
            c.subtitulo AS concurso_subtitulo,
            g.nombre AS grupo,
            s.nombre_salon
        FROM concurso_participantes p
        INNER JOIN concursos c ON c.id_concurso = p.id_concurso
        LEFT JOIN concurso_grupos g ON g.id_grupo = p.id_grupo
        LEFT JOIN concurso_salones s ON s.id_salon = p.id_salon
        WHERE p.id_concurso = ?
          AND p.estado = 'ACTIVO'
        ORDER BY p.id_participante DESC
        LIMIT 10
    ");

    if ($stmtUltimos) {
        mysqli_stmt_bind_param($stmtUltimos, 'i', $idConcurso);
    }
} else {
    $stmtUltimos = mysqli_prepare($conn, "
        SELECT
            p.codigo_participante,
            p.apellidos_nombres,
            p.institucion_educativa,
            p.tipo_institucion,
            p.documento,
            p.created_at,
            c.nombre AS concurso_nombre,
            c.subtitulo AS concurso_subtitulo,
            g.nombre AS grupo,
            s.nombre_salon
        FROM concurso_participantes p
        INNER JOIN concursos c ON c.id_concurso = p.id_concurso
        LEFT JOIN concurso_grupos g ON g.id_grupo = p.id_grupo
        LEFT JOIN concurso_salones s ON s.id_salon = p.id_salon
        WHERE p.estado = 'ACTIVO'
        ORDER BY p.id_participante DESC
        LIMIT 10
    ");
}

if (isset($stmtUltimos) && $stmtUltimos) {
    mysqli_stmt_execute($stmtUltimos);
    $resUltimos = mysqli_stmt_get_result($stmtUltimos);

    if ($resUltimos) {
        while ($row = mysqli_fetch_assoc($resUltimos)) {
            $ultimosParticipantes[] = $row;
        }
    }

    mysqli_stmt_close($stmtUltimos);
}

$rolPanel = $esAdminGlobal ? 'Administrador global' : ($puedeAdministrar ? 'Administrador de concurso' : ($idSalon > 0 ? 'Responsable de salón' : 'Responsable de grado'));
$codigoSalonTexto = !empty($acceso['codigo_salon']) ? (string)$acceso['codigo_salon'] : 'No asignado';

$queryConcurso = $idConcurso > 0 ? '?id_concurso=' . urlencode((string)$idConcurso) : '';
$urlParticipantes = 'participantes.php' . $queryConcurso;
$urlAsignarSalon = 'asignar_salon.php' . $queryConcurso;
$urlImportar = 'admin/importar_participantes.php' . $queryConcurso;
$urlSalones = 'admin/salones.php' . $queryConcurso;
$urlCodigos = 'admin/codigos.php' . $queryConcurso;
$urlResultados = 'resultados.php' . $queryConcurso;
$urlDiplomas = 'diplomas.php' . $queryConcurso;
$urlComputoPremios = 'computo_premios.php' . $queryConcurso;
$urlCorregirSalon = 'corregir_salon.php' . $queryConcurso;
$urlPublicacionResultados = 'publicacion_resultados.php' . $queryConcurso;
$urlOmr = 'omr/index.php' . $queryConcurso;
$urlConcursos = 'admin/concursos.php';

$hayConcursoTrabajo = $idConcurso > 0;
$porcentajeSalon = $idSalon > 0 ? min(100, (int)round(($ocupadosSalon / $capacidadMaximaSalon) * 100)) : 0;

require_once __DIR__ . '/includes/menu_concurso.php';
$menuConcurso = cn_menu_cargar($conn, $acceso, $idConcurso);

?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Panel principal | 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">
    <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;
            --ink:#0f172a;--muted:#64748b;--line:#e2e8f0;--shadow:0 20px 45px rgba(15,23,42,.10);
        }
        body{
            margin:0;min-height:100vh;font-family:Inter,Arial,Helvetica,sans-serif;color:var(--ink);
            background:radial-gradient(circle at top left,rgba(250,204,21,.14),transparent 32%),
                       linear-gradient(135deg,#f8fafc 0%,#eef2ff 45%,#fff7ed 100%);
        }
        a{text-decoration:none;color:inherit}
        .shell{max-width:1380px;margin:0 auto;padding:22px 18px 44px}
        .hero{
            position:relative;overflow:hidden;border-radius:28px;color:#fff;
            background:radial-gradient(circle at 15% 0%,rgba(250,204,21,.30),transparent 28%),
                       linear-gradient(135deg,#111827,#1f2937 48%,#991b1b);
            border:1px solid rgba(255,255,255,.14);box-shadow:0 24px 55px rgba(15,23,42,.20)
        }
        .hero:after{content:"";position:absolute;left:0;right:0;bottom:0;height:7px;background:linear-gradient(90deg,var(--gold),#fde68a,var(--gold))}
        .hero-inner{position:relative;z-index:1;display:grid;grid-template-columns:1fr auto;gap:22px;align-items:start;padding:28px}
        .brand{display:flex;align-items:center;gap:16px}
        .brand-mark{width:62px;height:62px;border-radius:20px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.22);box-shadow:inset 0 -12px 24px rgba(0,0,0,.18);font-size:28px}
        .eyebrow{margin:0 0 5px;color:#fde68a;font-size:12px;font-weight:950;letter-spacing:.09em;text-transform:uppercase}
        .hero h1{margin:0;font-size:clamp(30px,4vw,46px);line-height:1.02;letter-spacing:-.04em;font-weight:950}
        .hero-sub{margin:10px 0 0;color:#e5e7eb;font-size:15px;line-height:1.5;font-weight:800}
        .hero-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;font-weight:950;color:#fff;border:1px solid rgba(255,255,255,.28);background:rgba(255,255,255,.10);white-space:nowrap;cursor:pointer}
        .btn-top:hover{background:rgba(255,255,255,.18)}
        .btn-exit{background:rgba(220,38,38,.88);border-color:rgba(248,113,113,.60)}
        .hero-footer{position:relative;z-index:1;padding:0 28px 30px}
        .scope-card{border-radius:22px;padding:16px;background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.16)}
        .scope-title{margin:0;font-size:19px;font-weight:950;line-height:1.35}
        .pills{display:flex;flex-wrap:wrap;gap:9px;margin-top:12px}
        .pill{display:inline-flex;align-items:center;gap:7px;border-radius:999px;padding:7px 10px;font-size:12px;font-weight:950;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.20);color:#e5e7eb}
        .pill.success{background:rgba(22,101,52,.22);border-color:rgba(134,239,172,.55);color:#dcfce7}
        .pill.warn{background:rgba(146,64,14,.22);border-color:rgba(252,211,77,.65);color:#fef3c7}
        .pill.blue{background:rgba(29,78,216,.22);border-color:rgba(147,197,253,.55);color:#dbeafe}
        .selector-concurso{margin-top:14px;max-width:680px}
        .selector-concurso label{display:block;color:#fde68a;font-size:12px;font-weight:950;margin-bottom:8px;text-transform:uppercase}
        .selector-concurso select{width:100%;border:1px solid rgba(255,255,255,.28);background:#fff;color:#111827;border-radius:15px;padding:12px 14px;font-weight:900;outline:none;font-size:14px}
        .stats{margin-top:18px;display:grid;grid-template-columns:repeat(5,1fr);gap:14px}
        .card{background:rgba(255,255,255,.95);border:1px solid rgba(226,232,240,.95);border-radius:24px;box-shadow:var(--shadow);backdrop-filter:blur(8px)}
        .stat{padding:18px;min-height:116px;display:flex;align-items:center;justify-content:space-between;gap:12px}
        .stat-icon{width:46px;height:46px;border-radius:16px;display:flex;align-items:center;justify-content:center;font-size:20px;flex:0 0 auto}
        .icon-blue{background:#dbeafe;color:#1d4ed8}.icon-green{background:#dcfce7;color:#166534}.icon-yellow{background:#fef3c7;color:#92400e}.icon-red{background:#fee2e2;color:#991b1b}.icon-gray{background:#f1f5f9;color:#475569}
        .stat-number{font-size:34px;line-height:1;font-weight:950;letter-spacing:-.04em}
        .stat-label{margin-top:7px;color:#64748b;font-size:12px;font-weight:950;text-transform:uppercase}
        .section-title{margin:28px 0 14px;display:flex;align-items:end;justify-content:space-between;gap:16px}
        .section-title h2{margin:0;font-size:25px;font-weight:950;letter-spacing:-.03em}
        .section-title p{margin:5px 0 0;color:#64748b;font-size:14px;font-weight:800}
        .actions{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
        .action{min-height:154px;display:flex;gap:14px;padding:19px;transition:.16s ease;color:#0f172a}
        .action:hover{transform:translateY(-2px);border-color:#bfdbfe;box-shadow:0 26px 55px rgba(15,23,42,.14)}
        .action.admin{border-color:#fde68a;background:linear-gradient(180deg,#fff,#fffbeb)}
        .action.disabled{opacity:.58;cursor:not-allowed}
        .action.disabled:hover{transform:none;border-color:rgba(226,232,240,.95);box-shadow:var(--shadow)}
        .action-icon{width:50px;height:50px;border-radius:17px;display:flex;align-items:center;justify-content:center;font-size:21px;flex:0 0 auto}
        .action h3{margin:0 0 7px;font-size:17px;font-weight:950;line-height:1.25}
        .action p{margin:0;color:#64748b;font-size:13px;line-height:1.45;font-weight:800}
        .two-col{margin-top:18px;display:grid;grid-template-columns:1fr 360px;gap:16px;align-items:start}
        .panel-head{padding:20px 22px;border-bottom:1px solid #e2e8f0;display:flex;justify-content:space-between;gap:12px;align-items:center}
        .panel-head h2{margin:0;font-size:21px;font-weight:950}.panel-head p{margin:5px 0 0;color:#64748b;font-size:13px;font-weight:800}
        .table-wrap{overflow-x:auto}
        table{width:100%;border-collapse:separate;border-spacing:0;font-size:14px;min-width:920px}
        th,td{padding:12px;border-bottom:1px solid #e2e8f0;text-align:left;vertical-align:middle}
        th{background:#f8fafc;color:#475569;font-size:11px;font-weight:950;text-transform:uppercase;white-space:nowrap}
        tbody tr:hover td{background:#f8fafc}tbody tr:last-child td{border-bottom:0}
        .text-primary{color:#1d4ed8;font-weight:950}.participant-name{font-weight:950;color:#0f172a}.school{max-width:240px;color:#475569;font-weight:800}
        .badge-soft{display:inline-flex;align-items:center;gap:5px;border-radius:999px;padding:5px 9px;background:#eff6ff;border:1px solid #bfdbfe;color:#1e40af;font-size:12px;font-weight:950;white-space:nowrap}
        .badge-pending{background:#fef3c7;border-color:#fde68a;color:#92400e}
        .aside-content{padding:18px;display:grid;gap:12px}
        .info-item{border:1px solid #e2e8f0;border-radius:17px;padding:13px;background:#f8fafc}
        .info-label{color:#64748b;font-size:11px;font-weight:950;text-transform:uppercase}.info-value{margin-top:5px;font-weight:950;line-height:1.35;color:#0f172a}
        .capacity-box{padding:15px;border-radius:18px;background:linear-gradient(135deg,#eff6ff,#fff);border:1px solid #bfdbfe}
        .capacity-row{display:flex;justify-content:space-between;gap:10px;font-size:13px;color:#475569;font-weight:950}
        .progress{margin-top:10px;height:11px;border-radius:999px;background:#e5e7eb;overflow:hidden}
        .progress-bar{height:100%;width:<?php echo nobex_h((string)$porcentajeSalon); ?>%;background:linear-gradient(90deg,#1d4ed8,#2563eb)}
        .quick-btn{display:flex;align-items:center;justify-content:center;gap:8px;border-radius:16px;padding:13px 14px;color:#fff;font-weight:950;text-align:center}
        .quick-blue{background:linear-gradient(135deg,#1d4ed8,#2563eb)}.quick-red{background:linear-gradient(135deg,#dc2626,#991b1b)}.quick-dark{background:linear-gradient(135deg,#475569,#1f2937)}
        .empty{margin:22px;padding:26px;color:#475569;font-weight:900;line-height:1.5;background:#f8fafc;border:1px dashed #cbd5e1;border-radius:20px;text-align:center}
        .empty i{display:block;font-size:34px;color:#94a3b8;margin-bottom:8px}
        @media(max-width:1120px){.stats{grid-template-columns:repeat(3,1fr)}.actions{grid-template-columns:repeat(2,1fr)}.two-col{grid-template-columns:1fr}}
        @media(max-width:720px){.shell{padding:14px 12px 34px}.hero-inner{grid-template-columns:1fr;padding:22px}.hero-footer{padding:0 22px 24px}.brand{align-items:flex-start}.hero-actions{justify-content:flex-start}.stats,.actions{grid-template-columns:1fr}.section-title{display:block}}
    </style>
    <link rel="stylesheet" href="assets/css/menu_concurso.css?v=5">
</head>
<body class="cn-con-sidebar">

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

<main class="shell">
    <section class="hero">
        <div class="hero-inner">
            <div class="brand">
                <div class="brand-mark"><i class="fa-solid fa-trophy"></i></div>
                <div>
                    <p class="eyebrow">Colegio Nobel Ingenieros</p>
                    <h1>Panel NOBEX</h1>
                    <p class="hero-sub">
                        <?php if ($esAdminGlobal): ?>
                            Administración global del sistema
                        <?php elseif ($concursoTrabajo): ?>
                            <?php echo nobex_h($concursoTrabajo['nombre'] . ' ' . $concursoTrabajo['subtitulo']); ?>
                        <?php else: ?>
                            <?php echo nobex_h(trim((string)$acceso['concurso_nombre'] . ' ' . (string)$acceso['concurso_subtitulo'])); ?>
                        <?php endif; ?>
                    </p>
                    <p class="hero-sub">
                        <i class="fa-solid fa-key"></i> <?php echo nobex_h($acceso['codigo']); ?>
                        &nbsp;&nbsp;|&nbsp;&nbsp;
                        <i class="fa-solid fa-user-shield"></i> <?php echo nobex_h($acceso['nombre_responsable']); ?>
                    </p>
                </div>
            </div>

            <div class="hero-actions">
                <button type="button" class="btn-top" id="btnInfoAcceso">
                    <i class="bi bi-info-circle"></i> Mi acceso
                </button>
                <a class="btn-top btn-exit" href="salir.php">
                    <i class="bi bi-box-arrow-right"></i> Salir
                </a>
            </div>
        </div>

        <div class="hero-footer">
            <div class="scope-card">
                <p class="eyebrow">Ámbito asignado</p>
                <h2 class="scope-title"><?php echo nobex_h($ambito); ?></h2>

                <div class="pills">
                    <?php if ($esAdminGlobal): ?>
                        <span class="pill success"><i class="fa-solid fa-shield-halved"></i> Admin global</span>
                        <span class="pill"><i class="fa-solid fa-trophy"></i> Activos: <?php echo nobex_h($totalConcursosActivos); ?></span>
                        <span class="pill"><i class="fa-solid fa-database"></i> Total: <?php echo nobex_h($totalConcursos); ?></span>
                    <?php else: ?>
                        <span class="pill success"><i class="fa-solid fa-circle-check"></i> Concurso activo</span>
                    <?php endif; ?>

                    <span class="pill blue"><i class="fa-solid fa-user-tag"></i> <?php echo nobex_h($rolPanel); ?></span>
                    <span class="pill"><i class="fa-solid fa-id-badge"></i> <?php echo nobex_h($acceso['tipo_acceso']); ?></span>

                    <?php if ($idSalon > 0): ?>
                        <span class="pill"><i class="fa-solid fa-door-open"></i> <?php echo nobex_h($codigoSalonTexto); ?></span>
                        <span class="pill <?php echo $cuposLibresSalon <= 0 ? 'warn' : 'success'; ?>">
                            <i class="fa-solid fa-users"></i> <?php echo nobex_h($ocupadosSalon); ?>/<?php echo nobex_h($capacidadMaximaSalon); ?>
                        </span>
                    <?php endif; ?>

                    <?php if ($totalPendientes > 0): ?>
                        <span class="pill warn"><i class="fa-solid fa-triangle-exclamation"></i> Pendientes: <?php echo nobex_h($totalPendientes); ?></span>
                    <?php endif; ?>
                </div>

                <?php if ($puedeAdministrar): ?>
                    <form class="selector-concurso" method="get" action="">
                        <label for="id_concurso"><i class="fa-solid fa-sliders"></i> Concurso de trabajo</label>
                        <?php if (!empty($concursosActivos)): ?>
                            <select name="id_concurso" id="id_concurso" onchange="this.form.submit()">
                                <?php foreach ($concursosActivos as $concursoItem): ?>
                                    <option value="<?php echo nobex_h($concursoItem['id_concurso']); ?>" <?php echo (int)$concursoItem['id_concurso'] === $idConcurso ? 'selected' : ''; ?>>
                                        <?php echo nobex_h($concursoItem['nombre'] . ' ' . $concursoItem['subtitulo'] . ' | ' . $concursoItem['anio']); ?>
                                    </option>
                                <?php endforeach; ?>
                            </select>
                        <?php else: ?>
                            <span class="pill warn"><i class="fa-solid fa-triangle-exclamation"></i> No hay concursos activos</span>
                        <?php endif; ?>
                    </form>
                <?php endif; ?>
            </div>
        </div>
    </section>

    <section class="stats">
        <div class="card stat"><div><div class="stat-number"><?php echo nobex_h($totalGrupos); ?></div><div class="stat-label">Grados</div></div><div class="stat-icon icon-blue"><i class="fa-solid fa-layer-group"></i></div></div>
        <div class="card stat"><div><div class="stat-number"><?php echo nobex_h($totalSalones); ?></div><div class="stat-label">Salones</div></div><div class="stat-icon icon-green"><i class="fa-solid fa-door-open"></i></div></div>
        <div class="card stat"><div><div class="stat-number"><?php echo nobex_h($totalParticipantes); ?></div><div class="stat-label">Participantes</div></div><div class="stat-icon icon-yellow"><i class="fa-solid fa-users"></i></div></div>
        <div class="card stat"><div><div class="stat-number"><?php echo nobex_h($totalPendientes); ?></div><div class="stat-label">Sin salón</div></div><div class="stat-icon icon-red"><i class="fa-solid fa-user-clock"></i></div></div>
        <div class="card stat"><div><div class="stat-number"><?php echo nobex_h($totalCalificaciones); ?></div><div class="stat-label">Calificaciones</div></div><div class="stat-icon icon-gray"><i class="fa-solid fa-clipboard-check"></i></div></div>
    </section>

    <section class="section-title">
        <div>
            <p class="eyebrow" style="color:var(--red)">Menú lateral activo</p>
            <h2>Resumen del concurso</h2>
            <p>Los módulos ya están organizados en la barra lateral izquierda según el permiso del código de acceso.</p>
        </div>
    </section>

    <section class="two-col">
        <div class="card">
            <div class="panel-head">
                <div>
                    <p class="eyebrow" style="color:var(--red)">Actividad reciente</p>
                    <h2>Últimos participantes</h2>
                    <p>Registros recientes del ámbito actual.</p>
                </div>
                <span class="badge-soft"><i class="fa-solid fa-clock-rotate-left"></i> <?php echo nobex_h(count($ultimosParticipantes)); ?></span>
            </div>

            <?php if (!empty($ultimosParticipantes)): ?>
                <div class="table-wrap">
                    <table>
                        <thead>
                            <tr>
                                <th>Código</th><th>DNI</th><th>Participante</th><th>I.E.</th><th>Tipo</th><th>Grado</th><th>Salón</th><th>Fecha</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($ultimosParticipantes as $participante): ?>
                                <tr>
                                    <td class="text-primary"><?php echo nobex_h($participante['codigo_participante']); ?></td>
                                    <td><?php echo nobex_h($participante['documento']); ?></td>
                                    <td class="participant-name"><?php echo nobex_h($participante['apellidos_nombres']); ?></td>
                                    <td class="school"><?php echo nobex_h($participante['institucion_educativa']); ?></td>
                                    <td><span class="badge-soft"><?php echo nobex_h($participante['tipo_institucion']); ?></span></td>
                                    <td><?php echo nobex_h($participante['grupo'] ?: 'Pendiente'); ?></td>
                                    <td>
                                        <?php if (!empty($participante['nombre_salon'])): ?>
                                            <span class="badge-soft"><i class="fa-solid fa-door-open"></i> <?php echo nobex_h($participante['nombre_salon']); ?></span>
                                        <?php else: ?>
                                            <span class="badge-soft badge-pending"><i class="fa-solid fa-clock"></i> Pendiente</span>
                                        <?php endif; ?>
                                    </td>
                                    <td><?php echo nobex_h($participante['created_at']); ?></td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>
                </div>
            <?php else: ?>
                <div class="empty"><i class="fa-regular fa-folder-open"></i>Todavía no hay participantes registrados en este ámbito.</div>
            <?php endif; ?>
        </div>

        <aside class="card">
            <div class="panel-head">
                <div>
                    <p class="eyebrow" style="color:var(--red)">Resumen</p>
                    <h2>Mi acceso</h2>
                </div>
            </div>

            <div class="aside-content">
                <div class="info-item"><div class="info-label">Responsable</div><div class="info-value"><?php echo nobex_h($acceso['nombre_responsable']); ?></div></div>
                <div class="info-item"><div class="info-label">Código</div><div class="info-value"><?php echo nobex_h($acceso['codigo']); ?></div></div>
                <div class="info-item"><div class="info-label">Ámbito</div><div class="info-value"><?php echo nobex_h($ambito); ?></div></div>
                <div class="info-item">
                    <div class="info-label">Permisos</div>
                    <div class="info-value">
                        <?php echo $esAdminGlobal ? 'Admin global' : ($puedeAdministrar ? 'Administrador' : 'Operativo'); ?><br>
                        <?php echo $puedeRegistrarParticipantes ? 'Registra ingreso' : 'Sin registro de ingreso'; ?><br>
                        <?php echo $puedeRegistrarCalificaciones ? 'Califica' : 'No califica'; ?>
                    </div>
                </div>

                <?php if ($idSalon > 0): ?>
                    <div class="capacity-box">
                        <div class="capacity-row"><span>Ocupados</span><strong><?php echo nobex_h($ocupadosSalon); ?>/<?php echo nobex_h($capacidadMaximaSalon); ?></strong></div>
                        <div class="progress"><div class="progress-bar"></div></div>
                        <div class="capacity-row" style="margin-top:10px;"><span>Cupos libres</span><strong><?php echo nobex_h($cuposLibresSalon); ?></strong></div>
                    </div>
                <?php endif; ?>

                <?php if ($puedeAdministrar): ?>
                    <a class="quick-btn quick-red" href="<?php echo nobex_h($urlConcursos); ?>"><i class="fa-solid fa-gears"></i> Administrar concursos</a>
                    <?php if ($hayConcursoTrabajo): ?>
                        <a class="quick-btn quick-blue" href="<?php echo nobex_h($urlSalones); ?>"><i class="fa-solid fa-school"></i> Control de salones</a>
                        <a class="quick-btn quick-red" href="<?php echo nobex_h($urlCorregirSalon); ?>"><i class="fa-solid fa-right-left"></i> Corregir / eliminar</a>
                        <a class="quick-btn quick-blue" href="<?php echo nobex_h($urlAsignarSalon); ?>"><i class="fa-solid fa-user-check"></i> Asignar salón</a>
                        <a class="quick-btn quick-blue" href="<?php echo nobex_h($urlPublicacionResultados); ?>"><i class="fa-solid fa-eye-slash"></i> Publicación de resultados</a>
                        <a class="quick-btn quick-red" href="<?php echo nobex_h($urlDiplomas); ?>"><i class="fa-solid fa-award"></i> Generar diplomas</a>
                        <a class="quick-btn quick-blue" href="<?php echo nobex_h($urlComputoPremios); ?>"><i class="fa-solid fa-trophy"></i> Cómputo de premios</a>
                    <?php endif; ?>
                <?php elseif ($idSalon > 0 && $puedeRegistrarParticipantes): ?>
                    <a class="quick-btn quick-blue" href="asignar_salon.php"><i class="fa-solid fa-user-check"></i> Ir a asignar salón</a>
                    <?php if ($puedeVerResultados && $hayConcursoTrabajo): ?>
                        <a class="quick-btn quick-red" href="<?php echo nobex_h($urlDiplomas); ?>"><i class="fa-solid fa-award"></i> Generar diplomas</a>
                        <a class="quick-btn quick-blue" href="<?php echo nobex_h($urlComputoPremios); ?>"><i class="fa-solid fa-trophy"></i> Cómputo de premios</a>
                    <?php endif; ?>
                <?php else: ?>
                    <a class="quick-btn quick-dark" href="salir.php"><i class="fa-solid fa-right-from-bracket"></i> Cerrar sesión</a>
                <?php endif; ?>
            </div>
        </aside>
    </section>
</main>

<script>
document.addEventListener('DOMContentLoaded', function () {
    const btnInfo = document.getElementById('btnInfoAcceso');

    function swalInfo(title, html) {
        if (typeof Swal === 'undefined') return;
        Swal.fire({
            icon:'info',
            title:title,
            html:html,
            confirmButtonText:'Entendido',
            confirmButtonColor:'#1d4ed8'
        });
    }

    if (btnInfo) {
        btnInfo.addEventListener('click', function () {
            const responsable = <?php echo json_encode((string)$acceso['nombre_responsable'], JSON_UNESCAPED_UNICODE); ?>;
            const codigo = <?php echo json_encode((string)$acceso['codigo'], JSON_UNESCAPED_UNICODE); ?>;
            const rol = <?php echo json_encode((string)$rolPanel, JSON_UNESCAPED_UNICODE); ?>;
            const ambito = <?php echo json_encode((string)$ambito, JSON_UNESCAPED_UNICODE); ?>;

            swalInfo(
                'Datos del acceso',
                '<div style="text-align:left;line-height:1.7;font-weight:700">' +
                '<b>Responsable:</b> ' + responsable + '<br>' +
                '<b>Código:</b> ' + codigo + '<br>' +
                '<b>Rol:</b> ' + rol + '<br>' +
                '<b>Ámbito:</b> ' + ambito +
                '</div>'
            );
        });
    }

    document.querySelectorAll('.action.disabled').forEach(function (card) {
        card.addEventListener('click', function () {
            const msg = card.dataset.disabledMessage || 'Este módulo no está disponible para tu acceso.';
            Swal.fire({
                icon:'warning',
                title:'Módulo no disponible',
                text:msg,
                confirmButtonText:'Entendido',
                confirmButtonColor:'#dc2626'
            });
        });
    });
});
</script>

</body>
</html>
