<?php
// concurso_nobel/diplomas.php
// Generador automático de diplomas NOBEX con plantilla de fondo.
// Usa concurso_resultados.puesto y concurso_participantes para autocompletar datos.

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');

/*
|--------------------------------------------------------------------------
| CONFIGURACIÓN RÁPIDA
|--------------------------------------------------------------------------
| 1) Sube tu plantilla a:
|    /concurso_nobel/uploads/diplomas/plantilla_diploma_nobex_2026.jpg
|
| 2) Si la plantilla cambia, ajusta solo las coordenadas CSS:
|    .d-nombre, .d-linea, .d-motivo, .d-fecha, .d-firma
*/
$DIPLOMA = [
    'plantilla' => 'uploads/diplomas/plantilla_diploma_nobex_2026.jpg',
    'director_nombre' => 'EVER FIGUEROA TOLEDO',
    'director_cargo' => 'director',
    'fecha_texto' => '28 de mayo del 2026',
    'puesto_maximo' => 3,
];

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

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

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

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

function d_puesto_texto(int $puesto): string
{
    if ($puesto === 1) {
        return 'PRIMER PUESTO';
    }

    if ($puesto === 2) {
        return 'SEGUNDO PUESTO';
    }

    if ($puesto === 3) {
        return 'TERCER PUESTO';
    }

    if ($puesto === 4) {
        return 'CUARTO PUESTO';
    }

    if ($puesto === 5) {
        return 'QUINTO PUESTO';
    }

    return $puesto . ".\xC2\xB0 PUESTO";
}

function d_nombre_diploma(string $nombre): string
{
    $nombre = trim(preg_replace('/\s+/', ' ', $nombre) ?? '');

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

    if (function_exists('mb_convert_case')) {
        return mb_convert_case($nombre, MB_CASE_TITLE, 'UTF-8');
    }

    return ucwords(strtolower($nombre));
}

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

function d_asset_url(string $ruta): string
{
    $ruta = trim($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/diplomas/' . basename($ruta);
}

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

function d_stmt_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 d_cargar_salones(mysqli $conn, int $idConcurso, int $idGrupo, int $idSalonFijo): array
{
    if ($idConcurso <= 0 || $idGrupo <= 0) return [];

    if ($idSalonFijo > 0) {
        $sql = "
            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, nombre_salon ASC
        ";
        $types = 'iii';
        $params = [$idConcurso, $idGrupo, $idSalonFijo];
    } else {
        $sql = "
            SELECT id_salon, nombre_salon, codigo_salon
            FROM concurso_salones
            WHERE id_concurso = ?
              AND id_grupo = ?
              AND estado = 1
            ORDER BY orden ASC, nombre_salon ASC
        ";
        $types = 'ii';
        $params = [$idConcurso, $idGrupo];
    }

    $stmt = mysqli_prepare($conn, $sql);
    if (!$stmt) return [];

    d_stmt_bind($stmt, $types, $params);
    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);

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

    mysqli_stmt_close($stmt);
    return $items;
}

function d_cargar_resultados(mysqli $conn, int $idConcurso, int $idGrupo, int $idSalon, string $tipo, int $puestoFiltro, int $puestoMaximo): array
{
    if ($idConcurso <= 0) return [];

    $sql = "
        SELECT
            r.id_resultado,
            r.id_grupo,
            r.id_salon,
            r.puesto,
            r.correctas,
            r.incorrectas,
            r.blanco,
            r.puntaje,
            r.tiempo_texto,
            r.tiempo_segundos,
            p.id_participante,
            p.codigo_participante,
            p.apellidos_nombres,
            p.documento,
            p.institucion_educativa,
            p.tipo_institucion,
            g.nombre AS grupo_nombre,
            g.nivel AS grupo_nivel,
            s.nombre_salon,
            s.codigo_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.estado = 'ACTIVO'
          AND p.estado = 'ACTIVO'
          AND r.puesto > 0
    ";

    $types = 'i';
    $params = [$idConcurso];

    if ($idGrupo > 0) {
        $sql .= " AND r.id_grupo = ? ";
        $types .= 'i';
        $params[] = $idGrupo;
    }

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

    if ($idSalon > 0) {
        $sql .= " AND r.id_salon = ? ";
        $types .= 'i';
        $params[] = $idSalon;
    }

    if ($tipo !== 'TODOS') {
        $sql .= " AND p.tipo_institucion = ? ";
        $types .= 's';
        $params[] = $tipo;
    }

    /*
     * No filtramos aquí por r.puesto, porque el puesto debe recalcularse
     * después de ocultar resultados no publicados. Primero cargamos todos
     * los resultados visibles y luego asignamos puesto_visible en PHP.
     */

    $sql .= "
        ORDER BY
            g.orden ASC,
            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 [];

    d_stmt_bind($stmt, $types, $params);
    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);

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

    mysqli_stmt_close($stmt);

    $items = d_recalcular_puestos_visibles($items);

    $filtrados = [];
    foreach ($items as $row) {
        $puestoVisible = (int)($row['puesto_visible'] ?? 0);

        if ($puestoFiltro > 0) {
            if ($puestoVisible === $puestoFiltro) {
                $filtrados[] = $row;
            }
        } else {
            if ($puestoVisible > 0 && $puestoVisible <= $puestoMaximo) {
                $filtrados[] = $row;
            }
        }
    }

    return $filtrados;
}

