import { NextResponse } from "next/server";

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

/*
 * O que a página de venda do curso mostra sem compra: a apresentação e as
 * aulas marcadas como "Prévia grátis". Só de curso publicado; o endereço do
 * vídeo vale uma hora.
 */

const UMA_HORA = 60 * 60;

export async function GET(request: Request) {
  const semCache = { headers: { "cache-control": "no-store" } };
  try {
    const url = new URL(request.url);
    const produtoId = String(url.searchParams.get("produto") || "");
    const aulaId = String(url.searchParams.get("aula") || "");
    const apresentacao = url.searchParams.get("apresentacao") === "1";
    if (!/^[0-9a-f-]{36}$/i.test(produtoId) || (!apresentacao && !/^[0-9a-f-]{36}$/i.test(aulaId))) {
      return NextResponse.json({ error: "Prévia inválida." }, { status: 400, ...semCache });
    }

    const admin = createAdminClient();
    const { data: produto } = await admin
      .from("products")
      .select("id,user_id,digital_config,active,show_in_catalog")
      .eq("id", produtoId)
      .eq("product_kind", "digital")
      .eq("active", true)
      .eq("show_in_catalog", true)
      .maybeSingle();
    const linha = produto as { id: string; user_id: string; digital_config: unknown } | null;
    if (!linha) return NextResponse.json({ error: "Conteúdo não encontrado." }, { status: 404, ...semCache });
    const config = lerConfigDigitalDaLoja(linha.digital_config);
    if (config.tipo !== "curso" || !config.curso) return NextResponse.json({ error: "Conteúdo não encontrado." }, { status: 404, ...semCache });

    const cfg = configuracaoDoR2();
    const assinar = async (arquivoId: string) => {
      const { data } = await admin
        .from("digital_files")
        .select("storage_key,nome,mime,status,categoria")
        .eq("id", arquivoId)
        .eq("user_id", linha.user_id)
        .maybeSingle();
      const arquivo = data as { storage_key: string; nome: string; mime: string | null; status: string; categoria: string } | null;
      if (!arquivo || arquivo.status !== "pronto" || arquivo.categoria !== "video" || !cfg) return null;
      return enderecoParaBaixar(cfg, arquivo.storage_key, { nome: arquivo.nome, segundos: UMA_HORA, abrirNoNavegador: true, tipo: arquivo.mime });
    };

    if (apresentacao) {
      const escolhida = config.curso.apresentacao;
      if (!escolhida) return NextResponse.json({ error: "Este conteúdo não tem apresentação." }, { status: 404, ...semCache });
      if ("link" in escolhida) return NextResponse.json({ ok: true, tipo: "link", provedor: escolhida.link.provedor, url: escolhida.link.url }, semCache);
      const assinado = await assinar(escolhida.arquivoId);
      if (!assinado) return NextResponse.json({ error: "A apresentação ainda está sendo preparada." }, { status: 409, ...semCache });
      return NextResponse.json({ ok: true, tipo: "arquivo", url: assinado }, semCache);
    }

    const { data } = await admin
      .from("digital_course_lessons")
      .select("id,tipo,video_file_id,video_link,previa_gratis,publicada")
      .eq("id", aulaId)
      .eq("product_id", produtoId)
      .eq("user_id", linha.user_id)
      .is("apagado_em", null)
      .maybeSingle();
    const aula = data as { id: string; tipo: string; video_file_id: string | null; video_link: unknown; previa_gratis: boolean; publicada: boolean } | null;
    if (!aula || !aula.publicada || !aula.previa_gratis || aula.tipo !== "video") {
      return NextResponse.json({ error: "Este vídeo não está aberto para quem não comprou." }, { status: 403, ...semCache });
    }
    const link = linkGuardado(aula.video_link);
    if (link) return NextResponse.json({ ok: true, tipo: "link", provedor: link.provedor, url: link.url }, semCache);
    const assinado = aula.video_file_id ? await assinar(aula.video_file_id) : null;
    if (!assinado) return NextResponse.json({ error: "Este vídeo ainda está sendo preparado." }, { status: 409, ...semCache });
    return NextResponse.json({ ok: true, tipo: "arquivo", url: assinado }, semCache);
  } catch (erro) {
    console.error("[digitais] previa gratis", erro);
    return NextResponse.json({ error: "Não foi possível abrir a prévia agora." }, { status: 500, ...semCache });
  }
}
