import { NextResponse } from "next/server";
import { acessoDoChat } from "@/lib/chats/acesso";
import { createAdminClient } from "@/lib/supabase-server";

/*
  A rota que a pessoa percorreu na loja.

  Responde a pergunta que o balcao sempre fez de cabeca e a loja online nunca
  soube: "de onde ela veio e o que olhou antes de perguntar isso?". Serve para
  quem esta na loja agora e tambem para quem ja falou — inclusive dentro da
  conversa de um pedido, quando da para reconhecer o mesmo navegador.
*/

const LIMITE_DE_PASSOS = 80;

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

export async function GET(request: Request) {
  const acesso = await acessoDoChat();
  if ("erro" in acesso) return acesso.erro;
  if (!acesso.podeVerLoja) return NextResponse.json({ ok: true, rota: [], resumo: null });

  const endereco = new URL(request.url);
  const conversaId = texto(endereco.searchParams.get("conversa"));
  let chave = texto(endereco.searchParams.get("chave"));

  const admin = createAdminClient();

  /*
    Da conversa para o navegador.

    Conversa de visitante ja carrega a chave. Conversa de pedido ou orcamento
    nao — ali a ponte e o cliente: se aquele navegador chegou a comprar, ele foi
    amarrado ao cadastro no checkout, e a rota da visita reaparece aqui.
  */
  if (!chave && conversaId) {
    const { data } = await admin
      .from("chat_threads")
      .select("visitor_key,client_id")
      .eq("id", conversaId)
      .in("user_id", acesso.tenantIds)
      .maybeSingle();

    const conversa = data as { visitor_key: string | null; client_id: string | null } | null;
    chave = texto(conversa?.visitor_key);

    if (!chave && conversa?.client_id) {
      const { data: visita } = await admin
        .from("store_visitor_pings")
        .select("visitor_key")
        .eq("client_id", conversa.client_id)
        .in("user_id", acesso.tenantIds)
        .order("last_seen_at", { ascending: false })
        .limit(1)
        .maybeSingle();
      chave = texto((visita as { visitor_key?: string } | null)?.visitor_key);
    }
  }

  if (!chave) return NextResponse.json({ ok: true, rota: [], resumo: null });

  const [presenca, passos] = await Promise.all([
    admin
      .from("store_visitor_pings")
      .select(
        "visitor_key,referrer,cart_items,cart_total,pings,first_seen_at,last_seen_at,page_title,product_name,product_price,product_image,product_id,client_id"
      )
      .eq("visitor_key", chave)
      .in("user_id", acesso.tenantIds)
      .maybeSingle(),
    admin
      .from("store_visitor_events")
      .select("id,kind,page_path,title,product_id,product_name,product_image,product_price,quantity,amount,detail,created_at")
      .eq("visitor_key", chave)
      .in("user_id", acesso.tenantIds)
      .order("created_at", { ascending: false })
      .limit(LIMITE_DE_PASSOS),
  ]);

  const visita = presenca.data as
    | {
        referrer: string | null;
        cart_items: number | null;
        cart_total: number | null;
        pings: number | null;
        first_seen_at: string;
        last_seen_at: string;
        product_id: string | null;
        product_image: string | null;
        client_id: string | null;
      }
    | null;

  const linhas = ((passos.data || []) as {
    id: string;
    kind: string;
    page_path: string | null;
    title: string | null;
    product_id: string | null;
    product_name: string | null;
    product_image: string | null;
    product_price: number | null;
    quantity: number | null;
    amount: number | null;
    detail: string | null;
    created_at: string;
  }[]).reverse();

  /* A foto do cadastro, e nao a que sobrou na tela do visitante. */
  const fotos = new Map<string, string>();
  const produtos = [...new Set(linhas.map((linha) => linha.product_id).filter(Boolean))] as string[];
  if (produtos.length) {
    const { data: cadastro } = await admin.from("products").select("id,image_url").in("id", produtos);
    ((cadastro || []) as { id: string; image_url: string | null }[]).forEach((produto) => {
      if (produto.image_url) fotos.set(produto.id, produto.image_url);
    });
  }

  const rota = linhas.map((linha) => ({
    id: linha.id,
    tipo: linha.kind,
    titulo: linha.title,
    caminho: linha.page_path,
    produtoId: linha.product_id,
    produto: linha.product_name,
    preco: linha.product_price,
    imagem: (linha.product_id && fotos.get(linha.product_id)) || linha.product_image || null,
    quantidade: linha.quantity,
    valor: linha.amount,
    detalhe: linha.detail,
    em: linha.created_at,
  }));

  const minutos = visita
    ? Math.max(1, Math.round((new Date(visita.last_seen_at).getTime() - new Date(visita.first_seen_at).getTime()) / 60000))
    : 0;

  return NextResponse.json({
    ok: true,
    chave,
    rota,
    resumo: visita
      ? {
          chegouPor: visita.referrer,
          minutos,
          paginas: Number(visita.pings || 0),
          carrinhoItens: Number(visita.cart_items || 0),
          carrinhoTotal: Number(visita.cart_total || 0),
          primeiraVez: visita.first_seen_at,
          ultimaVez: visita.last_seen_at,
          ehCliente: Boolean(visita.client_id),
        }
      : null,
  });
}