function d_recalcular_puestos_visibles(array $items): array
{
    $contadorPorCategoria = [];

    foreach ($items as $i => $row) {
        /*
         * El puesto visible se reinicia por grado y categoría institucional.
         * Si se filtra por salón, el SQL ya trae solo ese salón; si se muestran
         * todos los salones, se mantiene el ranking general del grado/categoría.
         */
        $idGrupo = (int)($row['id_grupo'] ?? 0);
        $tipo = (string)($row['tipo_institucion'] ?? '');
        $clave = $idGrupo . '|' . $tipo;

        if (!isset($contadorPorCategoria[$clave])) {
            $contadorPorCategoria[$clave] = 0;
        }

        $contadorPorCategoria[$clave]++;
        $items[$i]['puesto_visible'] = $contadorPorCategoria[$clave];
    }

    return $items;
}

function d_render_diploma(array $r, array $cfg, string $plantillaUrl, string $nombreConcurso, string $fechaTexto): void
{
    $nombre = d_nombre_diploma((string)$r['apellidos_nombres']);
    $puestoTexto = d_puesto_texto((int)($r['puesto_visible'] ?? $r['puesto'] ?? 0));
    $grupo = trim((string)$r['grupo_nombre']);
    $director = trim((string)$cfg['director_nombre']);
    $cargo = trim((string)$cfg['director_cargo']);
    ?>
    <section class="diploma">
        <?php if ($plantillaUrl !== ''): ?>
            <img src="<?php echo d_h($plantillaUrl); ?>" class="diploma-bg" alt="Plantilla diploma">
        <?php else: ?>
            <div class="diploma-bg-fallback"></div>
        <?php endif; ?>

        <div class="d-nombre"><?php echo d_h($nombre); ?></div>
        <div class="d-linea"></div>

        <div class="d-motivo">
            Por haber ocupado el <strong><?php echo d_h($puestoTexto); ?></strong>
            en el <strong class="d-concurso"><?php echo d_h($nombreConcurso); ?></strong>,
            correspondiente al <?php echo d_h($grupo); ?>.
        </div>

        <div class="d-fecha"><?php echo d_h($fechaTexto); ?></div>

        <div class="d-firma">
            <div class="d-firma-linea"></div>
            <strong><?php echo d_h($director); ?></strong>
            <span><?php echo d_h($cargo); ?></span>
        </div>

    </section>
    <?php
}

/* ============================================================
   CONTEXTO
============================================================ */

$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 generar diplomas.');
}

$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) {
    http_response_code(500);
    die('No hay concurso activo disponible.');
}

$concursoTrabajo = cn_datos_concurso($conn, $idConcurso);
$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);

// Para administrador o acceso sin grado fijo:
// id_grupo = 0 significa TODOS LOS GRADOS.
if ($idGrupoFijo <= 0 && $idGrupoSeleccionado < 0) {
    $idGrupoSeleccionado = 0;
}

if ($idGrupoFijo > 0 && $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) && $idGrupoFijo > 0) {
    $grupoActual = $grupos[0];
    $idGrupoSeleccionado = (int)$grupoActual['id_grupo'];
}

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

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

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

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

$tipoFiltro = d_upper((string)($_GET['tipo'] ?? 'TODOS'));
if (!d_tipo_valido($tipoFiltro)) $tipoFiltro = 'TODOS';

$puestoFiltro = (int)($_GET['puesto'] ?? 0);
if ($puestoFiltro < 0 || $puestoFiltro > 5) $puestoFiltro = 0;

