<?php
// concurso_nobel/resultados.php
// VERSION PUBLICACION CONTROLADA - 2026-05-18
// Reporte final consolidado tipo Excel y PDF/impresión separado por PRIVADA y PÚBLICA.
// Rediseñado con cabecera estética: logo principal, banner central y logo secundario.

declare(strict_types=1);

session_start();

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

function r_num($valor): string
{
    return number_format((float)$valor, 2, '.', '');
}

function r_tipo_label(string $tipo): string
{
    return $tipo === 'PUBLICA' ? 'PÚBLICA' : 'PRIVADA';
}

function r_tipo_valido(string $tipo): bool
{
    return in_array($tipo, ['TODOS', 'PRIVADA', 'PUBLICA'], true);
}

function r_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 r_contar_participantes(mysqli $conn, int $idConcurso, int $idGrupo, int $idSalon, string $tipo): int
{
    $sql = "
        SELECT COUNT(*) AS total
        FROM concurso_participantes
        WHERE id_concurso = ?
          AND id_grupo = ?
          AND estado = 'ACTIVO'
    ";

    if ($idSalon > 0) {
        $sql .= " AND id_salon = ?";
    }

    if ($tipo !== 'TODOS') {
        $sql .= " AND tipo_institucion = ?";
    }

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

    if (!$stmt) {
        return 0;
    }

    if ($idSalon > 0 && $tipo !== 'TODOS') {
        mysqli_stmt_bind_param($stmt, 'iiis', $idConcurso, $idGrupo, $idSalon, $tipo);
    } elseif ($idSalon > 0) {
        mysqli_stmt_bind_param($stmt, 'iii', $idConcurso, $idGrupo, $idSalon);
    } elseif ($tipo !== 'TODOS') {
        mysqli_stmt_bind_param($stmt, 'iis', $idConcurso, $idGrupo, $tipo);
    } else {
        mysqli_stmt_bind_param($stmt, 'ii', $idConcurso, $idGrupo);
    }

    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);
    $row = mysqli_fetch_assoc($res);
    mysqli_stmt_close($stmt);

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

function r_contar_calificados(mysqli $conn, int $idConcurso, int $idGrupo, int $idSalon, string $tipo, ?int $publicarResultado = null): int
{
    $sql = "
        SELECT COUNT(*) AS total
        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'
    ";

    if ($idSalon > 0) {
        $sql .= " AND r.id_salon = ?";
    }

    if ($tipo !== 'TODOS') {
        $sql .= " AND p.tipo_institucion = ?";
    }

    if ($publicarResultado !== null && r_columna_existe($conn, 'concurso_resultados', 'publicar_resultado')) {
        $sql .= " AND r.publicar_resultado = ?";
    }

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

    if (!$stmt) {
        return 0;
    }

    $types = 'ii';
    $params = [$idConcurso, $idGrupo];

    if ($idSalon > 0) {
        $types .= 'i';
        $params[] = $idSalon;
    }

    if ($tipo !== 'TODOS') {
        $types .= 's';
        $params[] = $tipo;
    }

    if ($publicarResultado !== null && r_columna_existe($conn, 'concurso_resultados', 'publicar_resultado')) {
        $types .= 'i';
        $params[] = $publicarResultado;
    }

    mysqli_stmt_bind_param($stmt, $types, ...$params);

    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);
    $row = mysqli_fetch_assoc($res);
    mysqli_stmt_close($stmt);

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


function r_cargar_salones(mysqli $conn, int $idConcurso, int $idGrupo, int $idSalonFijo): array
{
    $items = [];

    if ($idSalonFijo > 0) {
        $stmt = mysqli_prepare($conn, "
            SELECT id_salon, nombre_salon, codigo_salon
            FROM concurso_salones
            WHERE id_concurso = ?
              AND id_grupo = ?
              AND id_salon = ?
              AND estado = 1
            ORDER BY orden ASC
        ");

        if ($stmt) {
            mysqli_stmt_bind_param($stmt, 'iii', $idConcurso, $idGrupo, $idSalonFijo);
        }
    } else {
        $stmt = mysqli_prepare($conn, "
            SELECT id_salon, nombre_salon, codigo_salon
            FROM concurso_salones
            WHERE id_concurso = ?
              AND id_grupo = ?
              AND estado = 1
            ORDER BY orden ASC
        ");

        if ($stmt) {
            mysqli_stmt_bind_param($stmt, 'ii', $idConcurso, $idGrupo);
        }
    }

    if (isset($stmt) && $stmt) {
        mysqli_stmt_execute($stmt);
        $res = mysqli_stmt_get_result($stmt);

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

        mysqli_stmt_close($stmt);
    }

    return $items;
}

function r_cargar_resultados(mysqli $conn, int $idConcurso, int $idGrupo, int $idSalon, string $tipo): array
{
    $items = [];

    $sql = "
        SELECT
            r.puesto,
            r.correctas,
            r.incorrectas,
            r.blanco,
            r.puntaje,
            r.tiempo_texto,
            r.tiempo_segundos,
            p.codigo_participante,
            p.apellidos_nombres,
            p.institucion_educativa,
            p.tipo_institucion,
            p.documento,
            g.nombre AS grupo_nombre,
            s.nombre_salon
        FROM concurso_resultados r
        INNER JOIN concurso_participantes p
            ON p.id_participante = r.id_participante
        INNER JOIN concurso_grupos g
            ON g.id_grupo = r.id_grupo
        LEFT JOIN concurso_salones s
            ON s.id_salon = r.id_salon
        WHERE r.id_concurso = ?
          AND r.id_grupo = ?
          AND r.estado = 'ACTIVO'
          AND p.estado = 'ACTIVO'
          AND r.publicar_resultado = 1
    ";

    if ($idSalon > 0) {
        $sql .= " AND r.id_salon = ? ";
    }

    if ($tipo !== 'TODOS') {
        $sql .= " AND p.tipo_institucion = ? ";
    }

    $sql .= "
        ORDER BY
            FIELD(p.tipo_institucion, 'PRIVADA', 'PUBLICA'),
            r.puesto ASC,
            r.puntaje DESC,
            (r.tiempo_segundos IS NULL) ASC,
            r.tiempo_segundos ASC,
            r.correctas DESC,
            r.incorrectas ASC,
            p.apellidos_nombres ASC
    ";

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

    if (!$stmt) {
        return [];
    }

    if ($idSalon > 0 && $tipo !== 'TODOS') {
        mysqli_stmt_bind_param($stmt, 'iiis', $idConcurso, $idGrupo, $idSalon, $tipo);
    } elseif ($idSalon > 0) {
        mysqli_stmt_bind_param($stmt, 'iii', $idConcurso, $idGrupo, $idSalon);
    } elseif ($tipo !== 'TODOS') {
        mysqli_stmt_bind_param($stmt, 'iis', $idConcurso, $idGrupo, $tipo);
    } else {
        mysqli_stmt_bind_param($stmt, 'ii', $idConcurso, $idGrupo);
    }

    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);

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

    mysqli_stmt_close($stmt);

    return $items;
}

function r_filtrar_por_tipo(array $resultados, string $tipo): array
{
    $items = [];

    foreach ($resultados as $r) {
        if ((string)$r['tipo_institucion'] === $tipo) {
            $items[] = $r;
        }
    }

    return $items;
}

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

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

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

    $ruta = str_replace('\\', '/', $ruta);

    if (strpos($ruta, '/concurso_nobel/') !== false) {
        $pos = strpos($ruta, '/concurso_nobel/');
        return substr($ruta, $pos);
    }

    $ruta = ltrim($ruta, '/');

    if (strpos($ruta, 'concurso_nobel/') === 0) {
        return '/' . $ruta;
    }

    if (strpos($ruta, 'uploads/') === 0) {
        return '/concurso_nobel/' . $ruta;
    }

    return '/concurso_nobel/uploads/concursos/' . basename($ruta);
}


