<?php
// concurso_nobel/computo_premios.php
// Cómputo de premios NOBEX.
// Reglas aplicadas:
// 1) Solo estudiantes calificados visibles: concurso_resultados ACTIVO + participante ACTIVO.
// 2) Respeta ocultados/excluidos si existen columnas de ocultamiento en resultados, participantes o grupos.
// 3) Recalcula los puestos después de ocultar estudiantes, salones/grupos o instituciones.
// 4) Agrupa instituciones con nombres parecidos para sumar correctamente sus puntos.
// 5) Trofeo de campeón: colegio con mayor puntaje por puesto, separado por nivel y modalidad.

declare(strict_types=1);

session_start();

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

date_default_timezone_set('America/Lima');

$PUNTOS = [1 => 10, 2 => 5, 3 => 3, 4 => 2, 5 => 1];

$PREMIOS_ESTUDIANTE = [
    1 => 'Medalla · Diploma de honor · Beca Nobel Ingenieros Ciclo Vacacional 2027 · Compendios académicos',
    2 => 'Medalla · Diploma de honor · 1/2 Beca Nobel Ingenieros Ciclo Vacacional 2027',
    3 => 'Diploma de honor',
];

$PREMIO_TROFEO = 'Trofeo de campeón';
$PREMIO_COMPUTO_COMPUTOS = '1 Alexa';
$PREMIO_MAYOR_PARTICIPACION = 'S/ 500.00 + gallardete';

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

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

function cp_tipo(string $t): string
{
    $t = cp_up($t);
    return $t === 'PUBLICA' || $t === 'PÚBLICA' ? 'PÚBLICA' : 'PRIVADA';
}

function cp_tipo_key(string $t): string
{
    $t = cp_up($t);
    return $t === 'PUBLICA' || $t === 'PÚBLICA' ? 'PUBLICA' : 'PRIVADA';
}

function cp_nivel(?string $n): string
{
    $n = cp_up((string)$n);
    if ($n === 'INICIAL') {
        return 'Inicial';
    }

    if ($n === 'PRIMARIA') {
        return 'Primaria';
    }

    if ($n === 'SECUNDARIA') {
        return 'Secundaria';
    }

    return $n ?: 'Sin nivel';
}

function cp_nivel_key(?string $n): string
{
    $n = cp_up((string)$n);
    return $n ?: 'SIN NIVEL';
}

function cp_nivel_orden(?string $n): int
{
    $nivel = cp_nivel_key($n);

    if ($nivel === 'INICIAL') {
        return 1;
    }

    if ($nivel === 'PRIMARIA') {
        return 2;
    }

    if ($nivel === 'SECUNDARIA') {
        return 3;
    }

    return 99;
}

function cp_puesto(int $p): string
{
    return $p . ".\xC2\xBA Puesto";
}

function cp_rank_class(int $p): string
{
    if ($p === 1) {
        return 'gold';
    }

    if ($p === 2) {
        return 'silver';
    }

    if ($p === 3) {
        return 'bronze';
    }

    return '';
}

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

function cp_bind(mysqli_stmt $stmt, string $types, array $params): bool
{
    $refs = [$stmt, $types];
    foreach ($params as $k => $v) {
        $refs[] = &$params[$k];
    }
    return (bool)call_user_func_array('mysqli_stmt_bind_param', $refs);
}

function cp_rows(mysqli $conn, string $sql, string $types = '', array $params = []): array
{
    $stmt = mysqli_prepare($conn, $sql);
    if (!$stmt) return [];

    if ($types !== '') cp_bind($stmt, $types, $params);

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

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

    mysqli_stmt_close($stmt);
    return $items;
}

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

function cp_concurso_nombre(?array $c): string
{
    if (!$c) return 'Concurso';
    return trim((string)($c['nombre'] ?? '') . ' ' . (string)($c['subtitulo'] ?? ''));
}

function cp_time_sort($v): float
{
    if ($v === null || $v === '') return 999999999;
    return (float)$v;
}

function cp_cmp_desc($a, $b): int
{
    if ((float)$a === (float)$b) return 0;
    return (float)$a > (float)$b ? -1 : 1;
}

/**
 * Respeta ocultados/excluidos si tus tablas tienen columnas como:
 * publicar_resultado, oculto, ocultar, excluido, excluir o visible.
 */
