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

import { MAX_TENTATIVAS, baseDaLojaSemPedido, esperaDaTentativa, listaDeItens, lojasDaFila } from "./fila-regras.ts";

const AURORA = "609a0082-1f55-4a79-a76a-cc0017a4ea23";
const KTALOGU = "d84e6bd1-3bb6-4742-9a89-a952a2060aa6";

test("as esperas crescem e depois a fila desiste", () => {
  assert.equal(esperaDaTentativa(1), 1);
  assert.equal(esperaDaTentativa(2), 5);
  assert.equal(esperaDaTentativa(3), 30);
  assert.equal(esperaDaTentativa(4), 120);
  assert.equal(esperaDaTentativa(5), 720);
  assert.equal(esperaDaTentativa(MAX_TENTATIVAS), null);
  assert.equal(esperaDaTentativa(99), null);
  assert.equal(esperaDaTentativa(0), 1);
  assert.equal(esperaDaTentativa(Number.NaN), null);
});

test("em produção a fila cuida de todas as lojas", () => {
  assert.equal(lojasDaFila({ NODE_ENV: "production" }), null);
  assert.equal(lojasDaFila({ NODE_ENV: "production", DIGITAIS_LIBERADOS: AURORA }), null);
});

test("no computador só liga quando pedido, e só nas lojas de teste", () => {
  assert.equal(lojasDaFila({ NODE_ENV: "development", DIGITAIS_LIBERADOS: AURORA }), false);
  assert.deepEqual(lojasDaFila({ NODE_ENV: "development", DIGITAIS_FILA_LOCAL: "1", DIGITAIS_LIBERADOS: `${AURORA}, ${KTALOGU.toUpperCase()}` }), [
    AURORA,
    KTALOGU,
  ]);
  /* "todas" ou lixo não abre a fila do computador para as lojas reais. */
  assert.equal(lojasDaFila({ NODE_ENV: "development", DIGITAIS_FILA_LOCAL: "1", DIGITAIS_LIBERADOS: "todas" }), false);
  assert.equal(lojasDaFila({ NODE_ENV: "development", DIGITAIS_FILA_LOCAL: "1", DIGITAIS_LIBERADOS: "" }), false);
  assert.equal(lojasDaFila({ DIGITAIS_FILA_LOCAL: "1", DIGITAIS_LIBERADOS: "abc,123" }), false);
});

test("a liberação pelo banco não muda a fila: produção já cuida de todas, o computador só das de teste", () => {
  /* Sem variável nenhuma (empresa liberada só pelo banco), produção continua com todas. */
  assert.equal(lojasDaFila({ NODE_ENV: "production", DIGITAIS_LIBERADOS: "" }), null);
  assert.equal(lojasDaFila({ NODE_ENV: "production", DIGITAIS_FILA_LOCAL: "1" }), null);
  /* No computador, sem lista na variável a fila fica desligada (as linhas do banco são de empresas reais). */
  assert.equal(lojasDaFila({ NODE_ENV: "development", DIGITAIS_FILA_LOCAL: "1" }), false);
});

test("endereço da loja: domínio próprio, base configurada ou o da Ktalogu", () => {
  assert.equal(baseDaLojaSemPedido({ slug: "aurora", dominio: "loja.aurora.com.br" }, {}), "https://loja.aurora.com.br");
  assert.equal(baseDaLojaSemPedido({ slug: "aurora", dominio: null }, { NODE_ENV: "production" }), "https://ktalogu.com.br/aurora");
  assert.equal(baseDaLojaSemPedido({ slug: "aurora", dominio: null }, { NODE_ENV: "development" }), "http://localhost:3001/aurora");
  assert.equal(
    baseDaLojaSemPedido({ slug: "aurora", dominio: null }, { NODE_ENV: "production", NEXT_PUBLIC_PUBLIC_CATALOG_BASE_URL: "https://ktalogu.com.br/" }),
    "https://ktalogu.com.br/aurora"
  );
  assert.equal(baseDaLojaSemPedido({ slug: null, dominio: null }, { NODE_ENV: "production" }), null);
  /* Domínio estranho não vira endereço: cai no da Ktalogu. */
  assert.equal(baseDaLojaSemPedido({ slug: "aurora", dominio: "evil.com/x?y" }, { NODE_ENV: "production" }), "https://ktalogu.com.br/aurora");
});

test("a lista de itens do e-mail", () => {
  assert.equal(listaDeItens([]), "");
  assert.equal(listaDeItens(["Convites"]), "Convites");
  assert.equal(listaDeItens(["Convites", "Toppers"]), "Convites e Toppers");
  assert.equal(listaDeItens(["A", "B", "C"]), "A, B e C");
  assert.equal(listaDeItens(["A", "A", " ", "B"]), "A e B");
  assert.equal(listaDeItens(["1", "2", "3", "4", "5", "6", "7", "8"]), "1, 2, 3, 4, 5, 6 e mais 2");
});