function r_es_ruta_imagen($valor): bool
{
    $valor = trim((string)$valor);

    if ($valor === '') {
        return false;
    }

    return (bool)preg_match('~\.(png|jpe?g|gif|webp|svg)(\?.*)?$~i', $valor);
}

function r_normalizar_clave(string $clave): string
{
    $clave = strtolower($clave);
    return preg_replace('/[^a-z0-9]/', '', $clave) ?? '';
}

function r_buscar_por_alias(array $data, array $aliases, array $evitar = []): string
{
    foreach ($aliases as $alias) {
        if (isset($data[$alias]) && r_es_ruta_imagen((string)$data[$alias])) {
            return (string)$data[$alias];
        }
    }

    $aliasNorm = array_map('r_normalizar_clave', $aliases);
    $evitarNorm = array_map('r_normalizar_clave', $evitar);

    foreach ($data as $clave => $valor) {
        if (!is_scalar($valor) || !r_es_ruta_imagen((string)$valor)) {
            continue;
        }

        $norm = r_normalizar_clave((string)$clave);

        if (in_array($norm, $aliasNorm, true)) {
            return (string)$valor;
        }
    }

    foreach ($data as $clave => $valor) {
        if (!is_scalar($valor) || !r_es_ruta_imagen((string)$valor)) {
            continue;
        }

        $norm = r_normalizar_clave((string)$clave);

        foreach ($evitarNorm as $bloq) {
            if ($bloq !== '' && strpos($norm, $bloq) !== false) {
                continue 2;
            }
        }

        foreach ($aliasNorm as $a) {
            if ($a !== '' && strpos($norm, $a) !== false) {
                return (string)$valor;
            }
        }
    }

    return '';
}

