import assert from "node:assert/strict";
import { test } from "node:test";
import { CONFIGURACOES_PADRAO, corValida, lerConfiguracoes, preencherMensagem, secoesMexidas } from "./configuracoes.ts";
import { digitaisLiberados } from "./liberacao.ts";

test("vazio vira o padrão inteiro", () => {
  assert.deepEqual(lerConfiguracoes(undefined), CONFIGURACOES_PADRAO);
  assert.deepEqual(lerConfiguracoes("lixo"), CONFIGURACOES_PADRAO);
  assert.deepEqual(lerConfiguracoes({}), CONFIGURACOES_PADRAO);
  assert.equal(secoesMexidas(lerConfiguracoes({})).size, 0);
});

test("números fora da faixa são cortados", () => {
  const lido = lerConfiguracoes({
    acesso: { prazoDias: 99999, aparelhos: 0, freioLugares: 1 },
    player: { percentualAssistida: 10 },
  });
  assert.equal(lido.acesso.prazoDias, 3650);
  assert.equal(lido.acesso.aparelhos, 1);
  assert.equal(lido.acesso.freioLugares, 2);
  assert.equal(lido.player.percentualAssistida, 50);
});

test("null desliga o prazo e o freio; ausente fica no padrão", () => {
  const desligado = lerConfiguracoes({ acesso: { prazoDias: null, freioLugares: null } });
  assert.equal(desligado.acesso.prazoDias, null);
  assert.equal(desligado.acesso.freioLugares, null);
  assert.equal(lerConfiguracoes({ acesso: {} }).acesso.freioLugares, 5);
});

test("velocidades só das conhecidas, na ordem certa, nunca vazio", () => {
  assert.deepEqual(lerConfiguracoes({ player: { velocidades: [2, 1, 3, "1.5", 0.75] } }).player.velocidades, [0.75, 1, 1.5, 2]);
  assert.deepEqual(lerConfiguracoes({ player: { velocidades: [9] } }).player.velocidades, [1]);
});

test("textos cortados, cor e banner conferidos", () => {
  const lido = lerConfiguracoes({
    area: { nome: "  Escola Aurora  ", cor: "#f26b1d", banner: "http://inseguro.com/x.png", aparencia: "clara" },
    entrega: { assunto: "", mensagem: "x".repeat(5000) },
  });
  assert.equal(lido.area.nome, "Escola Aurora");
  assert.equal(lido.area.cor, "#F26B1D");
  assert.equal(lido.area.banner, null, "só https");
  assert.equal(lido.area.aparencia, "clara");
  assert.equal(lido.entrega.assunto, CONFIGURACOES_PADRAO.entrega.assunto);
  assert.equal(lido.entrega.mensagem.length, 2000);
  assert.equal(corValida("vermelho"), null);
  assert.deepEqual([...secoesMexidas(lido)].sort(), ["area", "entrega"]);
});

test("mensagem do e-mail preenche as palavras e some com as desconhecidas", () => {
  assert.equal(
    preencherMensagem("Oi, {{primeiro_nome}}! {{ produto }} na {{loja}}. {{senha}}", { primeiro_nome: "Ana", produto: "Curso", loja: "Aurora" }),
    "Oi, Ana! Curso na Aurora. ",
  );
});

test("liberação: fechada por padrão, lista de ids ou todas", () => {
  assert.equal(digitaisLiberados(["a"], undefined), false);
  assert.equal(digitaisLiberados(["a"], ""), false);
  assert.equal(digitaisLiberados(["a"], "todas"), true);
  assert.equal(digitaisLiberados([null, "B"], "x, b"), true);
  assert.equal(digitaisLiberados(["a", "b"], "c;d"), false);
});
