import { NextResponse } from "next/server";
import { getSupabaseClient } from "@/lib/supabase";

/*
  A loja como aplicativo no celular do cliente.

  Existe por um motivo prático antes de qualquer outro: no iPhone, aviso no
  aparelho só funciona para site instalado na tela de início — e instalar de
  verdade exige um manifesto. Sem ele, o balão da loja convidava a pessoa a
  "adicionar à Tela de Início" para ser avisada, ela adicionava, e o aviso
  nunca chegava.

  O manifesto é de cada loja, e não do Ktalogu: quem instala está instalando a
  Metra, com o nome, a cor e o ícone da Metra. Um app genérico do fornecedor na
  tela do cliente não faz sentido nenhum.
*/

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

function texto(valor: unknown) {
  return String(valor ?? "").trim();
}

export async function GET(request: Request, context: { params: Promise<{ slug: string }> }) {
  const { slug } = await context.params;
  const nomeDoSlug = texto(slug);
  if (!nomeDoSlug) return NextResponse.json({ error: "Loja inválida." }, { status: 404 });

  const supabase = getSupabaseClient();
  const { data } = await supabase
    .from("profiles")
    .select("catalog_name,store_name,catalog_favicon_url,catalog_logo_url,logo_url,primary_color,updated_at")
    .eq("slug", nomeDoSlug)
    .maybeSingle();

  const loja = data as
    | {
        catalog_name?: string | null;
        store_name?: string | null;
        catalog_favicon_url?: string | null;
        catalog_logo_url?: string | null;
        logo_url?: string | null;
        primary_color?: string | null;
        updated_at?: string | null;
      }
    | null;

  if (!loja) return NextResponse.json({ error: "Loja não encontrada." }, { status: 404 });

  const nome = texto(loja.catalog_name) || texto(loja.store_name) || "Loja";
  const cor = texto(loja.primary_color) || "#4F46E5";

  /*
    O ícone segue a mesma escada do favicon: o que a loja escolheu primeiro, e o
    símbolo do sistema como último recurso — quadrado vazio na tela de início é
    pior do que um ícone emprestado.

    A versão na URL vem do `updated_at` do perfil: trocou a logo, muda o
    endereço e o celular busca de novo em vez de servir a antiga por semanas.
  */
  const escolhido =
    [loja.catalog_favicon_url, loja.catalog_logo_url, loja.logo_url]
      .map((valor) => texto(valor))
      .find((valor) => valor.startsWith("http")) || null;

  const versao = texto(loja.updated_at).slice(0, 19);
  const icone = escolhido || new URL("/icon.png", request.url).toString();
  /* A loja sobe o que quiser: jpg, png, webp. Declarar o tipo errado faz o
     Android recusar o ícone e cair no genérico. */
  const extensao = (icone.split("?")[0].split(".").pop() || "png").toLowerCase();
  const tipo =
    extensao === "jpg" || extensao === "jpeg"
      ? "image/jpeg"
      : extensao === "webp"
        ? "image/webp"
        : extensao === "svg"
          ? "image/svg+xml"
          : "image/png";
  const enderecoDoIcone = `${icone}${icone.includes("?") ? "&" : "?"}v=${encodeURIComponent(versao)}`;

  return NextResponse.json(
    {
      name: nome,
      short_name: nome.slice(0, 12),
      description: `Loja online de ${nome}.`,
      start_url: `/${nomeDoSlug}`,
      scope: `/${nomeDoSlug}`,
      display: "standalone",
      background_color: "#ffffff",
      theme_color: cor,
      lang: "pt-BR",
      icons: [
        { src: enderecoDoIcone, sizes: "192x192", type: tipo },
        { src: enderecoDoIcone, sizes: "512x512", type: tipo },
      ],
    },
    {
      headers: {
        "content-type": "application/manifest+json; charset=utf-8",
        "cache-control": "public, max-age=300",
      },
    }
  );
}
