import { cookies } from "next/headers";
import { NextResponse } from "next/server";
import { createAdminClient } from "@/lib/supabase-admin";

/*
  Aparelho do cliente para receber aviso de mensagem.

  Guarda-se o endereco que o proprio navegador gera, e nada mais: nao ha como
  mandar aviso para quem nao apertou o botao, e apagar e so remover a linha.
*/

type SessionPayload = { client?: { id?: string } | null };

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

async function resolverSessao(slug: string) {
  const cookieStore = await cookies();
  const token = texto(cookieStore.get("ks_client_portal")?.value);
  if (!slug || !token) return null;

  const admin = createAdminClient();
  const sessao = await admin.rpc("client_portal_get_session", { p_slug: slug, p_session_token: token });
  const cliente = (sessao.data as SessionPayload | null)?.client || null;
  if (sessao.error || !cliente?.id) return null;

  const { data: perfil } = await admin.from("profiles").select("id").eq("slug", slug).maybeSingle();
  return { admin, clientId: String(cliente.id), tenantId: String((perfil as { id?: string } | null)?.id || "") };
}

export async function POST(request: Request) {
  const corpo = (await request.json().catch(() => null)) as
    | { slug?: unknown; assinatura?: { endpoint?: string; keys?: { p256dh?: string; auth?: string } }; user_agent?: unknown }
    | null;

  const slug = texto(corpo?.slug);
  const sessao = await resolverSessao(slug);
  if (!sessao) return NextResponse.json({ error: "Sessao invalida." }, { status: 401 });

  const endpoint = texto(corpo?.assinatura?.endpoint);
  const p256dh = texto(corpo?.assinatura?.keys?.p256dh);
  const auth = texto(corpo?.assinatura?.keys?.auth);
  if (!endpoint || !p256dh || !auth) {
    return NextResponse.json({ error: "Assinatura incompleta." }, { status: 400 });
  }

  const { error } = await sessao.admin.from("client_push_subscriptions").upsert(
    {
      client_id: sessao.clientId,
      user_id: sessao.tenantId,
      endpoint,
      p256dh,
      auth,
      user_agent: texto(corpo?.user_agent).slice(0, 300) || null,
      failures: 0,
    },
    { onConflict: "endpoint" }
  );

  if (error) return NextResponse.json({ error: error.message }, { status: 400 });
  return NextResponse.json({ ok: true });
}

export async function DELETE(request: Request) {
  const { searchParams } = new URL(request.url);
  const slug = texto(searchParams.get("slug"));
  const endpoint = texto(searchParams.get("endpoint"));

  const sessao = await resolverSessao(slug);
  if (!sessao) return NextResponse.json({ error: "Sessao invalida." }, { status: 401 });
  if (!endpoint) return NextResponse.json({ error: "Aparelho invalido." }, { status: 400 });

  await sessao.admin
    .from("client_push_subscriptions")
    .delete()
    .eq("endpoint", endpoint)
    .eq("client_id", sessao.clientId);

  return NextResponse.json({ ok: true });
}