function cp_filtros_visibilidad(mysqli $conn): string
{
    $f = '';

    if (cp_col($conn, 'concurso_resultados', 'publicar_resultado')) {
        $f .= " AND r.publicar_resultado = 1 ";
    }

    foreach (['oculto', 'ocultar', 'excluido', 'excluir'] as $c) {
        if (cp_col($conn, 'concurso_resultados', $c)) {
            $f .= " AND COALESCE(r.`{$c}`,0) = 0 ";
        }
    }

    if (cp_col($conn, 'concurso_resultados', 'visible')) {
        $f .= " AND COALESCE(r.visible,1) = 1 ";
    }

    foreach (['oculto', 'ocultar', 'excluido', 'excluir', 'institucion_excluida', 'ocultar_institucion', 'excluir_institucion'] as $c) {
        if (cp_col($conn, 'concurso_participantes', $c)) {
            $f .= " AND COALESCE(p.`{$c}`,0) = 0 ";
        }
    }

    if (cp_col($conn, 'concurso_participantes', 'visible')) {
        $f .= " AND COALESCE(p.visible,1) = 1 ";
    }

    if (cp_col($conn, 'concurso_grupos', 'estado')) {
        $f .= " AND (g.estado = 1 OR UPPER(CAST(g.estado AS CHAR)) = 'ACTIVO') ";
    }

    foreach (['oculto', 'ocultar', 'excluido', 'excluir'] as $c) {
        if (cp_col($conn, 'concurso_grupos', $c)) {
            $f .= " AND COALESCE(g.`{$c}`,0) = 0 ";
        }
    }

    if (cp_col($conn, 'concurso_grupos', 'visible')) {
        $f .= " AND COALESCE(g.visible,1) = 1 ";
    }

    if (cp_col($conn, 'concurso_salones', 'estado')) {
        $f .= " AND (s.id_salon IS NULL OR s.estado = 1 OR UPPER(CAST(s.estado AS CHAR)) = 'ACTIVO') ";
    }

    foreach (['oculto', 'ocultar', 'excluido', 'excluir'] as $c) {
        if (cp_col($conn, 'concurso_salones', $c)) {
            $f .= " AND (s.id_salon IS NULL OR COALESCE(s.`{$c}`,0) = 0) ";
        }
    }

    if (cp_col($conn, 'concurso_salones', 'visible')) {
        $f .= " AND (s.id_salon IS NULL OR COALESCE(s.visible,1) = 1) ";
    }

    return $f;
}

function cp_filtros_visibilidad_participantes(mysqli $conn): string
{
    $f = '';

    foreach (['oculto', 'ocultar', 'excluido', 'excluir', 'institucion_excluida', 'ocultar_institucion', 'excluir_institucion'] as $c) {
        if (cp_col($conn, 'concurso_participantes', $c)) {
            $f .= " AND COALESCE(p.`{$c}`,0) = 0 ";
        }
    }

    if (cp_col($conn, 'concurso_participantes', 'visible')) {
        $f .= " AND COALESCE(p.visible,1) = 1 ";
    }

    if (cp_col($conn, 'concurso_grupos', 'estado')) {
        $f .= " AND (g.estado = 1 OR UPPER(CAST(g.estado AS CHAR)) = 'ACTIVO') ";
    }

    foreach (['oculto', 'ocultar', 'excluido', 'excluir'] as $c) {
        if (cp_col($conn, 'concurso_grupos', $c)) {
            $f .= " AND COALESCE(g.`{$c}`,0) = 0 ";
        }
    }

    if (cp_col($conn, 'concurso_grupos', 'visible')) {
        $f .= " AND COALESCE(g.visible,1) = 1 ";
    }

    if (cp_col($conn, 'concurso_salones', 'estado')) {
        $f .= " AND (s.id_salon IS NULL OR s.estado = 1 OR UPPER(CAST(s.estado AS CHAR)) = 'ACTIVO') ";
    }

    foreach (['oculto', 'ocultar', 'excluido', 'excluir'] as $c) {
        if (cp_col($conn, 'concurso_salones', $c)) {
            $f .= " AND (s.id_salon IS NULL OR COALESCE(s.`{$c}`,0) = 0) ";
        }
    }

    if (cp_col($conn, 'concurso_salones', 'visible')) {
        $f .= " AND (s.id_salon IS NULL OR COALESCE(s.visible,1) = 1) ";
    }

    return $f;
}


/**
 * Normaliza nombres de instituciones para agrupar escrituras parecidas:
 * - Quita tildes.
 * - Quita signos.
 * - Quita palabras genéricas: IEP, IE, COLEGIO, INSTITUCIÓN EDUCATIVA, etc.
 */
