import { NextResponse } from "next/server";

import { configuracaoDoR2, enderecoParaBaixar } from "@/lib/digitais/r2";
import { createAdminClient } from "@/lib/supabase-server";

/*
 * O link curto dos arquivos que o assistente entrega (migration 191):
 * https://admin.ktalogu.com.br/baixar/<12 letras>. Não pede login: quem tem o
 * link baixa, como no link assinado de antes. Confere a validade (24 horas) e
 * só então gera o link assinado do depósito, que vale poucos minutos.
 *
 * Vídeos e arquivos dos produtos digitais (gravações das lives, vídeos da
 * biblioteca) moram no outro depósito (R2): o link guarda
 * "digital_file:<id>" e, no clique, a rota confere que o arquivo ainda está
 * pronto e é da mesma empresa, e só então assina o endereço por 5 minutos.
 * "?assistir=1" abre no navegador em vez de baixar.
 */

const ARQUIVO_DIGITAL = /^digital_file:([0-9a-f-]{36})$/i;

const SEM_CACHE = { "Cache-Control": "no-store", "Referrer-Policy": "no-referrer", "X-Robots-Tag": "noindex" };

function aviso(titulo: string, texto: string, status: number) {
  const html = `<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${titulo}</title></head><body style="margin:0;font-family:system-ui,sans-serif;background:#f6f5fb;color:#1d1b2c;display:grid;place-items:center;min-height:100vh;padding:16px"><main style="max-width:420px;text-align:center"><h1 style="font-size:20px;margin:0 0 8px">${titulo}</h1><p style="margin:0;color:#5b5873;line-height:1.5">${texto}</p></main></body></html>`;
  return new NextResponse(html, { status, headers: { ...SEM_CACHE, "Content-Type": "text/html; charset=utf-8" } });
}

const NAO_ACHOU = () => aviso("Link não encontrado", "Confira se o link foi copiado inteiro, ou peça o arquivo de novo ao assistente.", 404);

export async function GET(request: Request, { params }: { params: Promise<{ codigo: string }> }) {
  const { codigo } = await params;
  if (!/^[A-Za-z0-9]{12}$/.test(codigo || "")) return NAO_ACHOU();

  const admin = createAdminClient();
  const { data, error } = await admin.from("assistentes_links").select("caminho,nome,vence_em,company_id").eq("codigo", codigo).maybeSingle();
  if (error) {
    console.error("[assistentes] abrir link curto", error.message);
    return aviso("Não deu para abrir agora", "Tente de novo em instantes.", 503);
  }
  const link = data as { caminho: string; nome: string; vence_em: string; company_id: string } | null;
  if (!link) return NAO_ACHOU();
  if (new Date(link.vence_em).getTime() <= Date.now()) {
    return aviso("Este link venceu", "Os arquivos do assistente valem 24 horas. Peça o arquivo de novo na conversa.", 410);
  }

  const digital = ARQUIVO_DIGITAL.exec(link.caminho);
  if (digital) return arquivoDigital(admin, digital[1], link.company_id, new URL(request.url).searchParams.get("assistir") === "1");

  const { data: assinado, error: erroDoAssinado } = await admin.storage.from("assistentes-arquivos").createSignedUrl(link.caminho, 300, { download: link.nome });
  if (erroDoAssinado || !assinado?.signedUrl) {
    console.error("[assistentes] link assinado", erroDoAssinado?.message);
    return aviso("Arquivo indisponível", "Ele pode ter sido apagado. Peça o arquivo de novo ao assistente.", 404);
  }
  return NextResponse.redirect(assinado.signedUrl, { status: 302, headers: SEM_CACHE });
}

/* O arquivo do depósito dos digitais: pronto, e da loja desta empresa (o dono ou a própria empresa). */
async function arquivoDigital(admin: ReturnType<typeof createAdminClient>, arquivoId: string, empresaId: string, assistir: boolean) {
  const cfg = configuracaoDoR2();
  if (!cfg) return aviso("Arquivo indisponível", "O depósito de arquivos não está ligado agora. Tente de novo mais tarde.", 503);
  const [{ data: arquivo }, { data: empresa }] = await Promise.all([
    admin.from("digital_files").select("user_id,storage_key,nome,mime,status").eq("id", arquivoId).maybeSingle(),
    admin.from("companies").select("owner_id").eq("id", empresaId).maybeSingle(),
  ]);
  const linha = arquivo as { user_id: string; storage_key: string; nome: string; mime: string | null; status: string } | null;
  const dono = (empresa as { owner_id?: string | null } | null)?.owner_id ?? null;
  if (!linha || linha.status !== "pronto" || (linha.user_id !== dono && linha.user_id !== empresaId)) {
    return aviso("Arquivo indisponível", "Ele pode ter sido apagado. Peça o link de novo ao assistente.", 404);
  }
  const endereco = enderecoParaBaixar(cfg, linha.storage_key, { nome: linha.nome, tipo: linha.mime, abrirNoNavegador: assistir, segundos: 300 });
  return NextResponse.redirect(endereco, { status: 302, headers: SEM_CACHE });
}
