import { NextResponse } from "next/server";
import { acessoDoChat } from "@/lib/chats/acesso";
import { avisarConversa } from "@/lib/chats/aviso";
import { avisarLoja } from "@/lib/loja/avisar-loja";
import { createAdminClient } from "@/lib/supabase-server";

/*
  O estado do chat da loja virtual.

  Duas chaves diferentes, de propósito:

  - `store_chat_enabled` e configuracao: a loja tem ou nao o chat na vitrine.
    Fica em Catalogo > Personalizacao, junto do resto da aparencia da loja.
  - `store_chat_online` e o expediente: tem alguem atendendo agora. Offline nao
    tira o chat do ar — o cliente escreve do mesmo jeito e a loja responde
    quando voltar. Esconder o balao mandaria a pessoa para o WhatsApp.
*/

async function lojaDoAcesso(admin: ReturnType<typeof createAdminClient>, tenantIds: string[]) {
  const { data } = await admin
    .from("profiles")
    .select("id,slug,store_chat_enabled,store_chat_online,store_chat_welcome,store_chat_welcome_enabled")
    .in("id", tenantIds)
    .not("slug", "is", null)
    .maybeSingle();
  return (
    (data as {
      id: string;
      slug?: string;
      store_chat_enabled?: boolean;
      store_chat_online?: boolean;
      store_chat_welcome?: string | null;
      store_chat_welcome_enabled?: boolean;
    } | null) || null
  );
}

export async function GET() {
  const acesso = await acessoDoChat();
  if ("erro" in acesso) return acesso.erro;

  const admin = createAdminClient();
  const loja = await lojaDoAcesso(admin, acesso.tenantIds);

  return NextResponse.json({
    ok: true,
    lojaId: loja?.id || null,
    ligado: loja?.store_chat_enabled === true,
    online: loja?.store_chat_online === true,
    saudacaoLigada: loja?.store_chat_welcome_enabled === true,
    saudacao: loja?.store_chat_welcome || "",
    podeMudar: acesso.podeResponderLoja,
  });
}

export async function PATCH(request: Request) {
  const acesso = await acessoDoChat();
  if ("erro" in acesso) return acesso.erro;
  if (!acesso.podeResponderLoja) {
    return NextResponse.json({ error: "Sem permissao." }, { status: 403 });
  }

  const corpo = (await request.json().catch(() => null)) as
    | { online?: unknown; ligado?: unknown; saudacao?: unknown; saudacaoLigada?: unknown }
    | null;

  const admin = createAdminClient();
  const loja = await lojaDoAcesso(admin, acesso.tenantIds);
  if (!loja?.id) return NextResponse.json({ error: "Loja nao encontrada." }, { status: 404 });

  const mudancas: Record<string, boolean | string | null> = {};
  if (typeof corpo?.online === "boolean") mudancas.store_chat_online = corpo.online;
  if (typeof corpo?.ligado === "boolean") mudancas.store_chat_enabled = corpo.ligado;
  if (typeof corpo?.saudacaoLigada === "boolean") mudancas.store_chat_welcome_enabled = corpo.saudacaoLigada;
  if (typeof corpo?.saudacao === "string") {
    mudancas.store_chat_welcome = corpo.saudacao.trim().slice(0, 400) || null;
  }
  if (!Object.keys(mudancas).length) {
    return NextResponse.json({ error: "Nada para mudar." }, { status: 400 });
  }

  const { error } = await admin.from("profiles").update(mudancas).eq("id", loja.id);
  if (error) return NextResponse.json({ error: error.message }, { status: 400 });

  /* A loja guarda o perfil por dois minutos: sem o aviso, ligar o chat aqui
     só fazia o balão aparecer na vitrine depois desse prazo. */
  avisarLoja(loja.id, request);

  /* Quem esta com a loja aberta ve a bolinha mudar na hora: sem isso o cliente
     continuaria vendo "offline" depois de a loja voltar. */
  if (loja.slug && typeof mudancas.store_chat_online === "boolean") {
    await avisarConversa([`loja-${loja.slug}`], {
      threadId: `presenca-${loja.slug}`,
      autor: "system",
      resumo: mudancas.store_chat_online === true ? "online" : "offline",
    });
  }

  return NextResponse.json({
    ok: true,
    ligado: mudancas.store_chat_enabled ?? loja.store_chat_enabled === true,
    online: mudancas.store_chat_online ?? loja.store_chat_online === true,
    saudacaoLigada: mudancas.store_chat_welcome_enabled ?? loja.store_chat_welcome_enabled === true,
    saudacao: mudancas.store_chat_welcome ?? loja.store_chat_welcome ?? "",
  });
}