function cp_ie_normalizada(string $nombre): string
{
    $x = cp_up($nombre);
    $x = strtr($x, [
        'Á' => 'A', 'É' => 'E', 'Í' => 'I', 'Ó' => 'O', 'Ú' => 'U', 'Ü' => 'U',
        'À' => 'A', 'È' => 'E', 'Ì' => 'I', 'Ò' => 'O', 'Ù' => 'U', 'Ñ' => 'N'
    ]);

    if (function_exists('iconv')) {
        $tmp = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $x);
        if ($tmp !== false) $x = $tmp;
    }

    $x = preg_replace('/[^A-Z0-9 ]/', ' ', $x);
    $x = preg_replace('/\s+/', ' ', $x);
    $x = trim($x);

    $stop = [
        'I', 'E', 'P', 'IE', 'IEP', 'IIEE',
        'INSTITUCION', 'EDUCATIVA', 'EDUCATIVO',
        'COLEGIO', 'COLEG', 'COL', 'CE',
        'PRIVADO', 'PRIVADA', 'PUBLICO', 'PUBLICA',
        'NACIONAL', 'PARROQUIAL',
        'SAC', 'EIRL', 'SRL',
        'NRO', 'NUMERO'
    ];

    $parts = explode(' ', $x);
    $clean = [];

    foreach ($parts as $p) {
        if ($p === '' || in_array($p, $stop, true)) continue;
        $clean[] = $p;
    }

    $x = trim(implode(' ', $clean));
    return $x !== '' ? $x : 'SIN INSTITUCION';
}

function cp_ie_key(string $nombre, array &$catalogo): string
{
    $canon = cp_ie_normalizada($nombre);

    foreach (array_keys($catalogo) as $k) {
        if ($k === $canon) return $k;

        $min = min(strlen($k), strlen($canon));

        if ($min >= 8 && (str_contains($k, $canon) || str_contains($canon, $k))) {
            return $k;
        }

        similar_text($k, $canon, $pct);
        if ($min >= 8 && $pct >= 88) {
            return $k;
        }
    }

    $catalogo[$canon] = true;
    return $canon;
}

function cp_mejor_nombre_ie(array $nombres): string
{
    if (!$nombres) return 'SIN INSTITUCIÓN';
    arsort($nombres);
    return (string)array_key_first($nombres);
}

/**
 * Recalcula puestos con estudiantes visibles.
 * Grupo de ranking: grado/categoría + modalidad pública/privada.
 * Orden: mayor puntaje, menor tiempo, nombre.
 */
function cp_recalcular_puestos(array $rows): array
{
    usort($rows, function ($a, $b) {
        $ga = (int)($a['id_grupo'] ?? 0);
        $gb = (int)($b['id_grupo'] ?? 0);
        if ($ga !== $gb) return $ga <=> $gb;

        $ta = cp_tipo_key((string)($a['tipo_institucion'] ?? ''));
        $tb = cp_tipo_key((string)($b['tipo_institucion'] ?? ''));
        if ($ta !== $tb) return $ta <=> $tb;

        $c = cp_cmp_desc($a['puntaje'] ?? 0, $b['puntaje'] ?? 0);
        if ($c !== 0) return $c;

        $tsa = cp_time_sort($a['tiempo_segundos'] ?? null);
        $tsb = cp_time_sort($b['tiempo_segundos'] ?? null);
        if ($tsa !== $tsb) return $tsa <=> $tsb;

        return strcmp((string)($a['apellidos_nombres'] ?? ''), (string)($b['apellidos_nombres'] ?? ''));
    });

    $pos = [];
    foreach ($rows as $i => $r) {
        $key = (int)$r['id_grupo'] . '|' . cp_tipo_key((string)$r['tipo_institucion']);
        $pos[$key] = ($pos[$key] ?? 0) + 1;
        $rows[$i]['puesto_calc'] = $pos[$key];
    }

    return $rows;
}

