import { enderecoAssinado, type CredenciaisS3 } from "./assinatura-s3.ts";
import { disposicaoDoArquivo } from "./nome-do-arquivo.ts";

/*
 * O depósito dos produtos digitais visto pela LOJA: só gera endereços
 * assinados para baixar e assistir, com a chave que só lê. Quem envia e apaga
 * é o painel (apps/admin/src/lib/digitais/r2.ts).
 *
 * O comprador nunca recebe um endereço permanente: cada download é um
 * endereço novo que vence em minutos.
 */

export type ConfiguracaoR2 = { host: string; balde: string; cred: CredenciaisS3 };

export function configuracaoDoR2(env: Record<string, string | undefined> = process.env): ConfiguracaoR2 | null {
  const idDaChave = String(env.R2_ACCESS_KEY_ID || "").trim();
  const segredo = String(env.R2_SECRET_ACCESS_KEY || "").trim();
  let balde = String(env.R2_BUCKET_DIGITAIS || "").trim();
  let host = "";
  const endereco = String(env.R2_ENDPOINT || "").trim();
  if (endereco) {
    try {
      const url = new URL(endereco);
      host = url.host;
      const pasta = url.pathname.replace(/^\/+|\/+$/g, "").split("/")[0];
      if (!balde && pasta) balde = pasta;
    } catch {
      host = "";
    }
  }
  const conta = String(env.R2_ACCOUNT_ID || "").trim();
  if (!host && conta) host = `${conta}.r2.cloudflarestorage.com`;
  if (!balde) balde = "ktalogu-digitais";
  if (!idDaChave || !segredo || !host) return null;
  if (!/^[a-z0-9.-]+(:\d+)?$/i.test(host) || !/^[a-z0-9][a-z0-9.-]{1,62}$/.test(balde)) return null;
  return { host, balde, cred: { idDaChave, segredo, regiao: "auto" } };
}

/* Endereço para baixar (attachment) ou assistir (inline), válido por `segundos`. */
export function enderecoParaBaixar(
  cfg: ConfiguracaoR2,
  chave: string,
  opcoes: { nome: string; segundos?: number; abrirNoNavegador?: boolean; tipo?: string | null }
): string {
  const consulta: Record<string, string> = {
    "response-content-disposition": disposicaoDoArquivo(opcoes.nome, Boolean(opcoes.abrirNoNavegador)),
  };
  if (opcoes.tipo) consulta["response-content-type"] = opcoes.tipo;
  return enderecoAssinado(
    {
      metodo: "GET",
      host: cfg.host,
      caminho: `/${cfg.balde}/${chave}`,
      consulta,
      expiraEmSegundos: opcoes.segundos ?? 900,
    },
    cfg.cred
  );
}