function r_detectar_imagenes_concurso(array $concurso): array
{
    /*
    Prioridad:
    1) cabecera completa / banner completo para ocupar todo el encabezado.
    2) si no existe, sistema anterior de 3 imágenes: logo izquierdo, banner central y logo derecho.
    3) si los nombres de columnas son raros, busca cualquier campo que contenga ruta de imagen.
    */

    $cabeceraCompleta = r_buscar_por_alias($concurso, [
        'cabecera_completa',
        'banner_encabezado',
        'imagen_encabezado',
        'imagen_cabecera',
        'cabecera_resultados',
        'banner_resultados',
        'banner_reporte',
        'banner_general',
        'banner_completo',
        'header',
        'header_resultados',
        'cabecera',
        'portada_resultados'
    ], [
        'logo',
        'escudo',
        'secundario',
        'derecho',
        'right'
    ]);

    $principal = r_buscar_por_alias($concurso, [
        'logo_principal',
        'logo',
        'logo1',
        'logo_1',
        'imagen_logo',
        'logo_colegio',
        'logo_institucion',
        'foto_logo',
        'foto1',
        'imagen1',
        'logoizquierdo',
        'logo_izquierdo',
        'logoleft',
        'logo_left'
    ], [
        'secundario',
        'secondary',
        'derecho',
        'right',
        'logo2',
        'logo_2',
        'escudo',
        'banner',
        'cabecera',
        'header',
        'encabezado'
    ]);

    $banner = r_buscar_por_alias($concurso, [
        'imagen_banner',
        'banner',
        'banner_concurso',
        'bannerprincipal',
        'banner_principal',
        'imagen_concurso',
        'afiche'
    ], [
        'logo2',
        'logo_2',
        'secundario',
        'secondary',
        'escudo'
    ]);

    $secundario = r_buscar_por_alias($concurso, [
        'logo_secundario',
        'logo2',
        'logo_2',
        'segundo_logo',
        'logo_derecho',
        'logo_right',
        'logoright',
        'escudo',
        'escudo_colegio',
        'escudo_concurso',
        'foto2',
        'imagen2',
        'logosup',
        'logo_sec'
    ], [
        'principal',
        'banner',
        'cabecera',
        'header',
        'encabezado'
    ]);

    $todas = [];
    foreach ($concurso as $clave => $valor) {
        if (is_scalar($valor) && r_es_ruta_imagen((string)$valor)) {
            $todas[(string)$clave] = (string)$valor;
        }
    }

    /*
    Si solamente hay una imagen tipo banner/imagen_banner y no hay logos laterales,
    la usamos como cabecera completa. Esto permite subir una sola imagen diseñada.
    */
    if ($cabeceraCompleta === '' && $banner !== '' && $principal === '' && $secundario === '') {
        $cabeceraCompleta = $banner;
        $banner = '';
    }

    $usadas = array_filter([$cabeceraCompleta, $principal, $banner, $secundario]);

    if ($principal === '') {
        foreach ($todas as $clave => $valor) {
            $n = r_normalizar_clave($clave);
            if (strpos($n, 'banner') !== false || strpos($n, 'cabecera') !== false || strpos($n, 'header') !== false) {
                continue;
            }
            if (!in_array($valor, $usadas, true)) {
                $principal = $valor;
                $usadas[] = $valor;
                break;
            }
        }
    }

    if ($banner === '' && $cabeceraCompleta === '') {
        foreach ($todas as $clave => $valor) {
            $n = r_normalizar_clave($clave);
            if (strpos($n, 'logo') !== false || strpos($n, 'escudo') !== false) {
                continue;
            }
            if (!in_array($valor, $usadas, true)) {
                $banner = $valor;
                $usadas[] = $valor;
                break;
            }
        }
    }

    if ($secundario === '') {
        foreach ($todas as $valor) {
            if (!in_array($valor, $usadas, true)) {
                $secundario = $valor;
                $usadas[] = $valor;
                break;
            }
        }
    }

    return [
        'cabecera_completa' => $cabeceraCompleta,
        'logo_principal' => $principal,
        'imagen_banner' => $banner,
        'logo_secundario' => $secundario,
    ];
}

function r_cargar_concurso_completo(mysqli $conn, int $idConcurso, array $base = []): array
{
    $full = $base;

    $stmt = mysqli_prepare($conn, "SELECT * FROM concursos WHERE id_concurso = ? LIMIT 1");
    if ($stmt) {
        mysqli_stmt_bind_param($stmt, 'i', $idConcurso);
        mysqli_stmt_execute($stmt);
        $res = mysqli_stmt_get_result($stmt);
        $row = mysqli_fetch_assoc($res);
        mysqli_stmt_close($stmt);

        if ($row) {
            $full = array_merge($row, $base);
        }
    }

    $imagenes = r_detectar_imagenes_concurso($full);

    foreach ($imagenes as $k => $v) {
        if (!isset($full[$k]) || trim((string)$full[$k]) === '') {
            $full[$k] = $v;
        }
    }

    return $full;
}

function r_render_brand_header(array $concurso, string $nombreConcurso): void
{
    $imagenes = r_detectar_imagenes_concurso($concurso);

    $cabeceraCompleta = r_asset_url($concurso['cabecera_completa'] ?? $imagenes['cabecera_completa'] ?? '');

    if ($cabeceraCompleta !== '') {
        ?>
        <div class="brand-full">
            <img src="<?php echo cn_h($cabeceraCompleta); ?>" alt="Cabecera del concurso" class="brand-full-image">
        </div>
        <?php
        return;
    }

    $logoPrincipal = r_asset_url($concurso['logo_principal'] ?? $imagenes['logo_principal'] ?? '');
    $logoSecundario = r_asset_url($concurso['logo_secundario'] ?? $imagenes['logo_secundario'] ?? '');
    $bannerCentral = r_asset_url($concurso['imagen_banner'] ?? $imagenes['imagen_banner'] ?? '');
    ?>
    <div class="brand-strip">
        <div class="brand-side brand-side-left <?php echo $logoPrincipal !== '' ? 'has-image' : 'is-empty'; ?>">
            <?php if ($logoPrincipal !== ''): ?>
                <img src="<?php echo cn_h($logoPrincipal); ?>" alt="Logo principal" class="brand-image brand-image-left">
            <?php else: ?>
                <div class="brand-fallback brand-fallback-left">
                    <span class="brand-fallback-top">COLEGIO</span>
                    <span class="brand-fallback-main">NOBEL INGENIEROS</span>
                </div>
            <?php endif; ?>
        </div>

        <div class="brand-center <?php echo $bannerCentral !== '' ? 'has-image' : 'text-mode'; ?>">
            <?php if ($bannerCentral !== ''): ?>
                <img src="<?php echo cn_h($bannerCentral); ?>" alt="Banner del concurso" class="brand-banner-image">
                <div class="brand-center-caption"><?php echo cn_h($nombreConcurso); ?></div>
            <?php else: ?>
                <div class="brand-title">COLEGIO NOBEL INGENIEROS</div>
                <div class="brand-subtitle"><?php echo cn_h($nombreConcurso); ?></div>
            <?php endif; ?>
        </div>

        <div class="brand-side brand-side-right <?php echo $logoSecundario !== '' ? 'has-image' : 'is-empty'; ?>">
            <?php if ($logoSecundario !== ''): ?>
                <img src="<?php echo cn_h($logoSecundario); ?>" alt="Logo secundario" class="brand-image brand-image-right">
            <?php else: ?>
                <div class="brand-fallback brand-fallback-right">
                    <span class="brand-fallback-top">CONCURSO</span>
                    <span class="brand-fallback-main">2026</span>
                </div>
            <?php endif; ?>
        </div>
    </div>
    <?php
}


