import { NextResponse } from "next/server";
import { createClient } from "@/lib/supabase-server";
import { getCompanyContext } from "@/lib/company-context";

/**
 * Registro e baixa de um aparelho para receber avisos.
 *
 * Guarda a assinatura que o proprio navegador gera. Nao ha provedor no meio:
 * notificacao na web e padrao aberto, entregue pelo servico do proprio
 * navegador, com um par de chaves nosso. Sem cadastro, sem teto de
 * assinantes, sem terceiro vendo quem sao os usuarios.
 */

type Assinatura = {
  endpoint?: unknown;
  keys?: { p256dh?: unknown; auth?: unknown };
};

export async function POST(req: Request) {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) return NextResponse.json({ error: "Nao autenticado." }, { status: 401 });

  const corpo = (await req.json().catch(() => null)) as
    | { assinatura?: Assinatura; user_agent?: unknown }
    | null;

  const endpoint = String(corpo?.assinatura?.endpoint ?? "");
  const p256dh = String(corpo?.assinatura?.keys?.p256dh ?? "");
  const auth = String(corpo?.assinatura?.keys?.auth ?? "");

  if (!endpoint.startsWith("https://") || !p256dh || !auth) {
    return NextResponse.json({ error: "Assinatura inválida." }, { status: 400 });
  }

  const ctx = await getCompanyContext(supabase, user);
  const companyId = ctx.tenantIds?.[0] ?? user.id;

  /* O endpoint e unico: reinstalar o app no mesmo aparelho gera outro, e o
     antigo morre sozinho quando o envio falhar. Regravar em cima evita
     duplicata quando o navegador devolve o mesmo. */
  const { error } = await supabase.from("push_subscriptions").upsert(
    {
      user_id: user.id,
      company_id: companyId,
      endpoint,
      p256dh,
      auth,
      user_agent: String(corpo?.user_agent ?? "").slice(0, 300) || null,
      failures: 0,
    },
    { onConflict: "endpoint" }
  );

  if (error) {
    return NextResponse.json({ error: "Não foi possível ativar os avisos." }, { status: 400 });
  }
  return NextResponse.json({ ok: true });
}

export async function DELETE(req: Request) {
  const supabase = await createClient();
  const {
    data: { user },
  } = await supabase.auth.getUser();
  if (!user) return NextResponse.json({ error: "Nao autenticado." }, { status: 401 });

  const endpoint = String(new URL(req.url).searchParams.get("endpoint") || "");
  if (!endpoint) return NextResponse.json({ error: "Aparelho não informado." }, { status: 400 });

  await supabase.from("push_subscriptions").delete().eq("endpoint", endpoint);
  return NextResponse.json({ ok: true });
}