$puestoMaximo = max(1, min(5, (int)($_GET['puesto_maximo'] ?? $DIPLOMA['puesto_maximo'])));
$fechaTexto = trim((string)($_GET['fecha'] ?? $DIPLOMA['fecha_texto']));
if ($fechaTexto === '') $fechaTexto = date('d/m/Y');

$nombreConcurso = $concursoTrabajo ? trim((string)($concursoTrabajo['nombre'] ?? '') . ' ' . (string)($concursoTrabajo['subtitulo'] ?? '')) : 'Concurso';
$plantillaUrl = d_asset_url((string)$DIPLOMA['plantilla']);
$modoImprimir = isset($_GET['imprimir']) && $_GET['imprimir'] === '1';

$resultados = d_cargar_resultados(
    $conn,
    $idConcurso,
    $idGrupoSeleccionado,
    $idSalonFiltro,
    $tipoFiltro,
    $puestoFiltro,
    $puestoMaximo
);

$totalDiplomas = count($resultados);

$paramsBase = [
    'id_concurso' => $idConcurso,
    'id_grupo' => $idGrupoSeleccionado,
    'id_salon' => $idSalonFiltro,
    'tipo' => $tipoFiltro,
    'puesto' => $puestoFiltro,
    'puesto_maximo' => $puestoMaximo,
    'fecha' => $fechaTexto,
];

