import { NextResponse } from "next/server";

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

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

/*
 * O vídeo da galeria de um produto (migration 183), quando é um arquivo da
 * própria loja. A página aponta o <video> para cá e a rota manda para um
 * endereço assinado do depósito: o endereço permanente nunca aparece, e o
 * navegador busca os pedaços (Range) direto de lá.
 *
 * Só de produto ativo e visível na loja, e só vídeo pronto da mesma empresa.
 */

const SEIS_HORAS = 6 * 60 * 60;

export async function GET(_request: Request, { params }: { params: Promise<{ productId: string }> }) {
  const { productId } = await params;
  const naoAchou = () => NextResponse.json({ error: "Vídeo não encontrado." }, { status: 404, headers: { "cache-control": "no-store" } });
  if (!/^[0-9a-f-]{36}$/i.test(productId)) return naoAchou();

  const admin = createAdminClient();
  const { data: produto } = await admin
    .from("products")
    .select("id,user_id,video_file_id")
    .eq("id", productId)
    .eq("active", true)
    .eq("show_in_catalog", true)
    .maybeSingle();
  const linha = produto as { user_id: string; video_file_id: string | null } | null;
  if (!linha?.video_file_id) return naoAchou();

  const { data } = await admin
    .from("digital_files")
    .select("storage_key,nome,mime,status,categoria,user_id")
    .eq("id", linha.video_file_id)
    .maybeSingle();
  const arquivo = data as { storage_key: string; nome: string; mime: string | null; status: string; categoria: string; user_id: string } | null;
  const cfg = configuracaoDoR2();
  if (!arquivo || !cfg || arquivo.user_id !== linha.user_id || arquivo.status !== "pronto" || arquivo.categoria !== "video") return naoAchou();

  const endereco = enderecoParaBaixar(cfg, arquivo.storage_key, {
    nome: arquivo.nome,
    abrirNoNavegador: true,
    segundos: SEIS_HORAS,
    tipo: arquivo.mime,
  });
  /* O navegador guarda o redirecionamento por uma hora (o endereço vale seis). */
  return NextResponse.redirect(endereco, { status: 302, headers: { "cache-control": "private, max-age=3600" } });
}