function r_titulo_grado_categoria(string $nombreGrupo, string $nombreSalon, string $tipo): string
{
    $partes = [trim($nombreGrupo)];
    $salon = trim($nombreSalon);

    // "TODOS LOS SALONES" se mantiene solo como dato interno/filtro, pero no se muestra en pantalla ni PDF.
    if ($salon !== '' && mb_strtoupper($salon, 'UTF-8') !== 'TODOS LOS SALONES') {
        $partes[] = $salon;
    }

    $partes[] = r_tipo_label($tipo);

    return implode(' - ', array_filter($partes, static function ($v) {
        return trim((string)$v) !== '';
    }));
}

function r_render_tabla_excel(array $resultados, string $nombreConcurso, string $nombreGrupo, string $nombreSalon, string $tipo): void
{
    ?>
    <table>
        <tr>
            <td colspan="10" class="titulo">COLEGIO NOBEL INGENIEROS - <?php echo cn_h($nombreConcurso); ?></td>
        </tr>
        <tr>
            <td colspan="10" class="subtitulo"><?php echo cn_h(r_titulo_grado_categoria($nombreGrupo, $nombreSalon, $tipo)); ?></td>
        </tr>
        <tr class="head">
            <th>N°</th>
            <th>APELLIDOS Y NOMBRES</th>
            <th>I.E</th>
            <th>TIPO</th>
            <th>SALÓN</th>
            <th>CORRECTA</th>
            <th>INCORRECTA</th>
            <th>BLANCO</th>
            <th>PUNTAJE</th>
            <th>TIEMPO</th>
        </tr>
        <?php if (!empty($resultados)): ?>
            <?php $n = 1; foreach ($resultados as $r): ?>
                <tr>
                    <td class="center"><?php echo $n; ?></td>
                    <td><?php echo cn_h($r['apellidos_nombres']); ?></td>
                    <td><?php echo cn_h($r['institucion_educativa']); ?></td>
                    <td class="center"><?php echo cn_h(r_tipo_label($r['tipo_institucion'])); ?></td>
                    <td class="center"><?php echo cn_h($r['nombre_salon'] ?: ''); ?></td>
                    <td class="center"><?php echo cn_h($r['correctas']); ?></td>
                    <td class="center"><?php echo cn_h($r['incorrectas']); ?></td>
                    <td class="center"><?php echo cn_h($r['blanco']); ?></td>
                    <td class="right"><?php echo cn_h(r_num($r['puntaje'])); ?></td>
                    <td class="center"><?php echo cn_h($r['tiempo_texto'] ?: ''); ?></td>
                </tr>
            <?php $n++; endforeach; ?>
        <?php else: ?>
            <tr>
                <td colspan="10" class="center">Sin resultados</td>
            </tr>
        <?php endif; ?>
    </table>
    <br>
    <?php
}

function r_render_tabla_html(array $resultados, string $nombreConcurso, string $nombreGrupo, string $nombreSalon, string $tipo, array $concurso = []): void
{
    ?>
    <section class="sheet">
        <table>
            <colgroup>
                <col class="col-num">
                <col class="col-nombre">
                <col class="col-ie">
                <col class="col-tipo">
                <col class="col-salon">
                <col class="col-corta">
                <col class="col-corta">
                <col class="col-corta">
                <col class="col-puntaje">
                <col class="col-tiempo">
            </colgroup>

            <tr>
                <td colspan="10" class="banner-wrap">
                    <?php r_render_brand_header($concurso, $nombreConcurso); ?>
                </td>
            </tr>
            <tr>
                <td colspan="10" class="grade">
                    <?php echo cn_h(r_titulo_grado_categoria($nombreGrupo, $nombreSalon, $tipo)); ?>
                </td>
            </tr>
            <tr class="head">
                <th>N°</th>
                <th>APELLIDOS Y NOMBRES</th>
                <th>I.E</th>
                <th>TIPO</th>
                <th>SALÓN</th>
                <th>CORRECTA</th>
                <th>INCORRECTA</th>
                <th>BLANCO</th>
                <th>PUNTAJE</th>
                <th>TIEMPO</th>
            </tr>

            <?php if (!empty($resultados)): ?>
                <?php $n = 1; foreach ($resultados as $r): ?>
                    <tr>
                        <td class="center"><?php echo cn_h($n); ?></td>
                        <td><?php echo cn_h($r['apellidos_nombres']); ?></td>
                        <td><?php echo cn_h($r['institucion_educativa']); ?></td>
                        <td class="center tipo"><?php echo cn_h(r_tipo_label($r['tipo_institucion'])); ?></td>
                        <td class="center"><?php echo cn_h($r['nombre_salon'] ?: ''); ?></td>
                        <td class="center"><?php echo cn_h($r['correctas']); ?></td>
                        <td class="center"><?php echo cn_h($r['incorrectas']); ?></td>
                        <td class="center"><?php echo cn_h($r['blanco']); ?></td>
                        <td class="right puntaje"><?php echo cn_h(r_num($r['puntaje'])); ?></td>
                        <td class="center"><?php echo cn_h($r['tiempo_texto'] ?: ''); ?></td>
                    </tr>
                <?php $n++; endforeach; ?>
            <?php else: ?>
                <tr>
                    <td colspan="10" class="empty">
                        Todavía no hay calificaciones registradas para esta categoría.
                    </td>
                </tr>
            <?php endif; ?>
        </table>
    </section>
    <?php
}

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