$queryImprimir = http_build_query(array_merge($paramsBase, ['imprimir' => '1']));
?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Diplomas 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>
        @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;600;700;900&family=Great+Vibes&family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&display=swap');

        *{box-sizing:border-box}

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

        .topbar{
            background:linear-gradient(135deg,#991b1b,#dc2626);
            color:#fff;
            padding:18px 22px;
            border-bottom:7px solid #ffcc00;
        }

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

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

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

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

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

        .card{
            background:#fff;
            border:1px solid #dbe3ef;
            border-radius:22px;
            box-shadow:0 14px 34px rgba(15,23,42,.10);
            padding:18px;
            margin-bottom:18px;
        }

        .filters{
            display:grid;
            grid-template-columns:1.1fr .8fr .8fr .65fr .65fr .65fr 1fr 1fr;
            gap:12px;
            align-items:end;
        }

        label{
            display:block;
            font-weight:900;
            font-size:13px;
            margin:0 0 7px;
            color:#334155;
        }

        select,
        input{
            width:100%;
            border:1px solid #dbe3ef;
            border-radius:13px;
            padding:11px 12px;
            font-size:14px;
            background:#fff;
            outline:none;
            font-weight:700;
        }

        .btn{
            display:inline-flex;
            align-items:center;
            justify-content:center;
            border:0;
            border-radius:13px;
            background:#1d4ed8;
            color:#fff;
            font-weight:900;
            padding:11px 13px;
            text-decoration:none;
            cursor:pointer;
            text-align:center;
            min-height:42px;
        }

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

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

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

        .chip.red{
            background:#fee2e2;
            color:#991b1b;
            border-color:#fecaca;
        }

        .info{
            margin-top:13px;
            background:#fff7ed;
            border:1px solid #fed7aa;
            color:#9a3412;
            border-radius:15px;
            padding:12px 14px;
            font-size:13px;
            font-weight:800;
            line-height:1.45;
        }

        .empty{
            background:#fff;
            border:1px dashed #cbd5e1;
            border-radius:18px;
            padding:28px;
            text-align:center;
            color:#64748b;
            font-weight:900;
        }

        .diploma-wrap{
            display:grid;
            gap:20px;
        }

        .diploma{
            width:297mm;
            height:210mm;
            background:#fff;
            position:relative;
            overflow:hidden;
            margin:0 auto;
            box-shadow:0 18px 45px rgba(15,23,42,.18);
            page-break-after:always;
            break-after:page;
        }

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

        .diploma-bg{
            position:absolute;
            inset:0;
            width:100%;
            height:100%;
            object-fit:cover;
            object-position:center center;
            z-index:1;
        }

        .diploma-bg-fallback{
            position:absolute;
            inset:0;
            background:
                linear-gradient(135deg,#7f1d1d 0 20%,#dc2626 20% 42%,transparent 42%),
                linear-gradient(135deg,transparent 0 70%,#dc2626 70% 100%),
                #fff;
            z-index:1;
        }

        .d-nombre,
        .d-linea,
        .d-motivo,
        .d-fecha,
        .d-firma,
        .d-debug{
            position:absolute;
            z-index:2;
            text-align:center;
        }

        /*
         * COORDENADAS DE TEXTO
         * Ajusta estos valores si tu plantilla tiene otra ubicación.
        */
        .d-nombre{
            top:86mm;
            left:74mm;
            width:186mm;
            height:18mm;
            color:#111;
            font-family:'Great Vibes',"Segoe Script","Lucida Handwriting",cursive;
            font-size:34pt;
            line-height:1.12;
            white-space:normal;
            overflow:visible;
            font-weight:400;
        }

        .d-linea{
            top:104mm;
            left:69mm;
            width:188mm;
            border-top:1.4mm solid #b91c1c;
        }

        .d-motivo{
            top:114mm;
            left:76mm;
            width:170mm;
            color:#222;
            font-family:'Libre Baskerville',Arial,Helvetica,sans-serif;
            font-size:14.2pt;
            line-height:1.40;
            font-weight:400;
        }

        .d-motivo strong{
            font-weight:950;
        }

        .d-concurso{
            font-weight:950;
            color:#b91c1c;
        }

        .d-debug{
            display:none !important;
        }

        .d-fecha{
            top:134mm;
            left:104mm;
            width:115mm;
            color:#991b1b;
            font-size:17pt;
            font-weight:950;
        }

        .d-firma{
            top:174mm;
            left:116mm;
            width:90mm;
            color:#111;
            font-size:10pt;
            line-height:1.25;
        }

        .d-firma-linea{
            width:56mm;
            border-top:1.3mm solid #991b1b;
            margin:0 auto 3mm;
        }

        .d-firma strong{
            display:block;
            font-size:11.5pt;
            font-weight:950;
        }

        .d-firma span{
            display:block;
            color:#7f1d1d;
            font-size:11pt;
            margin-top:1.5mm;
        }

        .d-debug{
            left:12mm;
            bottom:8mm;
            width:273mm;
            color:#64748b;
            font-size:8pt;
            opacity:.85;
        }

        @media(max-width:1200px){
            .filters{grid-template-columns:1fr 1fr 1fr}
            .diploma{
                transform:scale(.72);
                transform-origin:top center;
                margin-bottom:-58mm;
            }
        }

        @media(max-width:850px){
            .topbar-inner{flex-direction:column;align-items:flex-start}
            .filters{grid-template-columns:1fr}
            .diploma{
                transform:scale(.46);
                transform-origin:top center;
                margin-bottom:-113mm;
            }
        }

        @media(max-width:560px){
            .container{padding:0 8px 30px}
            .card{border-radius:18px;padding:14px}
            .diploma{
                transform:scale(.34);
                transform-origin:top center;
                margin-bottom:-137mm;
            }
        }

        @page{
            size:A4 landscape;
            margin:0;
        }

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

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

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

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

            .diploma-wrap{
                display:block !important;
                gap:0 !important;
            }

            .diploma{
                width:297mm !important;
                height:210mm !important;
                margin:0 !important;
                box-shadow:none !important;
                transform:none !important;
                page-break-after:always;
                break-after:page;
            }

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

            .d-debug{
                display:none !important;
            }
        }
    </style>
</head>

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

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

<header class="topbar no-print">
    <div class="topbar-inner">
        <div>
            <h1>Generador de diplomas</h1>
            <p><?php echo d_h($nombreConcurso); ?> · resultados publicados · puesto recalculado según visibles</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 d_h($c['id_concurso']); ?>" <?php echo (int)$c['id_concurso'] === $idConcurso ? 'selected' : ''; ?>>
                                <?php echo d_h(trim((string)$c['nombre'] . ' ' . (string)$c['subtitulo'])); ?>
                            </option>
                        <?php endforeach; ?>
                    </select>
                </div>
            <?php else: ?>
                <input type="hidden" name="id_concurso" value="<?php echo d_h($idConcurso); ?>">
            <?php endif; ?>

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

            <div>
                <label>Salón</label>
                <?php if ($idGrupoSeleccionado <= 0): ?>
                    <select disabled>
                        <option>Todos los salones</option>
                    </select>
                    <input type="hidden" name="id_salon" value="0">
                <?php elseif ($idSalonFijo > 0): ?>
                    <select disabled>
                        <?php foreach ($salones as $s): ?>
                            <option><?php echo d_h($s['nombre_salon']); ?></option>
                        <?php endforeach; ?>
                    </select>
                    <input type="hidden" name="id_salon" value="<?php echo d_h($idSalonFiltro); ?>">
                <?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 d_h($s['id_salon']); ?>" <?php echo (int)$s['id_salon'] === $idSalonFiltro ? 'selected' : ''; ?>>
                                <?php echo d_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>
                <label>Puesto</label>
                <select name="puesto" onchange="this.form.submit()">
                    <option value="0" <?php echo $puestoFiltro === 0 ? 'selected' : ''; ?>>Rango automático</option>
                    <option value="1" <?php echo $puestoFiltro === 1 ? 'selected' : ''; ?>>Solo 1.º puesto</option>
                    <option value="2" <?php echo $puestoFiltro === 2 ? 'selected' : ''; ?>>Solo 2.º puesto</option>
                    <option value="3" <?php echo $puestoFiltro === 3 ? 'selected' : ''; ?>>Solo 3.º puesto</option>
                    <option value="4" <?php echo $puestoFiltro === 4 ? 'selected' : ''; ?>>Solo 4.º puesto</option>
                    <option value="5" <?php echo $puestoFiltro === 5 ? 'selected' : ''; ?>>Solo 5.º puesto</option>
                </select>
            </div>

            <div>
                <label>Hasta puesto</label>
                <select name="puesto_maximo" onchange="this.form.submit()" <?php echo $puestoFiltro > 0 ? 'disabled' : ''; ?>>
                    <?php for ($i = 1; $i <= 5; $i++): ?>
                        <option value="<?php echo d_h($i); ?>" <?php echo $puestoMaximo === $i ? 'selected' : ''; ?>>
                            1.º al <?php echo d_h($i); ?>.º
                        </option>
                    <?php endfor; ?>
                </select>
                <?php if ($puestoFiltro > 0): ?>
                    <input type="hidden" name="puesto_maximo" value="<?php echo d_h($puestoMaximo); ?>">
                <?php endif; ?>
            </div>

            <div>
                <label>Fecha</label>
                <input type="text" name="fecha" value="<?php echo d_h($fechaTexto); ?>" placeholder="28 de mayo del 2026">
            </div>

            <div>
                <label>Acciones</label>
                <button type="submit" class="btn gray">Actualizar</button>
            </div>

            <div>
                <label>&nbsp;</label>
                <a class="btn red" target="_blank" href="diplomas.php?<?php echo d_h($queryImprimir); ?>">
                    Imprimir / PDF
                </a>
            </div>
        </form>

        <div class="stats">
            <span class="chip">Diplomas: <?php echo d_h($totalDiplomas); ?></span>
            <span class="chip">Puesto publicado: <?php echo $puestoFiltro > 0 ? d_h(d_puesto_texto($puestoFiltro)) : '1.º al ' . d_h($puestoMaximo) . '.º'; ?></span>
            <span class="chip">Grados: <?php echo $idGrupoSeleccionado > 0 ? d_h((string)($grupoActual['nombre'] ?? '')) : 'Todos los grados'; ?></span>
            <span class="chip">Categoría: <?php echo d_h($tipoFiltro === 'TODOS' ? 'Privada y pública' : d_tipo_label($tipoFiltro)); ?></span>
            <span class="chip red">Plantilla: <?php echo d_h($DIPLOMA['plantilla']); ?></span>
        </div>

        <div class="info">
            Primero sube la plantilla a <strong>/concurso_nobel/<?php echo d_h($DIPLOMA['plantilla']); ?></strong>.
            Puedes generar diplomas de todos los grados de una sola vez seleccionando <strong>Todos los grados</strong>.
            Si el texto no cae exacto sobre tu diseño, ajustamos las coordenadas CSS de
            <strong>.d-nombre</strong>, <strong>.d-motivo</strong>, <strong>.d-fecha</strong> y <strong>.d-firma</strong>.
        </div>
    </section>

    <?php if (empty($resultados)): ?>
        <div class="empty">
            No hay resultados publicados para generar diplomas con los filtros seleccionados.
        </div>
    <?php else: ?>
        <div class="diploma-wrap">
            <?php foreach ($resultados as $r): ?>
                <?php d_render_diploma($r, $DIPLOMA, $plantillaUrl, $nombreConcurso, $fechaTexto); ?>
            <?php endforeach; ?>
        </div>
    <?php endif; ?>

</main>

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

</body>
</html>
