import { NextResponse } from "next/server";
import { getSessionUser } from "@/lib/auth/get-session-user";
import { ensureProjectForOAuth } from "@/lib/db/assert-project";
import { getMetaConfig, getMetaRedirectUri } from "@/lib/env";
import { logAutoPost } from "@/lib/logging/auto-post-logger";
import { createOAuthState, setOAuthCookies } from "@/lib/social/oauth-cookies";
import { buildMetaAuthUrl } from "@/lib/social/meta-oauth";
import { metaScopesErrorMessage } from "@/lib/social/meta-scopes";

const PREFIX = "meta";

export async function GET(request: Request) {
  try {
    const user = await getSessionUser();
    if (!user) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

    const { searchParams } = new URL(request.url);
    const projectId = searchParams.get("projectId");
    const platform = searchParams.get("platform") as "facebook" | "instagram" | null;
    const returnTo = searchParams.get("return") ?? "/connected-accounts";

    if (!projectId) {
      return NextResponse.json({ error: "projectId is required" }, { status: 400 });
    }
    if (platform !== "facebook" && platform !== "instagram") {
      return NextResponse.json({ error: "platform must be facebook or instagram" }, { status: 400 });
    }

    await ensureProjectForOAuth({
      projectId,
      userId: user.id,
      email: user.email,
      name: user.name,
    });

    const meta = getMetaConfig();
    const scopeValidation =
      platform === "instagram" ? meta.instagramScopeValidation : meta.facebookScopeValidation;
    const scopeError = metaScopesErrorMessage(scopeValidation);
    if (scopeError) {
      return NextResponse.json(
        {
          error: scopeError,
          code: "META_SCOPES_MISCONFIGURED",
          scopes: scopeValidation.scopes,
        },
        { status: 400 },
      );
    }

    const state = createOAuthState();
    const redirectUri = getMetaRedirectUri(platform);
    const url = buildMetaAuthUrl(state, platform);
    const response = NextResponse.redirect(url);
    setOAuthCookies(response, PREFIX, { state, projectId, platform, returnTo, redirectUri });

    await logAutoPost({
      level: "INFO",
      event: "oauth_connect_started",
      projectId,
      providerId: platform,
      status: "oauth_redirect",
      message: `Redirecting to Meta OAuth for ${platform}.`,
      details: { redirectUri, note: "Instagram uses Meta/Facebook login by design." },
    });

    return response;
  } catch (error) {
    const message = error instanceof Error ? error.message : "Meta OAuth failed";
    return NextResponse.json({ error: message }, { status: 500 });
  }
}