if ((int)$acceso['puede_ver_resultados'] !== 1 && !cn_es_admin($acceso)) {
    http_response_code(403);
    die('Tu código no tiene permiso para ver resultados.');
}

$esAdmin = cn_es_admin($acceso);
$idConcurso = cn_concurso_trabajo($conn, $acceso);

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

$concursoTrabajo = cn_datos_concurso($conn, $idConcurso);
$concursoTrabajo = r_cargar_concurso_completo($conn, $idConcurso, $concursoTrabajo ?: []);
$concursosActivos = $esAdmin ? cn_concursos_activos($conn) : [];

$idGrupoFijo = $esAdmin ? 0 : cn_id_grupo_fijo($acceso);
$idSalonFijo = $esAdmin ? 0 : cn_id_salon_fijo($acceso);

$grupos = cn_grupos_concurso($conn, $idConcurso, $idGrupoFijo);

$idGrupoSeleccionado = $idGrupoFijo > 0 ? $idGrupoFijo : (int)($_GET['id_grupo'] ?? 0);

if ($idGrupoSeleccionado <= 0 && !empty($grupos)) {
    $idGrupoSeleccionado = (int)$grupos[0]['id_grupo'];
}

$grupoActual = null;

foreach ($grupos as $g) {
    if ((int)$g['id_grupo'] === $idGrupoSeleccionado) {
        $grupoActual = $g;
        break;
    }
}

if (!$grupoActual && !empty($grupos)) {
    $grupoActual = $grupos[0];
    $idGrupoSeleccionado = (int)$grupoActual['id_grupo'];
}

$salones = $idGrupoSeleccionado > 0 ? r_cargar_salones($conn, $idConcurso, $idGrupoSeleccionado, $idSalonFijo) : [];

$idSalonFiltro = $idSalonFijo > 0 ? $idSalonFijo : (int)($_GET['id_salon'] ?? 0);
$salonValido = $idSalonFiltro === 0;

foreach ($salones as $salon) {
    if ((int)$salon['id_salon'] === $idSalonFiltro) {
        $salonValido = true;
        break;
    }
}

if (!$salonValido) {
    $idSalonFiltro = 0;
}

$tipoFiltro = strtoupper(trim((string)($_GET['tipo'] ?? 'TODOS')));

if (!r_tipo_valido($tipoFiltro)) {
    $tipoFiltro = 'TODOS';
}

$modoPdfGeneral = isset($_GET['pdf_general']) && $_GET['pdf_general'] === '1';

$resultados = [];

if ($idGrupoSeleccionado > 0 && !$modoPdfGeneral) {
    $resultados = r_cargar_resultados($conn, $idConcurso, $idGrupoSeleccionado, $idSalonFiltro, $tipoFiltro);
}

$totalParticipantes = $idGrupoSeleccionado > 0 ? r_contar_participantes($conn, $idConcurso, $idGrupoSeleccionado, $idSalonFiltro, $tipoFiltro) : 0;
$totalCalificadosTodos = $idGrupoSeleccionado > 0 ? r_contar_calificados($conn, $idConcurso, $idGrupoSeleccionado, $idSalonFiltro, $tipoFiltro, null) : 0;
$totalCalificados = count($resultados); // publicados/visibles
$totalNoPublicados = $idGrupoSeleccionado > 0 ? r_contar_calificados($conn, $idConcurso, $idGrupoSeleccionado, $idSalonFiltro, $tipoFiltro, 0) : 0;
$totalPendientes = max(0, $totalParticipantes - $totalCalificadosTodos);
$ambito = cn_ambito_texto($acceso, $concursoTrabajo);

$nombreConcurso = $concursoTrabajo ? trim(($concursoTrabajo['nombre'] ?? '') . ' ' . ($concursoTrabajo['subtitulo'] ?? '')) : 'Concurso';
$nombreGrupo = $grupoActual ? (string)$grupoActual['nombre'] : 'Sin grado';
$nombreSalon = 'TODOS LOS SALONES';

if ($idSalonFiltro > 0) {
    foreach ($salones as $salon) {
        if ((int)$salon['id_salon'] === $idSalonFiltro) {
            $nombreSalon = (string)$salon['nombre_salon'];
            break;
        }
    }
}

$paramsBase = [
    'id_concurso' => $idConcurso,
    'id_grupo' => $idGrupoSeleccionado,
    'id_salon' => $idSalonFiltro,
    'tipo' => $tipoFiltro
];

$queryExport = http_build_query(array_merge($paramsBase, [
    'export' => 'xls'
]));

$queryPdfGeneral = http_build_query([
    'id_concurso' => $idConcurso,
    'tipo' => $tipoFiltro,
    'pdf_general' => '1'
]);

$resultadosPrivada = r_filtrar_por_tipo($resultados, 'PRIVADA');
$resultadosPublica = r_filtrar_por_tipo($resultados, 'PUBLICA');

