import assert from "node:assert/strict";
import { test } from "node:test";
import { configuracaoDoR2, enderecoDaParte, enderecoParaBaixar } from "./r2.ts";

const BASE = { R2_ACCESS_KEY_ID: "id", R2_SECRET_ACCESS_KEY: "segredo" };

test("sem chave ou sem endereço, o depósito fica desligado", () => {
  assert.equal(configuracaoDoR2({}), null);
  assert.equal(configuracaoDoR2({ ...BASE }), null);
  assert.equal(configuracaoDoR2({ R2_ENDPOINT: "https://abc.r2.cloudflarestorage.com" }), null);
});

test("aceita o endereço com o nome do depósito no caminho", () => {
  const cfg = configuracaoDoR2({ ...BASE, R2_ENDPOINT: "https://abc123.r2.cloudflarestorage.com/ktalogu-digitais" });
  assert.deepEqual(cfg, { host: "abc123.r2.cloudflarestorage.com", balde: "ktalogu-digitais", cred: { idDaChave: "id", segredo: "segredo", regiao: "auto" } });
});

test("aceita só o id da conta e usa o depósito padrão", () => {
  const cfg = configuracaoDoR2({ ...BASE, R2_ACCOUNT_ID: "abc123" });
  assert.equal(cfg?.host, "abc123.r2.cloudflarestorage.com");
  assert.equal(cfg?.balde, "ktalogu-digitais");
});

test("a variável do depósito vence o caminho do endereço", () => {
  const cfg = configuracaoDoR2({ ...BASE, R2_ENDPOINT: "https://abc.r2.cloudflarestorage.com/outro", R2_BUCKET_DIGITAIS: "ktalogu-digitais" });
  assert.equal(cfg?.balde, "ktalogu-digitais");
});

test("recusa endereço estranho", () => {
  assert.equal(configuracaoDoR2({ ...BASE, R2_ENDPOINT: "nao e url" }), null);
  assert.equal(configuracaoDoR2({ ...BASE, R2_ACCOUNT_ID: "abc", R2_BUCKET_DIGITAIS: "Balde Com Espaço" }), null);
});

test("endereço da parte é um PUT assinado com o número e o envio", () => {
  const cfg = configuracaoDoR2({ ...BASE, R2_ACCOUNT_ID: "abc" })!;
  const url = new URL(enderecoDaParte(cfg, "loja/arquivo", "ENVIO", 7, 600));
  assert.equal(url.host, "abc.r2.cloudflarestorage.com");
  assert.equal(url.pathname, "/ktalogu-digitais/loja/arquivo");
  assert.equal(url.searchParams.get("partNumber"), "7");
  assert.equal(url.searchParams.get("uploadId"), "ENVIO");
  assert.equal(url.searchParams.get("X-Amz-Expires"), "600");
  assert.ok(url.searchParams.get("X-Amz-Signature"));
});

test("endereço para baixar leva o nome do arquivo e vence em 15 minutos", () => {
  const cfg = configuracaoDoR2({ ...BASE, R2_ACCOUNT_ID: "abc" })!;
  const url = new URL(enderecoParaBaixar(cfg, "loja/arq", { nome: "Kit Festa – ação.zip" }));
  assert.equal(url.searchParams.get("X-Amz-Expires"), "900");
  assert.ok(url.searchParams.get("response-content-disposition")?.startsWith("attachment; filename="));
  const video = new URL(enderecoParaBaixar(cfg, "loja/v", { nome: "aula.mp4", abrirNoNavegador: true, tipo: "video/mp4", segundos: 21600 }));
  assert.equal(video.searchParams.get("response-content-type"), "video/mp4");
  assert.ok(video.searchParams.get("response-content-disposition")?.startsWith("inline;"));
});
