/*
 * Os códigos e licenças, sem nada do servidor (testável): limpar a lista que a
 * loja colou ou importou, achar os repetidos e mascarar o que já foi salvo.
 *
 * O banco é quem garante que o mesmo código não entra duas vezes no mesmo
 * produto (sem diferenciar maiúsculas nem espaços nas pontas) e que cada
 * código vai para uma compra só.
 */

export const CODIGOS_POR_VEZ = 5000;
export const TAMANHO_MAXIMO_DO_CODIGO = 500;

/* O jeito que o banco compara: sem espaços nas pontas e sem diferenciar maiúsculas. */
export function chaveDoCodigo(codigo: string): string {
  return codigo.trim().toUpperCase();
}

export type ListaDeCodigos = {
  codigos: string[];
  /* Repetidos dentro do próprio texto colado. */
  repetidosNoTexto: number;
  /* Linhas grandes demais (mais de 500 letras). */
  grandesDemais: number;
};

/*
 * O texto colado (ou o arquivo importado) vira a lista: um código por linha.
 * Planilha exportada como CSV também serve: vale a primeira coluna e a linha
 * de título ("código", "codigo", "code", "licença"...) é ignorada.
 */
export function lerListaDeCodigos(texto: string): ListaDeCodigos {
  const linhas = String(texto || "")
    .replace(/\u0000/g, "")
    .split(/\r?\n/)
    .map((linha) => {
      const semAspas = linha.trim();
      /* CSV: só a primeira coluna (com ou sem aspas). */
      const primeira = /^"(.*?)"(?:[;,\t]|$)/.exec(semAspas)?.[1] ?? semAspas.split(/[;\t]/)[0] ?? "";
      return primeira.trim();
    })
    .filter(Boolean);
  if (linhas.length && /^(c[oó]digos?|codes?|chaves?|licen[cç]as?|keys?)$/i.test(linhas[0])) linhas.shift();

  const vistos = new Set<string>();
  const codigos: string[] = [];
  let repetidosNoTexto = 0;
  let grandesDemais = 0;
  for (const linha of linhas) {
    if (linha.length > TAMANHO_MAXIMO_DO_CODIGO) {
      grandesDemais += 1;
      continue;
    }
    const chave = chaveDoCodigo(linha);
    if (vistos.has(chave)) {
      repetidosNoTexto += 1;
      continue;
    }
    vistos.add(chave);
    codigos.push(linha);
  }
  return { codigos, repetidosNoTexto, grandesDemais };
}

/* "AURO-7K2M-Q9FX" → "•••• Q9FX": o painel nunca mostra o código inteiro de novo. */
export function mascararCodigo(codigo: string): string {
  const limpo = codigo.trim();
  if (limpo.length <= 4) return "••••";
  return `•••• ${limpo.slice(-4)}`;
}

/* "Acabando" quando restam poucos (a loja escolhe quantos); "Esgotado" sem nenhum. */
export function situacaoDoEstoque(livres: number, avisarCom: number): "esgotado" | "acabando" | "ok" {
  if (livres <= 0) return "esgotado";
  if (livres <= Math.max(0, avisarCom)) return "acabando";
  return "ok";
}
