function compact(value: string | null | undefined) {
  return String(value || "").toUpperCase().replace(/[^A-Z0-9]/g, "");
}

/**
 * Compara placa Mercosul/legada sem tratar uma ambiguidade típica de OCR como
 * divergência: O é lido como 0 nas posições numéricas e 0 como O nas letras.
 * A comparação continua estrita para todos os demais caracteres.
 */
export function normalizePlateForDeclared(value: string | null | undefined, declared: string | null | undefined) {
  const raw = compact(value);
  const reference = compact(declared);
  if (!raw || raw.length !== reference.length) return raw;

  return raw.split("").map((character, index) => {
    const expected = reference[index] || "";
    if (/\d/.test(expected) && character === "O") return "0";
    if (/[A-Z]/.test(expected) && character === "0") return "O";
    return character;
  }).join("");
}

export function platesMatch(read: string | null | undefined, declared: string | null | undefined) {
  const reference = compact(declared);
  const normalizedRead = normalizePlateForDeclared(read, reference);
  return Boolean(reference && normalizedRead && normalizedRead === reference);
}

export function compactIdentifier(value: string | null | undefined) {
  return compact(value);
}
