import type { Metadata } from "next";
import CatalogAnalyticsTracker from "@/components/CatalogAnalyticsTracker";
import { redirect } from "next/navigation";
import { getSupabaseClient } from "@/lib/supabase";
import { clienteDoServidor } from "@/lib/supabase-admin";
import { lerVisaoDaLoja, clienteParaAsTelas, enderecoDeLogin } from "@/lib/loja/visao.server";
import { semEsgotados, semPrecosNaLista, semPrecosNosStories } from "@/lib/loja/regras-da-loja";
import { notFound } from "next/navigation";
import StoreLayout from "@/components/StoreLayout";
import FontesDaLoja from "@/components/FontesDaLoja";
import { miniatura, produtoComFotoMenor, storiesComFotoMenor, TAMANHO } from "@/lib/foto";
import StoreContent from "@/components/StoreContent";
import { VendorShell } from "@/templates/vendor/VendorShell";
import { aparenciaDoVendor } from "@/templates/vendor/aparencia";
import { VendorHome } from "@/templates/vendor/VendorHome";
import { BoutiqueShell } from "@/templates/boutique/BoutiqueShell";
import { aparenciaDaBoutique } from "@/templates/boutique/aparencia";
import { BoutiqueListagem } from "@/templates/boutique/BoutiqueListagem";
import { buildCatalogMetadata } from "@/lib/catalog-metadata";
import { normalizeStoriesGroups } from "@/lib/catalog-stories";
import { resolveCatalogAppearance } from "@/lib/catalog-appearance";
import { ProvedorDaNavegacao } from "@/components/navegacao/ContextoDaNavegacao";
import { caracteristicasDe, carregarLoja } from "@/lib/loja/dados-da-loja";
import { comEstoqueV2 } from "@/lib/estoque-v2-da-loja.server";

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

type SearchPageParams = {
  params: Promise<{ slug: string }>;
  searchParams: Promise<{ search?: string | string[]; tema?: string | string[] }>;
};

function normalizeSearchValue(value: string | string[] | undefined) {
  if (Array.isArray(value)) return String(value[0] || "").trim();
  return String(value || "").trim();
}

export async function generateMetadata(props: SearchPageParams): Promise<Metadata> {
  const params = await props.params;
  const searchParams = await props.searchParams;
  const { slug } = params;
  const search = normalizeSearchValue(searchParams.search);
  const supabase = getSupabaseClient();

  const { data: profile } = await supabase
    .from("profiles")
    .select("id,slug,updated_at,catalog_name,store_name,logo_url,catalog_logo_url,catalog_meta_title,catalog_meta_description,catalog_meta_keywords,catalog_og_title,catalog_og_description,catalog_og_image_url,catalog_favicon_url,catalog_noindex,catalog_twitter_handle,catalog_access_mode,catalog_status")
    .eq("slug", slug)
    .single();

  if (!profile) {
    return { title: "Loja" };
  }

  const baseTitle = profile.catalog_name || profile.store_name || "Loja";
  const pageTitle = search ? `Busca: ${search} | ${baseTitle}` : baseTitle;

  return buildCatalogMetadata({
    profile,
    pageTitle,
    pageDescription: search
      ? `Veja os resultados da busca por ${search} em ${baseTitle}.`
      : `Explore os produtos de ${baseTitle}.`,
    path: `/buscar?search=${encodeURIComponent(search)}`,
  });
}

