import { getSessionUser } from "@/lib/auth";
import {
  connectGoogleSearchConsole,
  verifyGoogleSearchConsoleOAuthState,
} from "@/lib/google-search-console";
import { isKavenixAdminEmail } from "@/lib/kavenix-admin";
import { resolveOriginFromHeaders } from "@/lib/mail-urls";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

function dashboardRedirect(request: Request, status: string) {
  const origin = resolveOriginFromHeaders(request.headers);
  return Response.redirect(new URL(`/kavenix?view=search&gsc=${status}`, `${origin}/`), 302);
}

export async function GET(request: Request) {
  const user = await getSessionUser();
  const requestUrl = new URL(request.url);
  const error = requestUrl.searchParams.get("error");
  const code = requestUrl.searchParams.get("code");
  const state = requestUrl.searchParams.get("state");

  if (!user || !isKavenixAdminEmail(user.email)) {
    return dashboardRedirect(request, "forbidden");
  }

  if (error || !code || !state) {
    return dashboardRedirect(request, "denied");
  }

  const verifiedState = verifyGoogleSearchConsoleOAuthState(state);

  if (!verifiedState || verifiedState.email !== user.email.trim().toLowerCase()) {
    return dashboardRedirect(request, "invalid-state");
  }

  try {
    const origin = resolveOriginFromHeaders(request.headers);
    const redirectUri = new URL("/api/integrations/google-search-console/callback", `${origin}/`).toString();
    await connectGoogleSearchConsole({
      accessCode: code,
      accountEmail: user.email,
      redirectUri,
    });

    return dashboardRedirect(request, "connected");
  } catch (connectionError) {
    const message = connectionError instanceof Error ? connectionError.message : "";
    return dashboardRedirect(request, message.includes("속성 권한") ? "site-access" : "connection-error");
  }
}
