import assert from "node:assert/strict";
import { describe, it } from "node:test";

import {
  CFOP_DE_SAIDA,
  CSOSN,
  CST_ICMS,
  cfopParaForaDoEstado,
  descricaoDoCodigo,
  LINKS_OFICIAIS,
  pedeCest,
  procurarCodigo,
  SERVICOS_LC116,
} from "./tabelas.ts";

describe("tabelas de códigos fiscais", () => {
  it("acha pelo número e pela palavra do dia a dia", () => {
    assert.equal(procurarCodigo("cfop", "5102")[0].codigo, "5102");
    assert.match(procurarCodigo("cfop", "revenda")[0].descricao + procurarCodigo("cfop", "revenda")[0].ajuda, /terceiros|Revenda/);
    assert.equal(procurarCodigo("cfop", "brinde")[0].codigo, "5910");
    assert.equal(procurarCodigo("lc116", "adesivo")[0].codigo, "24.01");
    assert.equal(procurarCodigo("lc116", "grafica")[0].codigo, "13.05", "busca sem acento acha 'gráfica'");
    assert.deepEqual(procurarCodigo("cfop", "xxxxx"), []);
  });

  it("descreve o código já escolhido, inclusive com zero à esquerda", () => {
    assert.equal(descricaoDoCodigo("cstIcms", "00"), "Tributada integralmente");
    assert.equal(descricaoDoCodigo("cstIcms", 0), "Tributada integralmente");
    assert.equal(descricaoDoCodigo("csosn", 102), "Tributada pelo Simples Nacional sem permissão de crédito");
    assert.equal(descricaoDoCodigo("cfop", 5101), "Venda de produção do estabelecimento");
    assert.equal(descricaoDoCodigo("cfop", null), null);
    assert.equal(descricaoDoCodigo("cfop", "9999"), null);
  });

  it("o par do CFOP para fora do estado é o mesmo código com 6", () => {
    assert.equal(cfopParaForaDoEstado(5101), 6101);
    assert.equal(cfopParaForaDoEstado("5405"), 6405);
    assert.equal(cfopParaForaDoEstado(6101), null);
    assert.equal(cfopParaForaDoEstado(null), null);
  });

  it("o CEST só aparece para quem tem substituição tributária", () => {
    assert.equal(pedeCest({ cstIcms: 0 }), false);
    assert.equal(pedeCest({ cstIcms: 60 }), true);
    assert.equal(pedeCest({ csosn: 102 }), false);
    assert.equal(pedeCest({ csosn: 500 }), true);
  });

  it("nenhuma tabela tem código repetido e todo link é oficial", () => {
    for (const lista of [CFOP_DE_SAIDA, CST_ICMS, CSOSN, SERVICOS_LC116]) {
      const codigos = lista.map((item) => item.codigo);
      assert.equal(new Set(codigos).size, codigos.length);
      for (const item of lista) assert.ok(item.descricao.length > 5, `${item.codigo} sem descrição`);
    }
    for (const link of Object.values(LINKS_OFICIAIS)) {
      assert.match(link.url, /^https?:\/\/[^ ]+\.(gov\.br|br)(\/|$)/, `${link.titulo} precisa ser link oficial`);
      assert.ok(link.titulo.length > 5);
    }
  });
});