if (isset($_GET['export']) && $_GET['export'] === 'xls') {
    $archivo = 'resultados_' . preg_replace('/[^A-Za-z0-9_]/', '_', $nombreGrupo . '_' . $tipoFiltro) . '_' . date('Ymd_His') . '.xls';

    header('Content-Type: application/vnd.ms-excel; charset=utf-8');
    header('Content-Disposition: attachment; filename="' . $archivo . '"');
    header('Pragma: no-cache');
    header('Expires: 0');

    echo "\xEF\xBB\xBF";
    ?>
    <html>
    <head>
        <meta charset="UTF-8">
        <style>
            table{border-collapse:collapse;font-family:Arial}
            th,td{border:1px solid #000;padding:5px}
            .titulo{background:#d90000;color:#fff;font-weight:bold;font-size:18px;text-align:center}
            .subtitulo{background:#ffc000;color:#000;font-weight:bold;text-align:center}
            .head{background:#d90000;color:#fff;font-weight:bold;text-align:center}
            .center{text-align:center}
            .right{text-align:right}
        </style>
    </head>
    <body>
        <?php
        if ($tipoFiltro === 'TODOS') {
            r_render_tabla_excel($resultadosPrivada, $nombreConcurso, $nombreGrupo, $nombreSalon, 'PRIVADA');
            r_render_tabla_excel($resultadosPublica, $nombreConcurso, $nombreGrupo, $nombreSalon, 'PUBLICA');
        } else {
            r_render_tabla_excel($resultados, $nombreConcurso, $nombreGrupo, $nombreSalon, $tipoFiltro);
        }
        ?>
    </body>
    </html>
    <?php
    exit;
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Resultados finales | NOBEX</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css">
    <link rel="stylesheet" href="assets/css/menu_concurso.css?v=4">

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

        body{
            margin:0;
            font-family:Arial,Helvetica,sans-serif;
            background:#e9edf5;
            color:#111827;
        }

        .topbar{
            background:#d90000;
            color:#fff;
            border-bottom:8px solid #ffcc00;
            padding:18px 22px;
        }

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

        .topbar h1{
            margin:0;
            font-size:24px;
            font-weight:900;
        }

        .topbar p{
            margin:5px 0 0;
            color:#ffcc00;
            font-weight:800;
            font-size:14px;
        }

        .topbar a{
            color:#fff;
            text-decoration:none;
            border:1px solid rgba(255,255,255,.55);
            border-radius:12px;
            padding:10px 14px;
            font-weight:800;
        }

        .container{
            max-width:1450px;
            margin:22px auto;
            padding:0 14px 38px;
        }

        .card{
            background:#fff;
            border:1px solid #d1d5db;
            border-radius:18px;
            padding:18px;
            box-shadow:0 12px 30px rgba(15,23,42,.08);
            margin-bottom:18px;
        }

        .filters{
            display:grid;
            grid-template-columns:repeat(5,1fr);
            gap:14px;
            align-items:end;
        }

        label{
            display:block;
            font-weight:900;
            margin:0 0 6px;
        }

        select{
            width:100%;
            border:1px solid #d1d5db;
            border-radius:10px;
            padding:10px;
            font-size:14px;
            background:#fff;
        }

        .btn{
            display:inline-block;
            border:0;
            border-radius:12px;
            background:#1d4ed8;
            color:#fff;
            font-weight:900;
            padding:11px 14px;
            text-decoration:none;
            cursor:pointer;
            margin:2px 0;
            text-align:center;
        }

        .btn.gray{background:#374151}
        .btn.red{background:#b91c1c}

        .stats{
            display:flex;
            gap:10px;
            flex-wrap:wrap;
            margin-top:12px;
        }

        .chip{
            background:#eff6ff;
            color:#1e40af;
            border:1px solid #bfdbfe;
            border-radius:999px;
            padding:7px 11px;
            font-weight:900;
            font-size:13px;
        }

        .sheet{
            background:#fff;
            border:1px solid #111;
            overflow-x:auto;
            margin-bottom:22px;
        }

        table{
            width:100%;
            border-collapse:collapse;
            min-width:1180px;
        }

        th,td{
            border:1px solid #111;
            padding:6px 7px;
            font-size:13px;
            vertical-align:middle;
        }

        .banner-wrap{
            background:#d90000;
            padding:0 !important;
        }

        .brand-full{
            height:96px;
            width:100%;
            background:#d90000;
            overflow:hidden;
            display:flex;
            align-items:center;
            justify-content:center;
            padding:0;
        }

        .brand-full-image{
            width:auto;
            max-width:100%;
            height:100%;
            object-fit:contain;
            object-position:center center;
            display:block;
        }

        .brand-strip{
            display:grid;
            grid-template-columns:240px minmax(420px,1fr) 170px;
            gap:20px;
            align-items:center;
            min-height:120px;
            padding:12px 18px;
            background:#d90000;
        }

        .brand-side,
        .brand-center{
            display:flex;
            align-items:center;
            justify-content:center;
            min-height:92px;
        }

        .brand-side.has-image,
        .brand-center.has-image{
            background:transparent;
        }

        .brand-image,
        .brand-banner-image{
            display:block;
            max-width:100%;
            object-fit:contain;
            filter:drop-shadow(0 4px 10px rgba(0,0,0,.18));
        }

        .brand-image-left{
            max-height:90px;
            width:auto;
        }

        .brand-image-right{
            max-height:84px;
            width:auto;
        }

        .brand-center{
            flex-direction:column;
            text-align:center;
        }

        .brand-banner-image{
            max-height:86px;
            width:auto;
        }

        .brand-center-caption{
            margin-top:5px;
            font-weight:800;
            font-size:12px;
            letter-spacing:.4px;
            color:#ffe08a;
        }

        .brand-title{
            color:#fff;
            font-size:20px;
            font-weight:900;
            line-height:1.15;
            text-transform:uppercase;
            letter-spacing:.4px;
        }

        .brand-subtitle{
            margin-top:6px;
            color:#ffdd66;
            font-size:16px;
            font-weight:900;
            line-height:1.2;
            text-transform:uppercase;
        }

        .brand-fallback{
            display:flex;
            flex-direction:column;
            align-items:center;
            justify-content:center;
            min-height:74px;
            width:100%;
            border:2px dashed rgba(255,255,255,.30);
            border-radius:18px;
            padding:10px 12px;
            text-align:center;
            background:rgba(255,255,255,.06);
        }

        .brand-fallback-top{
            color:#ffdd66;
            font-size:12px;
            font-weight:900;
            letter-spacing:1px;
            text-transform:uppercase;
        }

        .brand-fallback-main{
            color:#fff;
            font-size:18px;
            font-weight:900;
            line-height:1.1;
            text-transform:uppercase;
        }

        .grade{
            background:#ffcc00;
            color:#000;
            text-align:center;
            font-weight:900;
            font-size:17px;
            letter-spacing:.3px;
        }

        .head{
            background:#d90000;
            color:#fff;
            text-align:center;
            font-weight:900;
        }

        .center{text-align:center}
        .right{text-align:right}


        .puntaje{
            font-weight:900;
        }

        .tipo{
            font-weight:900;
            color:#92400e;
        }

        .empty{
            padding:22px;
            text-align:center;
            color:#6b7280;
            font-style:italic;
        }

        .col-num{width:4%}
        .col-nombre{width:25%}
        .col-ie{width:23%}
        .col-tipo{width:8%}
        .col-salon{width:8%}
        .col-corta{width:6%}
        .col-puntaje{width:8%}
        .col-tiempo{width:8%}

        @media(max-width:1050px){
            .topbar-inner{
                flex-direction:column;
                align-items:flex-start;
            }

            .filters{
                grid-template-columns:1fr;
            }

            table{
                min-width:1050px;
            }

            .brand-strip{
                grid-template-columns:190px 1fr 140px;
                gap:14px;
                min-height:110px;
                padding:10px 12px;
            }

            .brand-image-left{max-height:74px}
            .brand-image-right{max-height:68px}
            .brand-banner-image{max-height:76px}
        }

        body.print-mode{
            background:#fff;
        }

        body.print-mode .topbar,
        body.print-mode .card.no-print{
            display:none;
        }

        body.print-mode .container{
            max-width:none;
            width:100%;
            margin:0;
            padding:0;
        }

        body.print-mode .sheet{
            border:0;
            margin:0;
            overflow:visible;
            page-break-after:always;
            break-after:page;
        }

        body.print-mode .sheet:last-child{
            page-break-after:auto;
            break-after:auto;
        }

        body.print-mode table{
            width:100%;
            min-width:0;
            table-layout:fixed;
        }

        @page{
            size:A4 landscape;
            margin:8mm;
        }

        @media print{
            *{
                -webkit-print-color-adjust:exact !important;
                print-color-adjust:exact !important;
            }

            html,body{
                margin:0 !important;
                padding:0 !important;
                background:#fff !important;
            }

            .topbar,
            .card.no-print{
                display:none !important;
            }

            .container{
                max-width:none !important;
                width:100% !important;
                margin:0 !important;
                padding:0 !important;
            }

            .sheet{
                border:0 !important;
                margin:0 !important;
                padding:0 !important;
                overflow:visible !important;
                page-break-after:always;
                break-after:page;
            }

            .sheet:last-child{
                page-break-after:auto;
                break-after:auto;
            }

            table{
                width:100% !important;
                min-width:0 !important;
                table-layout:fixed !important;
                border-collapse:collapse !important;
            }

            th,td{
                border:1px solid #111 !important;
                padding:4px 5px !important;
                font-size:10.5px !important;
                line-height:1.15 !important;
                word-wrap:break-word;
                overflow-wrap:break-word;
            }

            .banner-wrap{
                background:#d90000 !important;
                padding:0 !important;
            }

            .brand-full{
                height:25mm !important;
                width:100% !important;
                background:#d90000 !important;
                overflow:hidden !important;
                display:flex !important;
                align-items:center !important;
                justify-content:center !important;
                padding:0 !important;
            }

            .brand-full-image{
                width:245mm !important;
                max-width:100% !important;
                height:25mm !important;
                object-fit:contain !important;
                object-position:center center !important;
                display:block !important;
            }

            .brand-strip{
                grid-template-columns:200px 1fr 135px !important;
                gap:14px !important;
                min-height:92px !important;
                padding:9px 12px !important;
                background:#d90000 !important;
            }

            .brand-image-left{
                max-height:66px !important;
            }

            .brand-image-right{
                max-height:60px !important;
            }

            .brand-banner-image{
                max-height:62px !important;
            }

            .brand-title{
                font-size:16px !important;
            }

            .brand-subtitle{
                font-size:12px !important;
            }

            .brand-center-caption{
                font-size:10px !important;
                color:#ffe08a !important;
            }

            .grade{
                background:#ffcc00 !important;
                color:#000 !important;
                font-size:14px !important;
            }

            .head{
                background:#d90000 !important;
                color:#fff !important;
            }


            .tipo{
                color:#92400e !important;
                font-weight:900 !important;
            }
        }
    </style>
</head>

<body class="<?php echo $modoPdfGeneral ? 'print-mode' : 'cn-con-sidebar'; ?>">

<?php if (!$modoPdfGeneral): ?>
    <?php include __DIR__ . '/includes/sidebar_concurso.php'; ?>
<?php endif; ?>

<header class="topbar">
    <div class="topbar-inner">
        <div>
            <h1>Resultados finales</h1>
            <p><?php echo cn_h($ambito); ?> | Código: <?php echo cn_h($acceso['codigo']); ?></p>
        </div>
        <a href="panel.php">Volver al panel</a>
    </div>
</header>

<main class="container">

    <section class="card no-print">
        <form method="get" class="filters">
            <?php if ($esAdmin): ?>
                <div>
                    <label>Concurso</label>
                    <select name="id_concurso" onchange="this.form.submit()">
                        <?php foreach ($concursosActivos as $c): ?>
                            <option value="<?php echo cn_h($c['id_concurso']); ?>" <?php echo (int)$c['id_concurso'] === $idConcurso ? 'selected' : ''; ?>>
                                <?php echo cn_h($c['nombre'] . ' ' . $c['subtitulo']); ?>
                            </option>
                        <?php endforeach; ?>
                    </select>
                </div>
            <?php endif; ?>

            <div>
                <label>Grado</label>
                <?php if ($idGrupoFijo > 0): ?>
                    <select disabled>
                        <option><?php echo cn_h($nombreGrupo); ?></option>
                    </select>
                <?php else: ?>
                    <select name="id_grupo" onchange="this.form.submit()">
                        <?php foreach ($grupos as $g): ?>
                            <option value="<?php echo cn_h($g['id_grupo']); ?>" <?php echo (int)$g['id_grupo'] === $idGrupoSeleccionado ? 'selected' : ''; ?>>
                                <?php echo cn_h($g['nombre']); ?>
                            </option>
                        <?php endforeach; ?>
                    </select>
                <?php endif; ?>
            </div>

            <div>
                <label>Salón</label>
                <?php if ($idSalonFijo > 0): ?>
                    <select disabled>
                        <option><?php echo cn_h($nombreSalon); ?></option>
                    </select>
                <?php else: ?>
                    <select name="id_salon" onchange="this.form.submit()">
                        <option value="0" <?php echo $idSalonFiltro === 0 ? 'selected' : ''; ?>>Todos los salones</option>
                        <?php foreach ($salones as $s): ?>
                            <option value="<?php echo cn_h($s['id_salon']); ?>" <?php echo (int)$s['id_salon'] === $idSalonFiltro ? 'selected' : ''; ?>>
                                <?php echo cn_h($s['nombre_salon']); ?>
                            </option>
                        <?php endforeach; ?>
                    </select>
                <?php endif; ?>
            </div>

            <div>
                <label>Categoría</label>
                <select name="tipo" onchange="this.form.submit()">
                    <option value="TODOS" <?php echo $tipoFiltro === 'TODOS' ? 'selected' : ''; ?>>Privada y pública</option>
                    <option value="PRIVADA" <?php echo $tipoFiltro === 'PRIVADA' ? 'selected' : ''; ?>>Solo privada</option>
                    <option value="PUBLICA" <?php echo $tipoFiltro === 'PUBLICA' ? 'selected' : ''; ?>>Solo pública</option>
                </select>
            </div>

            <div>
                <a class="btn" href="resultados.php?<?php echo cn_h($queryExport); ?>">
                    Exportar Excel
                </a>

                <button type="button" class="btn gray" onclick="window.print()">
                    Imprimir vista actual
                </button>

                <a class="btn red" target="_blank" href="resultados.php?<?php echo cn_h($queryPdfGeneral); ?>">
                    PDF general por grado
                </a>

                <?php if ($esAdmin): ?>
                    <a class="btn gray" href="publicacion_resultados.php?id_concurso=<?php echo cn_h($idConcurso); ?>">
                        Controlar publicación
                    </a>
                <?php endif; ?>
            </div>
        </form>

        <div class="stats">
            <span class="chip">Participantes: <?php echo cn_h($totalParticipantes); ?></span>
            <span class="chip">Calificados: <?php echo cn_h($totalCalificadosTodos); ?></span>
            <span class="chip">Publicados: <?php echo cn_h($totalCalificados); ?></span>
            <span class="chip">No publicados: <?php echo cn_h($totalNoPublicados); ?></span>
            <span class="chip">Pendientes: <?php echo cn_h($totalPendientes); ?></span>
            <span class="chip">Ranking separado por PRIVADA / PÚBLICA</span>
        </div>
    </section>

    <?php if ($modoPdfGeneral): ?>

        <?php
        $tiposPdf = ['PRIVADA', 'PUBLICA'];

        if ($tipoFiltro === 'PRIVADA') {
            $tiposPdf = ['PRIVADA'];
        } elseif ($tipoFiltro === 'PUBLICA') {
            $tiposPdf = ['PUBLICA'];
        }
        ?>

        <?php foreach ($tiposPdf as $tipoPdf): ?>
            <?php foreach ($grupos as $grupoPdf): ?>
                <?php
                $idGrupoPdf = (int)$grupoPdf['id_grupo'];
                $nombreGrupoPdf = (string)$grupoPdf['nombre'];

                $resultadosPdf = r_cargar_resultados(
                    $conn,
                    $idConcurso,
                    $idGrupoPdf,
                    0,
                    $tipoPdf
                );

                r_render_tabla_html(
                    $resultadosPdf,
                    $nombreConcurso,
                    $nombreGrupoPdf,
                    'TODOS LOS SALONES',
                    $tipoPdf,
                    $concursoTrabajo ?: []
                );
                ?>
            <?php endforeach; ?>
        <?php endforeach; ?>

    <?php else: ?>

        <?php if ($tipoFiltro === 'TODOS'): ?>
            <?php r_render_tabla_html($resultadosPrivada, $nombreConcurso, $nombreGrupo, $nombreSalon, 'PRIVADA', $concursoTrabajo ?: []); ?>
            <?php r_render_tabla_html($resultadosPublica, $nombreConcurso, $nombreGrupo, $nombreSalon, 'PUBLICA', $concursoTrabajo ?: []); ?>
        <?php else: ?>
            <?php r_render_tabla_html($resultados, $nombreConcurso, $nombreGrupo, $nombreSalon, $tipoFiltro, $concursoTrabajo ?: []); ?>
        <?php endif; ?>

    <?php endif; ?>

</main>

<?php if ($modoPdfGeneral): ?>
<script>
    window.addEventListener('load', function () {
        setTimeout(function () {
            window.print();
        }, 500);
    });
</script>
<?php endif; ?>

</body>
</html>
