import { NextRequest, NextResponse } from "next/server";
import { getSupabaseClient } from "@/lib/supabase";
import { miniatura } from "@/lib/foto";

export const dynamic = "force-dynamic";
export const revalidate = 0;

/* Uma busca que desiste no prazo: o serviço de imagem, frio, pode levar
   segundos, e o favicon não pode segurar a aba. Erro vira nulo. */
async function buscarComPrazo(url: string, prazoMs: number): Promise<Response | null> {
  const controle = new AbortController();
  const limite = setTimeout(() => controle.abort(), prazoMs);
  try {
    return await fetch(url, { cache: "no-store", signal: controle.signal });
  } catch {
    return null;
  } finally {
    clearTimeout(limite);
  }
}

export async function GET(_request: NextRequest, context: { params: Promise<{ slug: string }> }) {
  const params = await context.params;
  /* O link no <head> vem com ?v=<updated_at> do perfil. Se a versao veio, a
     resposta e imutavel: trocar o favicon muda o updated_at, muda a URL e o
     navegador busca de novo na hora. Sem versao caimos no no-store. */
  const temVersao = Boolean(new URL(_request.url).searchParams.get("v"));
  const slug = String(params.slug || "").trim();
  if (!slug) return NextResponse.redirect(new URL("/favicon.ico", _request.url), 307);

  try {
    const supabase = getSupabaseClient();
    const { data: profile } = await supabase
      .from("profiles")
      .select("catalog_favicon_url,catalog_logo_url,logo_url")
      .eq("slug", slug)
      .single();

    const target = String(
      profile?.catalog_favicon_url || profile?.catalog_logo_url || profile?.logo_url || ""
    ).trim();

    if (!target || !/^https?:\/\//i.test(target)) {
      return NextResponse.redirect(new URL("/favicon.ico", _request.url), 307);
    }

    /* O logo original chegava inteiro (2,2 MB numa loja), e o navegador pede
       o favicon em toda página. A transformação devolve 128 px. Se ela
       falhar ou demorar, vale o arquivo original DA LOJA; o ícone do Ktalogu
       é o último recurso, e só quando a loja não tem nada que sirva. */
    const pequeno = miniatura(target, 128, 80);
    let upstream = pequeno !== target ? await buscarComPrazo(pequeno, 4000) : null;
    if (!upstream || !upstream.ok) upstream = await buscarComPrazo(target, 8000);
    if (!upstream || !upstream.ok) {
      return NextResponse.redirect(new URL("/favicon.ico", _request.url), 307);
    }

    const body = await upstream.arrayBuffer();
    const contentType = upstream.headers.get("content-type") || "image/x-icon";

    return new NextResponse(body, {
      status: 200,
      headers: {
        "content-type": contentType,
        "cache-control": temVersao
          ? "public, max-age=31536000, immutable"
          : "no-store, no-cache, must-revalidate, max-age=0",
      },
    });
  } catch {
    return NextResponse.redirect(new URL("/favicon.ico", _request.url), 307);
  }
}
