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

/* O painel assina, a loja confere: os dois lados precisam bater (a mesma conta nos dois apps). */
import { assinarIdentidade, voltaValida } from "../../../../admin/src/lib/live/identidade.ts";
import { lerIdentidade } from "./servidor/identidade.ts";
import { momentoDaSala } from "./regras.ts";

const SALA = "3d269058-faa3-4c3d-a7b3-dff274faabaf";
const EMPRESA = "609a0082-1f55-4a79-a76a-cc0017a4ea23";
const CHAVE = "chave-de-teste-do-servidor";

test("identidade: o que o painel assina a loja lê, e nada mais", () => {
  const antes = process.env.SUPABASE_SERVICE_ROLE_KEY;
  process.env.SUPABASE_SERVICE_ROLE_KEY = CHAVE;
  try {
    const token = assinarIdentidade({ sala: SALA, empresa: EMPRESA, nome: "Gráfica Aurora", logo: "https://exemplo.com/logo.png", dono: true }, CHAVE);
    const lida = lerIdentidade(token, SALA);
    assert.ok(lida);
    assert.equal(lida.nome, "Gráfica Aurora");
    assert.equal(lida.dono, true);
    assert.equal(lida.logo, "https://exemplo.com/logo.png");
    /* Outra sala, assinatura mexida, vencida ou com outra chave: não vale. */
    assert.equal(lerIdentidade(token, "11111111-1111-1111-1111-111111111111"), null);
    assert.equal(lerIdentidade(token.slice(0, -2) + "xx", SALA), null);
    assert.equal(lerIdentidade(token, SALA, Date.now() + 16 * 60 * 1000), null);
    assert.equal(lerIdentidade(assinarIdentidade({ sala: SALA, empresa: EMPRESA, nome: "X Y", logo: null, dono: true }, "outra-chave"), SALA), null);
    /* Trocar "dono" no meio do texto quebra a assinatura. */
    const [corpo, assinatura] = token.split(".");
    const dados = JSON.parse(Buffer.from(corpo, "base64url").toString("utf8"));
    const falso = Buffer.from(JSON.stringify({ ...dados, d: true, e: EMPRESA }), "utf8").toString("base64url");
    assert.equal(lerIdentidade(`${falso}x.${assinatura}`, SALA), null);
    /* Logo que não é https some. */
    const semLogo = lerIdentidade(assinarIdentidade({ sala: SALA, empresa: EMPRESA, nome: "Loja", logo: "javascript:alert(1)", dono: false }, CHAVE), SALA);
    assert.equal(semLogo?.logo, null);
  } finally {
    process.env.SUPABASE_SERVICE_ROLE_KEY = antes;
  }
});

test("identidade: só volta para a própria sala, no Ktalogu ou no domínio da loja", () => {
  const sala = { id: SALA, codigo: "abc-defg-hij" };
  assert.ok(voltaValida("https://ktalogu.com.br/abc-defg-hij", sala, []));
  assert.ok(voltaValida("https://ktalogu.com.br/aurora/live/" + SALA + "?apresentar=1", sala, []));
  assert.ok(voltaValida("https://espiaelasatelier.com.br/abc-defg-hij", sala, ["espiaelasatelier.com.br"]));
  assert.ok(voltaValida("https://www.espiaelasatelier.com.br/abc-defg-hij", sala, ["espiaelasatelier.com.br"]));
  assert.ok(voltaValida("http://localhost:3005/abc-defg-hij", sala, []));
  assert.equal(voltaValida("https://golpe.com/abc-defg-hij", sala, ["espiaelasatelier.com.br"]), null);
  assert.equal(voltaValida("https://ktalogu.com.br/outra-sala-aqui", sala, []), null);
  assert.equal(voltaValida("http://ktalogu.com.br/abc-defg-hij", sala, []), null);
  assert.equal(voltaValida("https://ktalogu.com.br@golpe.com/abc-defg-hij", sala, []), null);
  assert.equal(voltaValida("javascript:alert(1)", sala, []), null);
});

test("live esquecida no ar acaba sozinha", () => {
  const sala = { status: "ao_vivo" as const, comeca_em: "2026-10-13T12:00:00.000Z", duracao_min: 60, espera_min: 0, participacao: "livre" as const, cameras_alunos: true, iniciada_em: "2026-10-13T12:00:00.000Z" };
  assert.equal(momentoDaSala(sala, Date.parse("2026-10-13T14:00:00.000Z")), "ao_vivo");
  assert.equal(momentoDaSala(sala, Date.parse("2026-10-13T16:01:00.000Z")), "encerrada");
});
