import { logApiError } from "@/lib/api/security";
import { NextResponse } from "next/server";
import { encryptSecret } from "@/lib/ai/crypto";
import { canManageWorkspace } from "@/lib/developers/auth";
import { SLACK_EVENT_VALUES } from "@/lib/integrations/catalog";
import { createRouteClient } from "@/lib/supabase/route";

export async function PATCH(
  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 { data: existing } = await supabase
      .from("integration_connections")
      .select("id, team_id, provider")
      .eq("id", id)
      .eq("provider", "slack")
      .maybeSingle();

    if (!existing) {
      return NextResponse.json({ error: "Slack integration not found" }, { status: 404 });
    }

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

    const body = await req.json();
    const eventTypes = Array.isArray(body.eventTypes)
      ? body.eventTypes
          .map((value: unknown) => String(value))
          .filter(
            (value: string): value is (typeof SLACK_EVENT_VALUES)[number] =>
              SLACK_EVENT_VALUES.includes(value as (typeof SLACK_EVENT_VALUES)[number])
          )
      : undefined;

    const webhookUrl =
      typeof body.webhookUrl === "string" && body.webhookUrl.trim()
        ? body.webhookUrl.trim()
        : null;

    const updates = {
      ...(typeof body.name === "string" ? { name: body.name.trim() || "Slack updates" } : {}),
      ...(Array.isArray(eventTypes) ? { event_types: eventTypes } : {}),
      ...(typeof body.isActive === "boolean" ? { is_active: body.isActive } : {}),
      ...(webhookUrl ? { secret_encrypted: encryptSecret(webhookUrl) } : {}),
    };

    const { data, error } = await supabase
      .from("integration_connections")
      .update(updates)
      .eq("id", id)
      .select(
        "id, user_id, team_id, provider, name, config, event_types, is_active, last_delivery_at, last_response_status, last_error, created_at, updated_at"
      )
      .single();

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

    return NextResponse.json({ connection: data });
  } catch (error) {
    logApiError("Slack integration PATCH error:", error);
    return NextResponse.json({ error: "Failed to update Slack integration" }, { status: 500 });
  }
}

export async function DELETE(
  _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 { data: existing } = await supabase
      .from("integration_connections")
      .select("id, team_id, provider")
      .eq("id", id)
      .eq("provider", "slack")
      .maybeSingle();

    if (!existing) {
      return NextResponse.json({ error: "Slack integration not found" }, { status: 404 });
    }

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

    const { error } = await supabase.from("integration_connections").delete().eq("id", id);
    if (error) {
      return NextResponse.json({ error: error.message }, { status: 400 });
    }

    return NextResponse.json({ success: true });
  } catch (error) {
    logApiError("Slack integration DELETE error:", error);
    return NextResponse.json({ error: "Failed to delete Slack integration" }, { status: 500 });
  }
}
