<?php

namespace App\Support;

/**
 * Normaliza lo que pega un lector QR / teclado para que coincida con folio o codigo_qr almacenado.
 */
final class LaundryScanInput
{
    /**
     * Extrae folio o deja el payload (p. ej. base64 de codigo_qr) si no es una URL conocida.
     */
    public static function normalize(string $raw): string
    {
        $s = trim($raw);
        if ($s === '') {
            return '';
        }

        if (preg_match('~/seguimiento/([^/?#]+)~i', $s, $m)) {
            return self::canonicalizeScannerCode(rawurldecode($m[1]));
        }

        if (preg_match('~[?&]folio_unico=([^&=#]+)~i', $s, $m)) {
            return self::canonicalizeScannerCode(rawurldecode($m[1]));
        }

        if (preg_match('~[?&]folio=([^&=#]+)~i', $s, $m)) {
            return self::canonicalizeScannerCode(rawurldecode($m[1]));
        }

        return self::canonicalizeScannerCode($s);
    }

    /**
     * Normaliza códigos LMS/LMSB a forma compacta (solo letras y números).
     */
    public static function canonicalizeScannerCode(string $s): string
    {
        $s = trim($s);
        if ($s === '') {
            return '';
        }

        $s = str_replace(["'", '`'], '-', $s);

        if (preg_match('/^LMSB?[\'`\-_.\s](\d{8})[\'`\-_.\s]([A-Z0-9]+)$/i', $s, $m)) {
            $prefix = str_starts_with(strtoupper($s), 'LMSB') ? 'LMSB' : 'LMS';

            return strtoupper($prefix.$m[1].$m[2]);
        }

        if (preg_match('/^LMSB(\d{8})([A-Z0-9]{4,})$/i', $s, $m)) {
            return 'LMSB'.strtoupper($m[1].$m[2]);
        }

        if (preg_match('/^LMS(\d{8})([A-Z0-9]{4,})$/i', $s, $m)) {
            return 'LMS'.strtoupper($m[1].$m[2]);
        }

        if (preg_match('/^LMS/i', $s)) {
            return LaundryScanCode::compact($s);
        }

        return $s;
    }
}
