import assert from "node:assert/strict";
import { test } from "node:test";
import {
  camposDaCompra,
  chavesIguais,
  conferirDadosDaCompra,
  conferirRespostas,
  emailValido,
  nomeDoCookieDaCompra,
  novaChave,
  resumoDaChave,
  sugestaoDeEmail,
} from "./compra.ts";
import { configuracaoDoR2, enderecoParaBaixar } from "./r2.ts";

/* CPF de exemplo com dígitos verificadores válidos. */
const CPF_VALIDO = "529.982.247-25";

test("dados certos passam e chegam limpos", () => {
  const lido = conferirDadosDaCompra({ nome: "  Ana   Paula Souza ", email: " Ana@Gmail.com ", whatsapp: "(87) 98870-1216", documento: CPF_VALIDO, aceite: true });
  assert.deepEqual(lido, { ok: true, dados: { nome: "Ana Paula Souza", email: "ana@gmail.com", whatsapp: "87988701216", documento: "52998224725" } });
});

test("cada campo errado diz o que fazer", () => {
  const lido = conferirDadosDaCompra({ nome: "Ana", email: "ana@", whatsapp: "123", documento: "111.111.111-11", aceite: false });
  assert.equal(lido.ok, false);
  if (!lido.ok) {
    assert.ok(lido.erros.nome && lido.erros.email && lido.erros.whatsapp && lido.erros.documento && lido.erros.aceite);
  }
  assert.equal(conferirDadosDaCompra(null).ok, false);
});

test("sugere o e-mail certo quando o domínio parece digitado errado", () => {
  assert.equal(sugestaoDeEmail("fulano@gmial.com"), "fulano@gmail.com");
  assert.equal(sugestaoDeEmail("fulano@hotmial.com"), "fulano@hotmail.com");
  assert.equal(sugestaoDeEmail("fulano@gmail.com"), null);
  assert.equal(sugestaoDeEmail("fulano@minhaempresa.com.br"), null);
  assert.equal(emailValido("a@b.co"), true);
  assert.equal(emailValido("sem arroba.com"), false);
});

test("a chave da compra: aleatória, guardada só pelo resumo", () => {
  const a = novaChave();
  const b = novaChave();
  assert.notEqual(a, b);
  assert.ok(a.length >= 40);
  assert.match(resumoDaChave(a), /^[0-9a-f]{64}$/);
  assert.equal(chavesIguais(resumoDaChave(a), resumoDaChave(a)), true);
  assert.equal(chavesIguais(resumoDaChave(a), resumoDaChave(b)), false);
  assert.equal(nomeDoCookieDaCompra("0b8c2d10-1234-4abc-9def-001122334455"), "ks_compra_0b8c2d1012344abc9def001122334455");
});

test("a loja só gera endereço de baixar, que vence", () => {
  assert.equal(configuracaoDoR2({}), null);
  const cfg = configuracaoDoR2({ R2_ACCESS_KEY_ID: "id", R2_SECRET_ACCESS_KEY: "s", R2_ENDPOINT: "https://abc.us.r2.cloudflarestorage.com" })!;
  assert.equal(cfg.host, "abc.us.r2.cloudflarestorage.com");
  const url = new URL(enderecoParaBaixar(cfg, "loja/arq", { nome: "Moldes.pdf", segundos: 300 }));
  assert.equal(url.searchParams.get("X-Amz-Expires"), "300");
  assert.ok(url.searchParams.get("response-content-disposition")?.includes("Moldes.pdf"));
});

test("produto grátis: nome e e-mail bastam; WhatsApp, se vier, precisa estar certo", () => {
  const lido = conferirDadosDaCompra({ nome: "Ana Paula", email: "ana@gmail.com", documento: "111" }, { gratis: true });
  assert.deepEqual(lido, { ok: true, dados: { nome: "Ana Paula", email: "ana@gmail.com", whatsapp: "", documento: "" } });
  const comZap = conferirDadosDaCompra({ nome: "Ana Paula", email: "ana@gmail.com", whatsapp: "123" }, { gratis: true });
  assert.equal(comZap.ok, false);
  if (!comZap.ok) assert.ok(comZap.erros.whatsapp && !comZap.erros.documento && !comZap.erros.aceite);
});

test("perguntas da encomenda: só as ligadas, e as respostas conferidas", () => {
  const campos = camposDaCompra([
    { id: "nome", title: "Nome no convite", field_type: "text", required: true, active: true },
    { id: "idade", title: "Idade", field_type: "number", required: false },
    { id: "velho", title: "Desligado", active: false },
    { id: "nome", title: "Repetido" },
    "lixo",
  ]);
  assert.deepEqual(campos.map((c) => c.id), ["nome", "idade"]);
  const faltando = conferirRespostas(campos, { idade: "cinco" });
  assert.equal(faltando.ok, false);
  if (!faltando.ok) assert.deepEqual(Object.keys(faltando.erros).sort(), ["idade", "nome"]);
  const certo = conferirRespostas(campos, { nome: "  Ana  ", idade: "5" });
  assert.deepEqual(certo, {
    ok: true,
    respostas: [
      { id: "nome", title: "Nome no convite", field_type: "text", required: true, variation_signature: null, value: "Ana" },
      { id: "idade", title: "Idade", field_type: "number", required: false, variation_signature: null, value: "5" },
    ],
  });
});
