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, returnTo: "blog" | "search" = "search") {
  const origin = resolveOriginFromHeaders(request.headers);
  const view = returnTo === "blog" ? "blog" : "search";
  return Response.redirect(new URL(`/kavenix?view=${view}&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);
  const returnTo = verifiedState?.returnTo === "blog" ? "blog" : "search";

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

  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", returnTo);
  } catch (connectionError) {
    const message = connectionError instanceof Error ? connectionError.message : "";
    return dashboardRedirect(
      request,
      message.includes("속성 권한") ? "site-access" : "connection-error",
      returnTo,
    );
  }
}
