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

/*
  Os números do atendimento.

  Um só importa de verdade: quanto tempo a loja demora para responder a primeira
  mensagem. Quem espera meia hora já perguntou em outro lugar — e nenhuma
  conversa bonita salva uma resposta que chegou depois da decisão.

  Os outros dois dão o tamanho da coisa: quantas conversas começaram e quantas
  ficaram sem resposta nenhuma. O período é de 30 dias, que é onde dá para
  reconhecer o próprio mês.
*/

const DIAS = 30;

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

  const admin = createAdminClient();
  const desde = new Date(Date.now() - DIAS * 24 * 60 * 60 * 1000).toISOString();

  const { data: conversas } = await admin
    .from("chat_threads")
    .select("id,created_at")
    .in("kind", ["visitor", "order", "quote", "client"])
    .in("user_id", acesso.tenantIds)
    .gte("created_at", desde)
    .order("created_at", { ascending: false })
    .limit(400);

  const linhas = (conversas || []) as { id: string; created_at: string }[];
  if (!linhas.length) {
    return NextResponse.json({
      ok: true,
      relatorio: { conversas: 0, respondidas: 0, semResposta: 0, minutosMedios: null, dias: DIAS },
    });
  }

  const ids = linhas.map((linha) => linha.id);

  /*
    A primeira fala de cada lado.

    Buscar as duas pontas de uma vez e cruzar aqui sai mais barato do que uma
    consulta por conversa — e com quatrocentas conversas a diferença é a de uma
    tela que abre e uma que trava.
  */
  const { data: mensagens } = await admin
    .from("chat_messages")
    .select("thread_id,author_type,created_at")
    .in("thread_id", ids)
    .is("deleted_at", null)
    .eq("internal", false)
    .order("created_at", { ascending: true })
    .limit(4000);

  const primeiraDoCliente = new Map<string, string>();
  const primeiraDaLoja = new Map<string, string>();

  ((mensagens || []) as { thread_id: string; author_type: string; created_at: string }[]).forEach((mensagem) => {
    const mapa = mensagem.author_type === "client" ? primeiraDoCliente : primeiraDaLoja;
    if (!mapa.has(mensagem.thread_id)) mapa.set(mensagem.thread_id, mensagem.created_at);
  });

  let somaDeMinutos = 0;
  let respondidas = 0;
  let semResposta = 0;

  primeiraDoCliente.forEach((perguntaEm, threadId) => {
    const respostaEm = primeiraDaLoja.get(threadId);
    /* Resposta anterior à pergunta é a loja que puxou conversa: ali não houve
       espera nenhuma, e contar isso como zero minuto mentiria para baixo. */
    if (!respostaEm || respostaEm < perguntaEm) {
      if (!respostaEm) semResposta += 1;
      return;
    }
    somaDeMinutos += (new Date(respostaEm).getTime() - new Date(perguntaEm).getTime()) / 60000;
    respondidas += 1;
  });

  return NextResponse.json({
    ok: true,
    relatorio: {
      conversas: linhas.length,
      respondidas,
      semResposta,
      minutosMedios: respondidas ? Math.round(somaDeMinutos / respondidas) : null,
      dias: DIAS,
    },
  });
}
