import { logApiError } from "@/lib/api/security";
import { NextResponse } from "next/server";
import { createRouteClient } from "@/lib/supabase/route";
import { WEBHOOK_EVENT_VALUES } from "@/lib/developers/catalog";
import { canAccessWorkspace } from "@/lib/developers/auth";
import { emitWorkspaceWebhookEvent } from "@/lib/developers/webhooks";

export async function POST(req: Request) {
  try {
    const supabase = await createRouteClient();
    const {
      data: { user },
    } = await supabase.auth.getUser();

    if (!user) {
      return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
    }

    const body = await req.json();
    const teamId = typeof body.teamId === "string" && body.teamId ? body.teamId : null;
    const eventType = typeof body.eventType === "string" ? body.eventType : "";
    const data =
      body.data && typeof body.data === "object" && !Array.isArray(body.data)
        ? (body.data as Record<string, unknown>)
        : {};

    if (!WEBHOOK_EVENT_VALUES.includes(eventType as (typeof WEBHOOK_EVENT_VALUES)[number])) {
      return NextResponse.json({ error: "Unsupported webhook event" }, { status: 400 });
    }

    const accessible = await canAccessWorkspace(user.id, teamId);
    if (!accessible) {
      return NextResponse.json({ error: "Forbidden" }, { status: 403 });
    }

    const result = await emitWorkspaceWebhookEvent({
      userId: user.id,
      teamId,
      actorId: user.id,
      eventType: eventType as (typeof WEBHOOK_EVENT_VALUES)[number],
      data,
    });

    return NextResponse.json(result);
  } catch (error) {
    logApiError("Webhook emit error:", error);
    return NextResponse.json({ error: "Failed to emit webhook event" }, { status: 500 });
  }
}
