<?php
// concurso_nobel/includes/importar_participantes_common.php
// Utilidades compartidas para importación de participantes NOBEX.
// Versión estricta: respeta tildes, ñ, mayúsculas, minúsculas y caracteres del Excel.

declare(strict_types=1);

const IP_MAX_ERRORES_MOSTRAR = 220;
const IP_MAX_BYTES_ARCHIVO = 120000000;
const IP_MAX_FILAS_IMPORTAR = 10000;

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

function ip_texto_excel(string $valor, int $maxLength = 255): string
{
    $valor = trim($valor);

    if ($maxLength > 0) {
        if (function_exists('mb_substr')) {
            return mb_substr($valor, 0, $maxLength, 'UTF-8');
        }

        return substr($valor, 0, $maxLength);
    }

    return $valor;
}

function ip_norm_header(string $valor): string
{
    return trim((string)$valor);
}

function ip_limpia_codigo_modular(string $valor): string
{
    return ip_texto_excel($valor, 30);
}

function ip_limpia_dni(string $valor): string
{
    $valor = trim($valor);
    $valor = preg_replace('/\D/', '', $valor);

    return substr((string)$valor, 0, 8);
}

function ip_xml(string $valor): string
{
    return htmlspecialchars($valor, ENT_XML1 | ENT_COMPAT, 'UTF-8');
}

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

function ip_resumen_inicial(): array
{
    return [
        'procesados' => 0,
        'insertados' => 0,
        'duplicados' => 0,
        'saltados' => 0,
        'errores' => []
    ];
}

function ip_agregar_error(array &$resumen, string $mensaje): void
{
    $resumen['saltados']++;

    if (count($resumen['errores']) < IP_MAX_ERRORES_MOSTRAR) {
        $resumen['errores'][] = $mensaje;
    }
}