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 GET(req: Request) {
  try {
    const supabase = await createRouteClient();
    const {
      data: { user },
    } = await supabase.auth.getUser();
    if (!user) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

    const url = new URL(req.url);
    const teamId = url.searchParams.get("teamId");
    const manageable = await canManageWorkspace(user.id, teamId);
    if (!manageable) return NextResponse.json({ error: "Forbidden" }, { status: 403 });

    let query = supabase
      .from("integration_connections")
      .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"
      )
      .eq("provider", "notion")
      .order("created_at", { ascending: false });

    query = teamId ? query.eq("team_id", teamId) : query.is("team_id", null).eq("user_id", user.id);
    const { data, error } = await query;
    if (error) return NextResponse.json({ error: error.message }, { status: 400 });
    return NextResponse.json({ connections: data || [] });
  } catch (error) {
    logApiError("Notion integrations GET error:", error);
    return NextResponse.json({ error: "Failed to load Notion integrations" }, { status: 500 });
  }
}

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 manageable = await canManageWorkspace(user.id, teamId);
    if (!manageable) return NextResponse.json({ error: "Forbidden" }, { status: 403 });

    const token = typeof body.token === "string" ? body.token.trim() : "";
    const parentPageId = typeof body.parentPageId === "string" ? body.parentPageId.trim() : "";
    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])
          )
      : [];

    if (!token || !parentPageId) {
      return NextResponse.json(
        { error: "A Notion integration token and parent page id are required" },
        { status: 400 }
      );
    }

    if (eventTypes.length === 0) {
      return NextResponse.json({ error: "Choose at least one Notion event" }, { status: 400 });
    }

    const { data, error } = await supabase
      .from("integration_connections")
      .insert({
        user_id: user.id,
        team_id: teamId,
        provider: "notion",
        name: String(body.name || "Notion pages").trim() || "Notion pages",
        config: {
          parentPageId,
        },
        secret_encrypted: encryptSecret(token),
        event_types: eventTypes,
        is_active: body.isActive !== false,
      })
      .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("Notion integrations POST error:", error);
    return NextResponse.json({ error: "Failed to create Notion integration" }, { status: 500 });
  }
}