export default async function StoreSearchPage(props: SearchPageParams) {
  const params = await props.params;
  const searchParams = await props.searchParams;
  const { slug } = params;
  const search = normalizeSearchValue(searchParams.search);
  /* Pelo servidor (chave de servico): o visitante nao le produto pela API. */
  const supabase = clienteDoServidor();

  if (!search) {
    redirect(`/${slug}`);
  }

  const { data: profile } = await supabase
    .from("profiles")
    .select("*")
    .eq("slug", slug)
    .single();

  if (!profile) {
    return notFound();
  }

  /* Quem esta olhando e o que as regras da loja deixam ver. */
  const { visao, cliente: clienteDoPortal } = await lerVisaoDaLoja(slug, profile);
  if (visao.lojaFechada) redirect(`/${slug}`);
  if (visao.exigeLoginNaLoja) redirect(enderecoDeLogin(slug, `/${slug}/buscar?search=${encodeURIComponent(search)}`));
  const semPreco = !visao.mostrarPreco;

  let { data: rawProducts, error: rawProductsError } = await supabase
    .from("products")
    .select("*, product_attributes(id,show_in_store), product_price_tiers(min_qty,max_qty,unit_price,sort_order,active)")
    .eq("user_id", profile.id)
    .eq("active", true)
    .eq("show_in_catalog", true)
    .order("catalog_position", { ascending: true, nullsFirst: false })
    .order("created_at", { ascending: false });

  if (rawProductsError) {
    const message = String((rawProductsError as { message?: unknown } | null)?.message ?? "").toLowerCase();
    if (message.includes("product_price_tiers")) {
      const fallback = await supabase
        .from("products")
        .select("*, product_attributes(id,show_in_store)")
        .eq("user_id", profile.id)
        .eq("active", true)
        .eq("show_in_catalog", true)
        .order("catalog_position", { ascending: true, nullsFirst: false })
        .order("created_at", { ascending: false });
      rawProducts = fallback.data;
      rawProductsError = fallback.error;
    }
  }

  /* Estoque v2: "Esgotado" pela conta do banco (fora do v2, lista intacta). */
  rawProducts = await comEstoqueV2(supabase, String(profile.id), rawProducts || []);
  const listaDaBusca = visao.regras.esgotado === "hide" ? semEsgotados(rawProducts) : rawProducts;
  const products = (semPreco ? semPrecosNaLista(listaDaBusca) : listaDaBusca)?.map((product) => ({
    ...product,
    has_variations:
      Array.isArray(product.product_attributes) &&
      product.product_attributes.some((atributo: { show_in_store?: boolean | null }) => atributo?.show_in_store !== false),
  })).map((p) => produtoComFotoMenor(p, TAMANHO.card)) || [];

  const { data: categories } = await supabase
    .from("categories")
    .select("id, name, slug, is_visible, parent_id")
    .eq("user_id", profile.id)
    .eq("is_visible", true)
    .order("name", { ascending: true });

  /* O menu e o rodapé publicados no editor, da lembrança da loja (null =
     os de sempre; erro de leitura também). */
  const lojaLembrada = await carregarLoja(slug).catch(() => null);
  const navegacao = lojaLembrada?.navegacao ?? null;

  const selectedAnnouncementCoupon = profile.catalog_announcement_coupon_id
    ? await supabase
        .from("catalog_coupons")
        .select("id,code,type,value,active,starts_at,ends_at")
        .eq("id", profile.catalog_announcement_coupon_id)
        .eq("user_id", profile.id)
        .maybeSingle()
        .then((res) => res.data)
    : null;

  const infoStripEnabledRaw = (profile as { catalog_info_strip_enabled?: boolean | null } | null)?.catalog_info_strip_enabled;
  const infoStripEnabled = infoStripEnabledRaw === null || infoStripEnabledRaw === undefined ? true : Boolean(infoStripEnabledRaw);
  const infoStripItemsRaw = (profile as { catalog_info_strip_items?: unknown } | null)?.catalog_info_strip_items;
  const infoStripItems = Array.isArray(infoStripItemsRaw)
    ? (infoStripItemsRaw as Array<{ icon?: unknown; title?: unknown; subtitle?: unknown }>).map((item) => ({
        icon: typeof item?.icon === "string" ? item.icon : "truck",
        title: typeof item?.title === "string" ? item.title : "",
        subtitle: typeof item?.subtitle === "string" ? item.subtitle : "",
      }))
    : [];

  const { data: storiesGroupsData } = await supabase
    .from("catalog_story_groups")
    .select("id,title,thumbnail_url,position,items:catalog_story_items(id,image_url,product_id,position,product:products(id,name,price,price_on_request,image_url))")
    .eq("user_id", profile.id)
    .eq("active", true)
    .order("position", { ascending: true });

  const primaryColor = profile.primary_color || "#4F46E5";
  const storeName = profile.catalog_name || profile.store_name || "Loja";
  const logoUrl = miniatura(profile.catalog_logo_url || profile.logo_url, TAMANHO.logo);
  const storiesGroups = storiesComFotoMenor(
    normalizeStoriesGroups(semPreco ? semPrecosNosStories(storiesGroupsData || []) : storiesGroupsData)
  );

  /* A busca do Vendor filtra aqui: o outro template faz isso dentro da tela,
     e o Vendor desenha uma grade só. Sem acento e sem caixa, porque ninguém
     digita "adesivo" com til no lugar certo. */
  const semAcento = (texto: string) =>
    String(texto || "")
      .normalize("NFD")
      .replace(/[̀-ͯ]/g, "")
      .toLowerCase()
      .trim();
  const termoBuscado = semAcento(search || "");
  const produtosEncontrados = termoBuscado
    ? (products as Array<{ name?: string | null; description?: string | null }>).filter((produto) =>
        semAcento(`${produto.name || ""} ${produto.description || ""}`).includes(termoBuscado)
      )
    : products;

  /* `?tema=` só existe fora de produção, como na home e no produto: abre a
     MESMA busca em outro template para comparar lado a lado. Na loja
     publicada vale o perfil. */
  const temaPedido = normalizeSearchValue(searchParams.tema);
  const temaDaPagina =
    process.env.NODE_ENV !== "production" && ["vendor", "vitrine", "default", "boutique"].includes(temaPedido)
      ? temaPedido
      : profile.catalog_theme;

  /* A Boutique tem a árvore dela (templates/boutique), com a mesma conta do
     Vendor. Diferente do Vendor, passa quem está logado ao shell (lacuna
     1.6.3 do PARIDADE). */
  if (temaDaPagina === "boutique") {
    return (
      <StoreLayout
        primaryColor={primaryColor}
        whatsappNumber={profile.whatsapp}
        cartScope={profile.id || slug}
        storeSlug={slug}
        theme={temaDaPagina}
        chatLigado={profile.store_chat_enabled === true}
        visao={visao}
      >
        <FontesDaLoja perfil={profile} />
        <>
        <CatalogAnalyticsTracker slug={slug} eventName="page_view" onceKey={`page_view:busca:${termoBuscado}`} />
        <CatalogAnalyticsTracker
          slug={slug}
          eventName="search"
          searchTerm={termoBuscado}
          onceKey={`search:${termoBuscado}`}
          meta={{ results_count: produtosEncontrados.length }}
        />
        <ProvedorDaNavegacao navegacao={navegacao}>
        <BoutiqueShell
          slug={slug}
          nomeDaLoja={storeName}
          slogan={profile.catalog_slogan}
          logoUrl={logoUrl}
          corDaMarca={primaryColor}
          aparencia={aparenciaDaBoutique(profile as never)}
          cupomDoAviso={selectedAnnouncementCoupon as never}
          whatsappFlutuante={profile.catalog_whatsapp_float}
          categorias={(categories || []) as never[]}
          contato={{
            whatsapp: profile.whatsapp,
            telefone: profile.company_phone || profile.phone,
            email: profile.email,
            endereco: profile.catalog_footer_address || profile.address,
            cnpj: profile.catalog_show_document ? profile.cnpj : null,
            instagram: profile.social_instagram,
            facebook: profile.social_facebook,
          }}
          clienteLogado={Boolean(clienteDoPortal)}
        >
          {/* A busca usa a mesma listagem da categoria, com o termo. */}
          <BoutiqueListagem
            slug={slug}
            produtos={produtosEncontrados as never[]}
            categorias={(categories || []) as never[]}
            titulo={search ? `Resultados para "${search}"` : "Buscar produtos"}
            termoBuscado={search || ""}
            clienteId={clienteDoPortal?.id || null}
            favoritos={clienteDoPortal?.favorites || null}
            corDaMarca={primaryColor}
            /* Os rótulos das opções (Cor, Tamanho), da lembrança da loja: a
               busca lê os produtos sem eles. */
            caracteristicas={caracteristicasDe(lojaLembrada?.caracteristicas, produtosEncontrados as Array<{ id?: string }>)}
          />
        </BoutiqueShell>
        </ProvedorDaNavegacao>
        </>
      </StoreLayout>
    );
  }

  if (temaDaPagina === "vendor") {
    return (
      <StoreLayout
        primaryColor={primaryColor}
        whatsappNumber={profile.whatsapp}
        cartScope={profile.id || slug}
        storeSlug={slug}
        theme={temaDaPagina}
        chatLigado={profile.store_chat_enabled === true}
        visao={visao}
      >
        <FontesDaLoja perfil={profile} />
        <>
        <CatalogAnalyticsTracker slug={slug} eventName="page_view" onceKey={`page_view:busca:${termoBuscado}`} />
        <CatalogAnalyticsTracker
          slug={slug}
          eventName="search"
          searchTerm={termoBuscado}
          onceKey={`search:${termoBuscado}`}
          meta={{ results_count: produtosEncontrados.length }}
        />
        <ProvedorDaNavegacao navegacao={navegacao}>
        <VendorShell
          slug={slug}
          nomeDaLoja={storeName}
          slogan={profile.catalog_slogan}
          logoUrl={logoUrl}
          corDaMarca={primaryColor}
          aparencia={aparenciaDoVendor(profile as never)}
          cupomDoAviso={selectedAnnouncementCoupon as never}
          whatsappFlutuante={profile.catalog_whatsapp_float}
          categorias={(categories || []) as never[]}
          contato={{
            whatsapp: profile.whatsapp,
            telefone: profile.company_phone || profile.phone,
            email: profile.email,
            endereco: profile.catalog_footer_address || profile.address,
            cnpj: profile.catalog_show_document ? profile.cnpj : null,
            instagram: profile.social_instagram,
            facebook: profile.social_facebook,
          }}
        >
          <VendorHome
            slug={slug}
            produtos={produtosEncontrados as never[]}
            categorias={(categories || []) as never[]}
            banners={[]}
            avaliacoes={[]}
            mediaDasAvaliacoes={0}
            nomeDaLoja={storeName}
            logoUrl={logoUrl}
            tituloDaPagina={search ? `Resultados para "${search}"` : "Buscar produtos"}
            subtitulo={`${produtosEncontrados.length} ${produtosEncontrados.length === 1 ? "produto encontrado" : "produtos encontrados"}`}
            clienteId={clienteDoPortal?.id || null}
            favoritos={clienteDoPortal?.favorites || null}
            provaSocial={{
              ligado: profile.catalog_social_proof_enabled,
              intervaloSegundos: profile.catalog_social_proof_interval_seconds,
              duracaoSegundos: profile.catalog_social_proof_duration_seconds,
              quantosCabem: profile.catalog_social_proof_max_visible,
              posicao: profile.catalog_social_proof_position,
            }}
          />
        </VendorShell>
        </ProvedorDaNavegacao>
        </>
      </StoreLayout>
    );
  }

  /* As mesmas cores e fontes da home: sem isso o cabeçalho cai na cor da marca. */
  const aparencia = resolveCatalogAppearance(profile);

  return (
    <StoreLayout
      primaryColor={primaryColor}
      whatsappNumber={profile.whatsapp}
      cartScope={profile.id || slug}
      storeSlug={slug}
      theme={temaDaPagina}
      chatLigado={profile.store_chat_enabled === true}
      visao={visao}
    >
      <FontesDaLoja perfil={profile} />
      <ProvedorDaNavegacao navegacao={navegacao}>
      <StoreContent
        loggedClient={clienteParaAsTelas(clienteDoPortal)}
        products={products}
        categories={categories || []}
        banners={[]}
        sections={[]}
        slideEnabled={false}
        infoStripEnabled={infoStripEnabled}
        infoStripItems={infoStripItems}
        slug={slug}
        primaryColor={primaryColor}
        storeName={storeName}
        storeSlogan={profile.catalog_slogan}
        logoUrl={logoUrl}
        showStoreNameInHeader={profile.catalog_show_name_in_header}
        showStoreSloganInHeader={profile.catalog_show_slogan_in_header}
        storeNameColor={profile.catalog_name_color}
        storeSloganColor={profile.catalog_slogan_color}
        catalogHeaderIconColor={profile.catalog_header_icon_color}
        logoEffectEnabled={profile.catalog_logo_effect_enabled}
        logoEffectType={profile.catalog_logo_effect}
        logoEffectSpeed={profile.catalog_logo_effect_speed}
        logoEffectIntensity={profile.catalog_logo_effect_intensity}
        whatsapp={profile.whatsapp}
        whatsappFloat={profile.catalog_whatsapp_float}
        phone={profile.phone}
        companyPhone={profile.company_phone}
        companyWhatsapp={profile.company_whatsapp}
        address={profile.address}
        cnpj={profile.cnpj}
        catalogShowDocument={profile.catalog_show_document}
        headerColor={aparencia.headerColor}
        headerTextColor={aparencia.headerTextColor}
        menuColor={aparencia.menuColor}
        menuTextColor={aparencia.menuTextColor}
        pageBgColor={aparencia.pageBgColor}
        cardButtonColor={aparencia.cardButtonColor}
        fontHeadingFamily={aparencia.fonts.heading}
        fontBodyFamily={aparencia.fonts.body}
        footerColor={profile.catalog_footer_color}
        footerTextColor={profile.catalog_footer_text_color}
        socialFacebook={profile.social_facebook}
        socialInstagram={profile.social_instagram}
        socialTwitter={profile.social_twitter}
        socialLinkedin={profile.social_linkedin}
        socialYoutube={profile.social_youtube}
        companySocialFacebook={profile.social_facebook}
        companySocialInstagram={profile.social_instagram}
        companySocialTwitter={profile.social_twitter}
        companySocialLinkedin={profile.social_linkedin}
        companySocialYoutube={profile.social_youtube}
        announcementEnabled={profile.catalog_announcement_enabled}
        announcementText={profile.catalog_announcement_text}
        announcementCountdownEnabled={profile.catalog_announcement_countdown_enabled}
        announcementCountdownEndAt={profile.catalog_announcement_countdown_end_at}
        announcementShowCouponBadge={profile.catalog_announcement_show_coupon_badge}
        announcementCouponBadgeColor={profile.catalog_announcement_coupon_badge_color}
        announcementBackgroundColor={profile.catalog_announcement_background_color}
        announcementTextColor={profile.catalog_announcement_text_color}
        announcementButtonLabel={profile.catalog_announcement_button_label}
        announcementButtonUrl={profile.catalog_announcement_button_url}
        announcementSticky={profile.catalog_announcement_sticky}
        announcementCoupon={selectedAnnouncementCoupon as any}
        announcementCouponId={profile.catalog_announcement_coupon_id}
        vitrineProductLayout={profile.catalog_vitrine_product_layout}
        hideSections
        productsHeading={`Resultados para "${search}"`}
        storiesGroups={storiesGroups}
        catalogStoriesEnabled={profile.catalog_stories_enabled ?? true}
      />
      </ProvedorDaNavegacao>
    </StoreLayout>
  );
}
