import { NextResponse } from "next/server";
import { logApiError } from "@/lib/api/security";
import { createRouteClient } from "@/lib/supabase/route";
import { sql } from "@/lib/db/postgres";
import { canManageWorkspace } from "@/lib/developers/auth";
import { sendTestWebhookDelivery } from "@/lib/developers/webhooks";
import { createAdminClient } from "@/lib/supabase/admin";
import type { WebhookEndpoint, WebhookEventType } from "@/types";

export async function POST(
  req: Request,
  context: { params: Promise<{ id: string }> }
) {
  try {
    const supabase = await createRouteClient();
    const {
      data: { user },
    } = await supabase.auth.getUser();

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

    const { id } = await context.params;
    const { rows } = await sql`
      SELECT id, user_id, team_id, name, url, event_types, is_active, last_delivery_at, last_response_status, last_error, created_at, updated_at, signing_secret_encrypted
      FROM webhook_endpoints
      WHERE id = ${id}
    `;
    const endpoint = rows[0];

    if (!endpoint) {
      return NextResponse.json({ error: "Webhook not found" }, { status: 404 });
    }

    const manageable = await canManageWorkspace(user.id, (endpoint.team_id as string | null) || null);
    if (!manageable) {
      return NextResponse.json({ error: "Forbidden" }, { status: 403 });
    }

    const body = await req.json().catch(() => ({}));
    const eventType =
      typeof body.eventType === "string" ? (body.eventType as WebhookEventType) : undefined;

    // sendTestWebhookDelivery uses admin internally for webhook_deliveries writes
    const admin = createAdminClient();
    const result = await sendTestWebhookDelivery(
      admin,
      endpoint as unknown as WebhookEndpoint & { signing_secret_encrypted: string },
      { eventType }
    );

    return NextResponse.json({ success: true, ...result });
  } catch (error) {
    logApiError("Webhook test POST error", error);
    return NextResponse.json({ error: "Failed to send test webhook" }, { status: 500 });
  }
}
