import test from "node:test";
import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";

import { avaliarCupom, fraseDoCupom, lerCupom, situacaoDoCupom } from "./regras-do-cupom.ts";

/*
  As regras do cupom moram nos dois apps (o painel mostra "como o cliente vê"
  e a loja confere no pedido). Os testes de verdade estão na loja
  (apps/public/src/lib/regras-do-cupom.test.ts); aqui a garantia de que as
  duas cópias são a mesma, e uma conferida rápida do que o painel usa.
*/

test("a cópia do painel é igual à da loja", () => {
  const painel = readFileSync(fileURLToPath(new URL("./regras-do-cupom.ts", import.meta.url)), "utf8").replace(/\r\n/g, "\n");
  const loja = readFileSync(fileURLToPath(new URL("../../../public/src/lib/regras-do-cupom.ts", import.meta.url)), "utf8").replace(/\r\n/g, "\n");
  assert.equal(painel, loja);
});

test("o que o painel mostra de um cupom", () => {
  const agora = Date.parse("2026-10-16T18:00:00Z");
  const cupom = lerCupom({ id: "x", code: "frete", type: "free_shipping", value: 0, min_total: 199, active: true, usage_limit: 100 });
  assert.equal(fraseDoCupom(cupom, agora), "Frete grátis, para compras a partir de R$ 199 antes dos descontos");
  assert.equal(situacaoDoCupom(cupom, agora, 100), "esgotado");
  const r = avaliarCupom(cupom, { itens: [{ product_id: "p", category_id: null, total: 250, quantity: 1 }], cliente: null, frete: { valor: 25, cep: "01310100", retirada: false }, agora });
  assert.equal(r.ok && r.descontoNoFrete, 25);
});