function cp_agrupar_instituciones(array $rows, array $PUNTOS, string $modo = 'nivel_modalidad'): array
{
    $catalogo = [];
    $grupos = [];

    foreach ($rows as $r) {
        $puesto = (int)($r['puesto_calc'] ?? 0);

        if ($puesto < 1 || $puesto > 5) continue;

        $ieNombre = trim((string)($r['institucion_educativa'] ?? 'SIN INSTITUCIÓN'));
        $ieKey = cp_ie_key($ieNombre, $catalogo);
        $nivelKey = cp_nivel_key((string)($r['nivel'] ?? ''));
        $tipoKey = cp_tipo_key((string)($r['tipo_institucion'] ?? ''));

        if ($modo === 'total') {
            $key = $ieKey;
        } elseif ($modo === 'nivel') {
            $key = $nivelKey . '|' . $ieKey;
        } else {
            $key = $nivelKey . '|' . $tipoKey . '|' . $ieKey;
        }

        if (!isset($grupos[$key])) {
            $grupos[$key] = [
                'nivel' => $r['nivel'] ?? '',
                'tipo_institucion' => $tipoKey,
                'institucion_educativa' => $ieNombre,
                'nombres' => [],
                'niveles_map' => [],
                'modalidades_map' => [],
                'puntos' => 0,
                'primeros' => 0,
                'segundos' => 0,
                'terceros' => 0,
                'cuartos' => 0,
                'quintos' => 0,
                'calificados_ids' => [],
            ];
        }

        $grupos[$key]['nombres'][$ieNombre] = ($grupos[$key]['nombres'][$ieNombre] ?? 0) + 1;
        $grupos[$key]['niveles_map'][cp_nivel((string)($r['nivel'] ?? ''))] = true;
        $grupos[$key]['modalidades_map'][cp_tipo($tipoKey)] = true;
        $grupos[$key]['puntos'] += (int)($PUNTOS[$puesto] ?? 0);
        $grupos[$key]['calificados_ids'][(string)($r['id_participante'] ?? '')] = true;

        if ($puesto === 1) $grupos[$key]['primeros']++;
        if ($puesto === 2) $grupos[$key]['segundos']++;
        if ($puesto === 3) $grupos[$key]['terceros']++;
        if ($puesto === 4) $grupos[$key]['cuartos']++;
        if ($puesto === 5) $grupos[$key]['quintos']++;
    }

    $out = [];

    foreach ($grupos as $g) {
        $g['institucion_educativa'] = cp_mejor_nombre_ie($g['nombres']);
        $g['calificados'] = count($g['calificados_ids']);
        $g['niveles'] = implode(' / ', array_keys($g['niveles_map']));
        $g['modalidades'] = implode(' / ', array_keys($g['modalidades_map']));
        unset($g['nombres'], $g['calificados_ids'], $g['niveles_map'], $g['modalidades_map']);
        $out[] = $g;
    }

    usort($out, function ($a, $b) use ($modo) {
        if ($modo !== 'total') {
            $na = cp_nivel_orden((string)($a['nivel'] ?? ''));
            $nb = cp_nivel_orden((string)($b['nivel'] ?? ''));
            if ($na !== $nb) return $na <=> $nb;

            if ($modo !== 'nivel') {
                $ta = cp_tipo_key((string)($a['tipo_institucion'] ?? ''));
                $tb = cp_tipo_key((string)($b['tipo_institucion'] ?? ''));
                if ($ta !== $tb) return $ta <=> $tb;
            }
        }

        foreach (['puntos', 'primeros', 'segundos', 'terceros', 'cuartos', 'quintos', 'calificados'] as $c) {
            if ((int)$a[$c] !== (int)$b[$c]) {
                return (int)$b[$c] <=> (int)$a[$c];
            }
        }

        return strcmp((string)$a['institucion_educativa'], (string)$b['institucion_educativa']);
    });

    $pos = [];
    foreach ($out as $i => $r) {
        if ($modo === 'total') {
            $key = '_all';
        } elseif ($modo === 'nivel') {
            $key = cp_nivel_key((string)$r['nivel']);
        } else {
            $key = cp_nivel_key((string)$r['nivel']) . '|' . cp_tipo_key((string)$r['tipo_institucion']);
        }

        $pos[$key] = ($pos[$key] ?? 0) + 1;
        $out[$i]['posicion'] = $pos[$key];
    }

    return $out;
}

function cp_agrupar_participacion(array $rows): array
{
    $catalogo = [];
    $grupos = [];

    foreach ($rows as $r) {
        $ieNombre = trim((string)($r['institucion_educativa'] ?? 'SIN INSTITUCIÓN'));
        $ieKey = cp_ie_key($ieNombre, $catalogo);

        if (!isset($grupos[$ieKey])) {
            $grupos[$ieKey] = [
                'institucion_educativa' => $ieNombre,
                'nombres' => [],
                'modalidades_map' => [],
                'calificados_ids' => [],
            ];
        }

        $grupos[$ieKey]['nombres'][$ieNombre] = ($grupos[$ieKey]['nombres'][$ieNombre] ?? 0) + 1;
        $grupos[$ieKey]['modalidades_map'][cp_tipo((string)($r['tipo_institucion'] ?? ''))] = true;
        $grupos[$ieKey]['calificados_ids'][(string)($r['id_participante'] ?? '')] = true;
    }

    $out = [];
    foreach ($grupos as $g) {
        $out[] = [
            'institucion_educativa' => cp_mejor_nombre_ie($g['nombres']),
            'modalidades' => implode(' / ', array_keys($g['modalidades_map'])),
            'total_participantes' => count($g['calificados_ids']),
        ];
    }

    usort($out, function ($a, $b) {
        if ((int)$a['total_participantes'] !== (int)$b['total_participantes']) {
            return (int)$b['total_participantes'] <=> (int)$a['total_participantes'];
        }
        return strcmp((string)$a['institucion_educativa'], (string)$b['institucion_educativa']);
    });

    foreach ($out as $i => $r) {
        $out[$i]['posicion'] = $i + 1;
    }

    return $out;
}

