import { cookies } from "next/headers";
import { NextResponse } from "next/server";
import { randomBytes } from "crypto";

const STATE_MAX_AGE = 60 * 10;

export function createOAuthState(): string {
  return randomBytes(24).toString("hex");
}

export function setOAuthCookies(
  response: NextResponse,
  prefix: string,
  data: {
    state: string;
    projectId: string;
    platform: string;
    returnTo: string;
    redirectUri?: string;
  },
) {
  const opts = {
    httpOnly: true,
    secure: process.env.NODE_ENV === "production",
    sameSite: "lax" as const,
    maxAge: STATE_MAX_AGE,
    path: "/",
  };
  response.cookies.set(`${prefix}_oauth_state`, data.state, opts);
  response.cookies.set(`${prefix}_project_id`, data.projectId, opts);
  response.cookies.set(`${prefix}_platform`, data.platform, opts);
  response.cookies.set(`${prefix}_return`, data.returnTo, opts);
  if (data.redirectUri) {
    response.cookies.set(`${prefix}_redirect_uri`, data.redirectUri, opts);
  }
}

export async function readOAuthCookies(prefix: string) {
  const cookieStore = await cookies();
  return {
    state: cookieStore.get(`${prefix}_oauth_state`)?.value,
    projectId: cookieStore.get(`${prefix}_project_id`)?.value,
    platform: cookieStore.get(`${prefix}_platform`)?.value,
    returnTo: cookieStore.get(`${prefix}_return`)?.value ?? "/connected-accounts",
    redirectUri: cookieStore.get(`${prefix}_redirect_uri`)?.value,
  };
}

export function clearOAuthCookies(response: NextResponse, prefix: string) {
  for (const key of ["oauth_state", "project_id", "platform", "return", "redirect_uri"]) {
    response.cookies.set(`${prefix}_${key}`, "", { maxAge: 0, path: "/" });
  }
}
