import test from "node:test";
import assert from "node:assert/strict";

import {
  conferirFornecedor,
  documentoValido,
  emailValido,
  formatarDocumento,
  telefoneValido,
  tipoDoDocumento,
} from "./fornecedores/documento.ts";

/* CNPJ e CPF reais no sentido de digito verificador, nao de existencia na
   Receita. Sao os mesmos numeros usados nos exemplos do proprio repo. */
const CNPJ_BOM = "11222333000181";
const CPF_BOM = "52998224725";

const base = {
  nome: "Papelaria Central",
  documento: CNPJ_BOM,
  email: "compras@papelaria.com.br",
  telefone: "11999991111",
};

test("tipoDoDocumento decide pelo tamanho", () => {
  assert.equal(tipoDoDocumento(CPF_BOM), "cpf");
  assert.equal(tipoDoDocumento(CNPJ_BOM), "cnpj");
  assert.equal(tipoDoDocumento(""), "cnpj");
});

test("documento e conferido pelo digito verificador, nao pela contagem", () => {
  assert.equal(documentoValido(CNPJ_BOM), true);
  assert.equal(documentoValido(CPF_BOM), true);
  /* Os dois casos que existem hoje no banco de producao. */
  assert.equal(documentoValido("00000000000000"), false);
  assert.equal(documentoValido("11111111111111"), false);
  /* Quatorze digitos que nao fecham a conta. */
  assert.equal(documentoValido("11222333000182"), false);
  /* Tamanho que nao e nem CPF nem CNPJ. */
  assert.equal(documentoValido("1122233300018"), false);
});

test("a mascara acompanha o tipo enquanto a pessoa digita", () => {
  assert.equal(formatarDocumento(CNPJ_BOM), "11.222.333/0001-81");
  assert.equal(formatarDocumento(CPF_BOM), "529.982.247-25");
  assert.equal(formatarDocumento("112223"), "112.223");
});

test("e-mail barra o que o banco tem hoje e aceita endereco normal", () => {
  assert.equal(emailValido("compras@papelaria.com.br"), true);
  assert.equal(emailValido("a"), false);
  assert.equal(emailValido("aa"), false);
  assert.equal(emailValido("teste@teste"), false);
  assert.equal(emailValido("com espaco@teste.com"), false);
  assert.equal(emailValido(""), false);
});

test("telefone aceita fixo com DDD e celular", () => {
  assert.equal(telefoneValido("1133334444"), true);
  assert.equal(telefoneValido("11999991111"), true);
  assert.equal(telefoneValido("99991111"), false);
});

test("o cadastro passa com nome, documento e um contato so", () => {
  assert.equal(conferirFornecedor(base), null);
  assert.equal(conferirFornecedor({ ...base, email: "" }), null);
  assert.equal(conferirFornecedor({ ...base, telefone: "" }), null);
  /* Pessoa fisica agora cabe no cadastro. */
  assert.equal(conferirFornecedor({ ...base, documento: CPF_BOM }), null);
});

test("o cadastro recusa dizendo qual campo falta", () => {
  assert.equal(conferirFornecedor({ ...base, nome: "  " })?.campo, "nome");
  assert.equal(conferirFornecedor({ ...base, documento: "" })?.campo, "documento");
  assert.equal(conferirFornecedor({ ...base, documento: "00000000000000" })?.campo, "documento");
  assert.equal(conferirFornecedor({ ...base, email: "", telefone: "" })?.campo, "contato");
  assert.equal(conferirFornecedor({ ...base, email: "aa", telefone: "" })?.campo, "email");
  assert.equal(conferirFornecedor({ ...base, email: "", telefone: "9999" })?.campo, "telefone");
});

test("a recusa do documento diz CPF ou CNPJ conforme o tamanho", () => {
  assert.match(String(conferirFornecedor({ ...base, documento: "52998224726" })?.mensagem), /CPF/);
  assert.match(String(conferirFornecedor({ ...base, documento: "11222333000182" })?.mensagem), /CNPJ/);
});

test("cadastro antigo com documento invalido continua editavel", () => {
  /* O fornecedor com quatorze zeros ja gravado: mexer no telefone nao pode
     ser barrado pelo documento que a pessoa nao encostou. */
  const antigo = { ...base, documento: "00000000000000" };
  assert.equal(conferirFornecedor(antigo, { documentoJaGravado: "00000000000000" }), null);
  /* Mas se ela trocar o documento, o novo e conferido. */
  assert.equal(
    conferirFornecedor({ ...base, documento: "00000000000001" }, { documentoJaGravado: "00000000000000" })?.campo,
    "documento"
  );
});