function cp_premio_computo_general_nivel(?string $nivel): string
{
    $nivelKey = cp_nivel_key($nivel);

    if ($nivelKey === 'INICIAL') {
        return 'Juego didactico-Playgo';
    }

    if ($nivelKey === 'PRIMARIA') {
        return '1 juego de mesa';
    }

    if ($nivelKey === 'SECUNDARIA') {
        return '1 calculadora cientifica';
    }

    return 'Premio segun bases';
}

function cp_ordenar_estudiantes_por_puntaje(array $rows): array
{
    usort($rows, function ($a, $b) {
        $c = cp_cmp_desc($a['puntaje'] ?? 0, $b['puntaje'] ?? 0);
        if ($c !== 0) return $c;

        $ta = cp_time_sort($a['tiempo_segundos'] ?? null);
        $tb = cp_time_sort($b['tiempo_segundos'] ?? null);
        if ($ta !== $tb) return $ta <=> $tb;

        return strcmp((string)($a['apellidos_nombres'] ?? ''), (string)($b['apellidos_nombres'] ?? ''));
    });

    return $rows;
}

function cp_ganadores_computo_general_nivel(array $rows): array
{
    $porNivel = [];

    foreach ($rows as $r) {
        $nivelKey = cp_nivel_key((string)($r['nivel'] ?? ''));
        $porNivel[$nivelKey][] = $r;
    }

    $ganadores = [];

    foreach ($porNivel as $nivelKey => $items) {
        $items = cp_ordenar_estudiantes_por_puntaje($items);
        if (!$items) continue;

        $ganador = $items[0];
        $ganador['premio_computo_general'] = cp_premio_computo_general_nivel((string)($ganador['nivel'] ?? ''));
        $ganadores[] = $ganador;
    }

    usort($ganadores, function ($a, $b) {
        $na = cp_nivel_orden((string)($a['nivel'] ?? ''));
        $nb = cp_nivel_orden((string)($b['nivel'] ?? ''));
        if ($na !== $nb) return $na <=> $nb;
        return cp_cmp_desc($a['puntaje'] ?? 0, $b['puntaje'] ?? 0);
    });

    return $ganadores;
}

function cp_ganador_computo_computos(array $rows): ?array
{
    $rows = cp_ordenar_estudiantes_por_puntaje($rows);
    return $rows[0] ?? null;
}


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

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

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

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

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

$concurso = cn_datos_concurso($conn, $idConcurso);
$concursosActivos = $esAdmin ? cn_concursos_activos($conn) : [];
$nombreConcurso = cp_concurso_nombre($concurso ?: null);
$visibilidad = cp_filtros_visibilidad($conn);
$visibilidadParticipantes = cp_filtros_visibilidad_participantes($conn);
$ie = "COALESCE(NULLIF(TRIM(p.institucion_educativa), ''), 'SIN INSTITUCIÓN')";

