import { logApiError } from "@/lib/api/security";
import { NextResponse } from "next/server";
import { canManageWorkspace } from "@/lib/developers/auth";
import {
  buildCalendarFeedUrl,
  createCalendarFeedToken,
  getCalendarFeedTokenPrefix,
  hashCalendarFeedToken,
} from "@/lib/integrations/calendar-feed";
import { createRouteClient } from "@/lib/supabase/route";

function getRequestOrigin(req: Request) {
  return process.env.NEXT_PUBLIC_APP_URL || new URL(req.url).origin;
}

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("calendar_feed_tokens")
      .select(
        "id, user_id, team_id, name, token_prefix, is_active, last_accessed_at, created_at, updated_at"
      )
      .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({ feeds: data || [] });
  } catch (error) {
    logApiError("Calendar feeds GET error:", error);
    return NextResponse.json({ error: "Failed to load calendar feeds" }, { 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 = createCalendarFeedToken();
    const { data, error } = await supabase
      .from("calendar_feed_tokens")
      .insert({
        user_id: user.id,
        team_id: teamId,
        name: String(body.name || "Workspace calendar").trim() || "Workspace calendar",
        token_prefix: getCalendarFeedTokenPrefix(token),
        token_hash: hashCalendarFeedToken(token),
        is_active: body.isActive !== false,
      })
      .select(
        "id, user_id, team_id, name, token_prefix, is_active, last_accessed_at, created_at, updated_at"
      )
      .single();

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

    return NextResponse.json({
      feed: data,
      feedUrl: buildCalendarFeedUrl(getRequestOrigin(req), token),
    });
  } catch (error) {
    logApiError("Calendar feeds POST error:", error);
    return NextResponse.json({ error: "Failed to create calendar feed" }, { status: 500 });
  }
}
