/**
 * As regras da nota de devolução que não dependem do banco nem da internet —
 * por isso ficam aqui, testadas sozinhas.
 */

/** O CFOP de entrada que espelha o de saída: 5101 → 1201, 5102 → 1202, 6102 → 2202. */
export function cfopDaDevolucao(cfopDaVenda: number | null | undefined, mesmoEstado: boolean): number {
  const digitos = String(cfopDaVenda ?? "").replace(/\D/g, "");
  /* 401 é venda de produção própria com substituição tributária; 403 e 405 são
     revenda com substituição. A devolução segue a mesma divisão. */
  const producao = /(101|103|105|122|401)$/.test(digitos);
  const comSubstituicao = /(401|403|405)$/.test(digitos);
  const familia = comSubstituicao ? (producao ? 410 : 411) : producao ? 201 : 202;
  return Number(`${mesmoEstado ? 1 : 2}${String(familia).padStart(3, "0")}`);
}

/**
 * O texto que vai para dentro da nota. A SEFAZ recusa o XML inteiro por causa
 * de um caractere que ninguém percebe ter digitado: travessão, aspas curvas,
 * emoji. Acento passa; o resto vira o equivalente simples.
 */
export function textoParaNota(bruto: string) {
  return String(bruto ?? "")
    .replace(/[‐-―−]/g, "-")
    .replace(/[‘’‛]/g, "'")
    .replace(/[“”]/g, '"')
    .replace(/…/g, "...")
    .replace(/[^\p{L}\p{N}\p{Zs}\p{P}\p{Sc}+=<>|^~$]/gu, " ")
    .replace(/\s+/g, " ")
    .trim();
}
