import assert from "node:assert/strict";
import { after, beforeEach, test } from "node:test";
import { enderecosDaLoja, lojaDoAdmin } from "./endereco-da-loja.ts";

/*
  O aviso do admin para a loja é "dispara e esquece": quando o endereço sai
  errado ninguém vê erro nenhum, a loja só demora dois minutos para mudar.
  Foi o que aconteceu em produção (http:// atrás da Cloudflare), então o
  endereço tem teste.
*/

const CHAVES = [
  "NODE_ENV",
  "NEXT_PUBLIC_PUBLIC_CATALOG_BASE_URL",
  "PUBLIC_CATALOG_BASE_URL",
  "NEXT_PUBLIC_ADMIN_BASE_URL",
  "ADMIN_BASE_URL",
  "NEXT_PUBLIC_ADMIN_URL",
] as const;
const ambiente = process.env as Record<string, string | undefined>;
const guardadas = Object.fromEntries(CHAVES.map((chave) => [chave, ambiente[chave]]));

beforeEach(() => {
  for (const chave of CHAVES) delete ambiente[chave];
});

after(() => {
  for (const chave of CHAVES) {
    if (guardadas[chave] === undefined) delete ambiente[chave];
    else ambiente[chave] = guardadas[chave];
  }
});

const pedido = (url: string, headers: Record<string, string> = {}) => new Request(url, { headers });

test("atrás da Cloudflare o cabeçalho diz http, e o aviso sai por https mesmo assim", () => {
  /* Os cabeçalhos de produção que faziam o aviso morrer num 301. */
  const req = pedido("http://localhost:3002/api/loja/avisar", {
    "x-forwarded-host": "admin.ktalogu.com.br",
    "x-forwarded-proto": "http",
    host: "localhost:3002",
  });
  assert.deepEqual(enderecosDaLoja(req), ["https://ktalogu.com.br"]);
});

test("em produção a loja da mesma máquina é a primeira tentativa", () => {
  ambiente.NODE_ENV = "production";
  const req = pedido("http://localhost:3002/api/products", { "x-forwarded-host": "admin.ktalogu.com.br" });
  assert.deepEqual(enderecosDaLoja(req), ["http://127.0.0.1:3001", "https://ktalogu.com.br"]);
});

test("no computador de desenvolvimento a porta 3002 vira 3001 e fica http", () => {
  const req = pedido("http://localhost:3002/api/products", { host: "localhost:3002" });
  assert.deepEqual(enderecosDaLoja(req), ["http://localhost:3001"]);
});

test("endereço configurado vence o do pedido", () => {
  ambiente.NEXT_PUBLIC_PUBLIC_CATALOG_BASE_URL = "https://ktalogu.com.br/";
  const req = pedido("http://localhost:3002/api/products", { "x-forwarded-host": "admin.outro.com.br" });
  assert.deepEqual(enderecosDaLoja(req), ["https://ktalogu.com.br"]);
});

test("endereço público do admin configurado também serve de ponto de partida", () => {
  ambiente.NEXT_PUBLIC_ADMIN_BASE_URL = "https://admin.ktalogu.com.br";
  const req = pedido("http://localhost:3002/api/products");
  assert.deepEqual(enderecosDaLoja(req), ["https://ktalogu.com.br"]);
});

test("sem pedido e sem configuração não há para onde avisar", () => {
  assert.deepEqual(enderecosDaLoja(), []);
});

test("o admin vira a loja", () => {
  assert.equal(lojaDoAdmin("https://admin.ktalogu.com.br"), "https://ktalogu.com.br");
  assert.equal(lojaDoAdmin("http://localhost:3002/"), "http://localhost:3001");
});
