import { NextResponse } from "next/server";
import { createAdminClient } from "@/lib/supabase-admin";
import { carregarLoja } from "@/lib/loja/dados-da-loja";
import { lerVisaoDaLoja } from "@/lib/loja/visao.server";
import { estaEsgotado } from "@/lib/loja/regras-da-loja";

/**
 * Sugestões da busca da loja.
 *
 * Devolve poucos produtos, com o mínimo para desenhar uma linha: nome, foto e
 * preço. Existe para o campo de busca responder enquanto a pessoa digita, sem
 * carregar o catálogo inteiro no navegador — o que numa loja de mil produtos
 * seria megabytes por visita.
 *
 * Respeita quem está olhando: sem preço para quem a regra da loja não deixa
 * ver, e nada para quem ainda não entrou numa loja fechada para clientes.
 */

function semAcento(texto: string) {
  return String(texto || "")
    .normalize("NFD")
    .replace(/[̀-ͯ]/g, "")
    .toLowerCase()
    .trim();
}

export const dynamic = "force-dynamic";

export async function GET(request: Request) {
  const { searchParams } = new URL(request.url);
  const slug = String(searchParams.get("slug") || "").trim().toLowerCase();
  const termo = semAcento(searchParams.get("q") || "");
  if (!slug || termo.length < 2) return NextResponse.json({ produtos: [] });

  try {
    const dados = await carregarLoja(slug);
    const dono = String(dados?.profile?.id || "");
    if (!dados || !dono) return NextResponse.json({ produtos: [] });
    const { visao } = await lerVisaoDaLoja(slug, dados.profile);
    if (visao.exigeLoginNaLoja || visao.lojaFechada) return NextResponse.json({ produtos: [] });

    const admin = createAdminClient();
    const { data } = await admin
      .from("products")
      .select("id,name,image_url,price,price_on_request,unit_type,stock,track_inventory,allow_negative_stock,product_images(image_url,is_primary),product_price_tiers(min_qty,unit_price,active)")
      .eq("user_id", dono)
      .eq("active", true)
      .eq("show_in_catalog", true)
      .ilike("name", `%${searchParams.get("q")}%`)
      .limit(8);

    /* Estoque v2: as marcas da vitrine (a mesma conta do banco) valem aqui. */
    const daVitrine = new Map(
      ((dados.products || []) as Array<Record<string, unknown>>).map((produto) => [String(produto.id), produto])
    );
    const linhas = ((data as Array<Record<string, unknown>> | null) || []).map((linha) => {
      const marcado = daVitrine.get(String(linha.id));
      return marcado?.estoque_v2
        ? { ...linha, estoque_v2: true, estoque_v2_limita: marcado.estoque_v2_limita, estoque_v2_esgotado: marcado.estoque_v2_esgotado }
        : linha;
    }).filter(
      (linha) => !(visao.regras.esgotado === "hide" && estaEsgotado(linha))
    );
    const produtos = linhas.map((linha) => {
      const imagens = (linha.product_images as Array<{ image_url?: string; is_primary?: boolean }> | null) || [];
      const principal = imagens.find((i) => i?.is_primary) || imagens[0];
      const semPreco = !visao.mostrarPreco;
      return {
        id: String(linha.id),
        name: String(linha.name || ""),
        image_url: principal?.image_url || (linha.image_url as string | null) || null,
        price: semPreco ? 0 : Number(linha.price) || 0,
        price_on_request: semPreco ? true : linha.price_on_request === true,
        unit_type: (linha.unit_type as string | null) || "unit",
        product_price_tiers: semPreco ? [] : (linha.product_price_tiers as unknown[] | null) || [],
      };
    });

    return NextResponse.json({ produtos, texto_sem_preco: visao.textoNoLugarDoPreco });
  } catch {
    /* Sugestão é conforto: falhando, o campo continua levando à página de
       resultados, que é o caminho que sempre funciona. */
    return NextResponse.json({ produtos: [] });
  }
}