$resultados = cp_rows($conn, "
    SELECT r.id_participante,
           r.id_grupo,
           g.nivel,
           g.nombre AS grado,
           g.orden AS orden_grado,
           p.tipo_institucion,
           {$ie} AS institucion_educativa,
           p.apellidos_nombres,
           p.documento,
           COALESCE(r.id_salon, p.id_salon) AS id_salon,
           s.nombre_salon,
           r.puntaje,
           r.tiempo_segundos,
           r.tiempo_texto
    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 = COALESCE(r.id_salon, p.id_salon)
    WHERE r.id_concurso = ?
      AND r.estado = 'ACTIVO'
      AND p.estado = 'ACTIVO'
      {$visibilidad}
", 'i', [$idConcurso]);



$participantesVisibles = cp_rows($conn, "
    SELECT p.id_participante,
           g.nivel,
           p.tipo_institucion,
           {$ie} AS institucion_educativa,
           p.apellidos_nombres,
           p.documento,
           p.id_salon,
           s.nombre_salon
    FROM concurso_participantes p
    INNER 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'
      {$visibilidadParticipantes}
", 'i', [$idConcurso]);

$resultados = cp_recalcular_puestos($resultados);

usort($resultados, function ($a, $b) {
    $na = cp_nivel_orden((string)$a['nivel']);
    $nb = cp_nivel_orden((string)$b['nivel']);
    if ($na !== $nb) return $na <=> $nb;

    $oa = (int)($a['orden_grado'] ?? 0);
    $ob = (int)($b['orden_grado'] ?? 0);
    if ($oa !== $ob) return $oa <=> $ob;

    $ta = cp_tipo_key((string)$a['tipo_institucion']);
    $tb = cp_tipo_key((string)$b['tipo_institucion']);
    if ($ta !== $tb) return $ta <=> $tb;

    return (int)$a['puesto_calc'] <=> (int)$b['puesto_calc'];
});

$idsCalificados = [];
foreach ($resultados as $r) {
    $idsCalificados[(string)$r['id_participante']] = true;
}
$totalCalificados = count($idsCalificados);

$individuales = array_values(array_filter($resultados, function ($r) {
    return (int)$r['puesto_calc'] >= 1 && (int)$r['puesto_calc'] <= 3;
}));
$institucional = cp_agrupar_instituciones($resultados, $PUNTOS, 'nivel_modalidad');
$ganadoresComputoGeneralNivel = cp_ganadores_computo_general_nivel($resultados);
$ganadorComputo = cp_ganador_computo_computos($resultados);
$mayorParticipacion = cp_agrupar_participacion($participantesVisibles);
$ganadorParticipacion = $mayorParticipacion[0] ?? null;
$ganadoresTrofeo = array_values(array_filter($institucional, function ($r) {
    return (int)$r['posicion'] === 1;
}));

$queryPrint = http_build_query(['id_concurso' => $idConcurso, 'print' => '1']);
$modoPrint = isset($_GET['print']) && $_GET['print'] === '1';
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Cómputo de premios A4 | 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=5">
<style>
*{box-sizing:border-box}
:root{--azul:#1d4ed8;--rojo:#dc2626;--verde:#16a34a;--oro:#d97706;--tinta:#0f172a;--gris:#475569;--linea:#cbd5e1;--suave:#f8fafc}
body{margin:0;font-family:Arial,Helvetica,sans-serif;background:#e5e7eb;color:var(--tinta)}
a{text-decoration:none;color:inherit}.no-print{display:block}
.toolbar{max-width:1120px;margin:14px auto 0;padding:0 10px;display:flex;justify-content:space-between;gap:10px;align-items:center}
.btn{display:inline-flex;align-items:center;justify-content:center;border-radius:10px;padding:9px 12px;background:var(--azul);color:#fff;font-weight:800;font-size:12px;border:0;cursor:pointer}.btn.red{background:var(--rojo)}.btn.dark{background:#334155}.btn.gray{background:#64748b}
.page{width:297mm;min-height:210mm;margin:14px auto;background:#fff;padding:8mm 9mm;border-radius:8px;box-shadow:0 12px 30px rgba(15,23,42,.15)}
.header{display:grid;grid-template-columns:1fr auto;gap:10px;align-items:start;border-bottom:2px solid var(--tinta);padding-bottom:6px;margin-bottom:6px}
.kicker{margin:0 0 2px;color:var(--azul);font-size:10px;font-weight:900;text-transform:uppercase;letter-spacing:.05em}.title{margin:0;font-size:20px;font-weight:900;line-height:1.05}.sub{margin:3px 0 0;font-size:10px;font-weight:700;color:var(--gris)}.badge-main{border:2px solid var(--oro);color:#92400e;background:#fef3c7;border-radius:12px;padding:7px 10px;font-weight:900;font-size:11px;text-align:center;white-space:nowrap}
.rules{display:grid;grid-template-columns:1fr 1.2fr 1fr;gap:6px;margin-bottom:6px}.rule{border:1px solid var(--linea);border-radius:8px;padding:6px;background:#fff}.rule h3{margin:0 0 3px;font-size:10px;color:var(--azul);text-transform:uppercase}.rule p{margin:0;font-size:9.2px;line-height:1.25;font-weight:700;color:#111827}.rule b{color:var(--rojo)}
.grid{display:grid;grid-template-columns:1.1fr .9fr;gap:7px}.section{border:1px solid var(--linea);border-radius:9px;overflow:hidden;background:#fff;margin-bottom:7px}.section.full{grid-column:1/-1}.section-head{display:flex;justify-content:space-between;align-items:center;gap:8px;background:#f8fafc;border-bottom:1px solid var(--linea);padding:6px 8px}.section h2{margin:0;font-size:12.5px;font-weight:900}.section small{font-size:9px;color:var(--gris);font-weight:800}.tag{display:inline-flex;border-radius:999px;border:1px solid #bfdbfe;background:#eff6ff;color:#1e40af;padding:3px 7px;font-size:8.5px;font-weight:900;white-space:nowrap}.tag.gold{border-color:#fde68a;background:#fef3c7;color:#92400e}.tag.green{border-color:#bbf7d0;background:#dcfce7;color:#166534}.tag.red{border-color:#fecaca;background:#fee2e2;color:#991b1b}
table{width:100%;border-collapse:collapse;font-size:9.2px}th,td{border-bottom:1px solid #e5e7eb;padding:5px 6px;text-align:left;vertical-align:middle}th{background:#f8fafc;color:#334155;text-transform:uppercase;font-size:8px;font-weight:900}.win td{background:#fffdf2}.school,.student{font-weight:900}.points{color:var(--rojo);font-weight:900;white-space:nowrap}.center{text-align:center}.empty{padding:8px;text-align:center;color:#64748b;font-weight:800;font-size:10px}.note{margin:4px 0 0;font-size:8.5px;color:#64748b;font-weight:700;line-height:1.2}.footer{margin-top:5px;border-top:1px solid var(--linea);padding-top:5px;display:flex;justify-content:space-between;gap:10px;font-size:8.5px;color:#475569;font-weight:700}
@media(max-width:900px){.page{width:auto;min-height:auto;margin:8px;border-radius:0}.rules,.grid,.header{grid-template-columns:1fr}.toolbar{display:block}.toolbar .btn{margin:3px 0}}
@media print{
    @page{size:A4 landscape;margin:7mm}
    *{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}
    body{background:#fff}.no-print{display:none!important}.page{width:auto;min-height:auto;margin:0;padding:0;box-shadow:none;border-radius:0}.section{break-inside:avoid;page-break-inside:avoid}.rules{break-inside:avoid}.header{break-inside:avoid}.title{font-size:18px}.section h2{font-size:11.5px}table{font-size:8.6px}th{font-size:7.4px}th,td{padding:4px 5px}.rule p{font-size:8.5px}.rule h3{font-size:9px}.footer{font-size:8px}
}
</style>
</head>
<body class="<?php echo $modoPrint ? '' : 'cn-con-sidebar'; ?>">
<?php if (!$modoPrint): ?>
    <?php include __DIR__ . '/includes/sidebar_concurso.php'; ?>
<?php endif; ?>
<div class="toolbar no-print">
    <div>
        <a class="btn gray" href="panel.php">← Volver al panel</a>
        <a class="btn dark" href="resultados.php?id_concurso=<?php echo cp_h($idConcurso); ?>">Ranking individual</a>
    </div>
    <div>
        <button class="btn red" onclick="window.print()">Imprimir A4</button>
    </div>
</div>

<main class="page">
    <header class="header">
        <div>
            <p class="kicker">NOBEX · Premios y estímulos</p>
            <h1 class="title">Cómputo final de premios</h1>
            <p class="sub"><?php echo cp_h($nombreConcurso); ?> · Reporte compacto para impresión en A4.</p>
        </div>
        <div class="badge-main">ACTA DE PREMIACIÓN</div>
    </header>

    <section class="rules">
        <article class="rule"><h3>Trofeo de campeón</h3><p>Es para el <b>colegio</b>. Se calcula con puntos acumulados por estudiantes ubicados del 1.º al 5.º puesto.</p></article>
        <article class="rule"><h3>Cómputo general</h3><p>Es para el <b>estudiante</b> con mayor puntaje de cada nivel, entre pública y privada.</p></article>
        <article class="rule"><h3>Cómputo de cómputos</h3><p>Es para el <b>estudiante</b> con mayor puntaje de todo el concurso. Premio: <?php echo cp_h($PREMIO_COMPUTO_COMPUTOS); ?>.</p></article>
    </section>

    <section class="section full">
        <div class="section-head">
            <div><h2>1. Trofeos de campeón por colegio</h2><small>Ganador por nivel y modalidad.</small></div>
            <span class="tag gold">Colegio</span>
        </div>
        <?php if (!$ganadoresTrofeo): ?>
            <div class="empty">No hay ganadores de trofeo todavía.</div>
        <?php else: ?>
            <table>
                <thead><tr><th>Nivel</th><th>Modalidad</th><th>Colegio campeón</th><th>Premio</th></tr></thead>
                <tbody>
                    <?php foreach ($ganadoresTrofeo as $r): ?>
                    <tr class="win">
                        <td><?php echo cp_h(cp_nivel($r['nivel'])); ?></td>
                        <td><?php echo cp_h(cp_tipo($r['tipo_institucion'])); ?></td>
                        <td class="school"><?php echo cp_h($r['institucion_educativa']); ?></td>
                        <td><span class="tag gold"><?php echo cp_h($PREMIO_TROFEO); ?></span></td>
                    </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
        <?php endif; ?>
    </section>

    <div class="grid">
        <section class="section">
            <div class="section-head">
                <div><h2>2. Cómputo general por nivel</h2><small>Mayor puntaje individual por nivel.</small></div>
                <span class="tag green">Estudiante</span>
            </div>
            <?php if (!$ganadoresComputoGeneralNivel): ?>
                <div class="empty">No hay ganadores por nivel todavía.</div>
            <?php else: ?>
                <table>
                    <thead><tr><th>Nivel</th><th>Estudiante</th><th>I.E.</th><th>Categoría</th><th>Puntaje</th><th>Premio</th></tr></thead>
                    <tbody>
                        <?php foreach ($ganadoresComputoGeneralNivel as $r): ?>
                        <tr class="win">
                            <td><?php echo cp_h(cp_nivel($r['nivel'])); ?></td>
                            <td class="student"><?php echo cp_h($r['apellidos_nombres']); ?></td>
                            <td><?php echo cp_h($r['institucion_educativa']); ?></td>
                            <td><?php echo cp_h($r['grado']); ?></td>
                            <td class="points"><?php echo cp_h(cp_num($r['puntaje'])); ?></td>
                            <td><?php echo cp_h($r['premio_computo_general']); ?></td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            <?php endif; ?>
        </section>

        <section class="section">
            <div class="section-head">
                <div><h2>3. Cómputo de cómputos</h2><small>Mayor puntaje de todo el concurso.</small></div>
                <span class="tag red"><?php echo cp_h($PREMIO_COMPUTO_COMPUTOS); ?></span>
            </div>
            <?php if (!$ganadorComputo): ?>
                <div class="empty">No hay datos.</div>
            <?php else: ?>
                <table>
                    <thead><tr><th>Estudiante</th><th>Nivel / categoría</th><th>I.E.</th><th>Puntaje</th><th>Premio</th></tr></thead>
                    <tbody>
                        <tr class="win">
                            <td class="student"><?php echo cp_h($ganadorComputo['apellidos_nombres']); ?></td>
                            <td><?php echo cp_h(cp_nivel($ganadorComputo['nivel']) . ' · ' . $ganadorComputo['grado']); ?></td>
                            <td><?php echo cp_h($ganadorComputo['institucion_educativa']); ?></td>
                            <td class="points"><?php echo cp_h(cp_num($ganadorComputo['puntaje'])); ?></td>
                            <td><?php echo cp_h($PREMIO_COMPUTO_COMPUTOS); ?></td>
                        </tr>
                    </tbody>
                </table>
            <?php endif; ?>
        </section>
    </div>

    <section class="section full">
        <div class="section-head">
            <div><h2>4. Mejor colegio participante</h2><small>Mayor cantidad de participantes visibles en todos los niveles y categorías.</small></div>
            <span class="tag green">S/ 500 + gallardete</span>
        </div>
        <?php if (!$ganadorParticipacion): ?>
            <div class="empty">No hay datos.</div>
        <?php else: ?>
            <table>
                <thead><tr><th>Colegio ganador</th><th>Modalidad registrada</th><th class="center">Participantes</th><th>Premio</th></tr></thead>
                <tbody>
                    <tr class="win">
                        <td class="school"><?php echo cp_h($ganadorParticipacion['institucion_educativa']); ?></td>
                        <td><?php echo cp_h($ganadorParticipacion['modalidades']); ?></td>
                        <td class="center points"><?php echo cp_h($ganadorParticipacion['total_participantes']); ?></td>
                        <td><?php echo cp_h($PREMIO_MAYOR_PARTICIPACION); ?></td>
                    </tr>
                </tbody>
            </table>
        <?php endif; ?>
    </section>

    <footer class="footer">
        <span>Reporte generado por el sistema NOBEX.</span>
        <span>Fecha: <?php echo cp_h(date('d/m/Y H:i')); ?></span>
    </footer>
</main>

<?php if ($modoPrint): ?>
<script>window.addEventListener('load', () => setTimeout(() => window.print(), 350));</script>
<?php endif; ?>
</body>
</html>
