<?php
// concurso_nobel/includes/importar_participantes_repo.php
// Consultas SQL usadas por la importación de participantes NOBEX.

declare(strict_types=1);

require_once __DIR__ . '/importar_participantes_common.php';

function ip_columna_existe(mysqli $conn, string $tabla, string $columna): bool
{
    $tablaEsc = mysqli_real_escape_string($conn, $tabla);
    $colEsc = mysqli_real_escape_string($conn, $columna);
    $res = mysqli_query($conn, "SHOW COLUMNS FROM `{$tablaEsc}` LIKE '{$colEsc}'");

    return $res && mysqli_num_rows($res) > 0;
}

function ip_validar_columnas_participantes(mysqli $conn): array
{
    $requeridas = [
        'id_concurso',
        'id_grupo',
        'id_salon',
        'id_acceso_registro',
        'codigo_participante',
        'apellidos_nombres',
        'institucion_educativa',
        'tipo_institucion',
        'id_institucion',
        'codigo_modular_ie',
        'nivel_modalidad_ie',
        'documento',
        'observacion',
        'estado',
        'created_at'
    ];

    $faltantes = [];

    foreach ($requeridas as $columna) {
        if (!ip_columna_existe($conn, 'concurso_participantes', $columna)) {
            $faltantes[] = $columna;
        }
    }

    return $faltantes;
}

function ip_buscar_modular(mysqli $conn, string $codigoModular): ?array
{
    $stmt = mysqli_prepare($conn, "
        SELECT
            m.id_modular,
            m.id_institucion,
            m.codigo_modular,
            m.nivel_modalidad,
            i.nombre_institucion,
            i.gestion,
            i.departamento,
            i.provincia,
            i.distrito
        FROM concurso_institucion_modulares m
        INNER JOIN concurso_instituciones i
            ON i.id_institucion = m.id_institucion
        WHERE m.codigo_modular = ?
        LIMIT 1
    ");

    if (!$stmt) {
        return null;
    }

    mysqli_stmt_bind_param($stmt, 's', $codigoModular);
    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);
    $row = mysqli_fetch_assoc($res);
    mysqli_stmt_close($stmt);

    return $row ?: null;
}

function ip_documento_existe(mysqli $conn, int $idConcurso, string $dni): ?array
{
    $stmt = mysqli_prepare($conn, "
        SELECT
            p.id_participante,
            p.codigo_participante,
            p.apellidos_nombres,
            p.documento,
            p.institucion_educativa,
            p.tipo_institucion,
            g.nombre AS grupo,
            s.nombre_salon
        FROM concurso_participantes p
        LEFT JOIN concurso_grupos g
            ON g.id_grupo = p.id_grupo
        LEFT JOIN concurso_salones s
            ON s.id_salon = p.id_salon
        WHERE p.id_concurso = ?
          AND p.documento = ?
          AND p.estado = 'ACTIVO'
        LIMIT 1
    ");

    if (!$stmt) {
        return null;
    }

    mysqli_stmt_bind_param($stmt, 'is', $idConcurso, $dni);
    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);
    $row = mysqli_fetch_assoc($res);
    mysqli_stmt_close($stmt);

    return $row ?: null;
}

function ip_generar_codigo_participante(mysqli $conn, int $anio): string
{
    $anio = $anio > 0 ? $anio : (int)date('Y');

    for ($i = 0; $i < 30; $i++) {
        $codigo = 'NOBEX-' . $anio . '-' . str_pad((string)random_int(1, 99999), 5, '0', STR_PAD_LEFT);
        $stmt = mysqli_prepare($conn, "SELECT id_participante FROM concurso_participantes WHERE codigo_participante = ? LIMIT 1");

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

        mysqli_stmt_bind_param($stmt, 's', $codigo);
        mysqli_stmt_execute($stmt);
        $res = mysqli_stmt_get_result($stmt);
        $existe = mysqli_fetch_assoc($res);
        mysqli_stmt_close($stmt);

        if (!$existe) {
            return $codigo;
        }
    }

    return 'NOBEX-' . $anio . '-' . date('His') . random_int(100, 999);
}

function ip_insertar_participante(mysqli $conn, int $idConcurso, ?int $idGrupo, int $idAcceso, int $anio, string $apellidosNombres, string $dni, array $modular, string $observacion): int
{
    $codigoParticipante = ip_generar_codigo_participante($conn, $anio);
    $idInstitucion = (int)$modular['id_institucion'];
    $codigoModular = (string)$modular['codigo_modular'];
    $nivelModalidad = (string)$modular['nivel_modalidad'];
    $institucion = (string)$modular['nombre_institucion'];
    $gestion = (string)$modular['gestion'];

    $stmt = mysqli_prepare($conn, "
        INSERT INTO concurso_participantes
            (id_concurso, id_grupo, id_salon, id_acceso_registro, codigo_participante, apellidos_nombres, institucion_educativa, tipo_institucion, id_institucion, codigo_modular_ie, nivel_modalidad_ie, documento, observacion, estado, created_at)
        VALUES
            (?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'ACTIVO', NOW())
    ");

    if (!$stmt) {
        throw new RuntimeException('No se pudo preparar el registro del participante: ' . mysqli_error($conn));
    }

    mysqli_stmt_bind_param($stmt, 'iiissssissss', $idConcurso, $idGrupo, $idAcceso, $codigoParticipante, $apellidosNombres, $institucion, $gestion, $idInstitucion, $codigoModular, $nivelModalidad, $dni, $observacion);

    if (!mysqli_stmt_execute($stmt)) {
        $error = mysqli_stmt_error($stmt);
        mysqli_stmt_close($stmt);
        throw new RuntimeException('No se pudo insertar participante: ' . $error);
    }

    $idParticipante = (int)mysqli_insert_id($conn);
    mysqli_stmt_close($stmt);

    return $idParticipante;
}

function ip_ultimos_importados(mysqli $conn, int $idConcurso): array
{
    $items = [];
    $stmt = mysqli_prepare($conn, "
        SELECT
            p.codigo_participante,
            p.documento,
            p.apellidos_nombres,
            p.institucion_educativa,
            p.tipo_institucion,
            p.codigo_modular_ie,
            p.nivel_modalidad_ie,
            p.created_at,
            g.nombre AS grupo
        FROM concurso_participantes p
        LEFT JOIN concurso_grupos g
            ON g.id_grupo = p.id_grupo
        WHERE p.id_concurso = ?
          AND p.estado = 'ACTIVO'
        ORDER BY p.id_participante DESC
        LIMIT 20
    ");

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

    mysqli_stmt_bind_param($stmt, 'i', $idConcurso);
    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);

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

    mysqli_stmt_close($stmt);

    return $items;
}