import { NextResponse } from "next/server";
import { cookies } from "next/headers";
import { exchangeLinkedInCode } from "@/lib/auth/linkedin";

const STATE_COOKIE = "linkedin_oauth_state";
const AUTH_COOKIE = "postsync_auth";
const USER_COOKIE = "postsync_user";

export async function POST(request: Request) {
  try {
    const body = (await request.json()) as { code?: string; state?: string };
    const { code, state } = body;

    if (!code || !state) {
      return NextResponse.json({ error: "code and state are required" }, { status: 400 });
    }

    const cookieStore = await cookies();
    const savedState = cookieStore.get(STATE_COOKIE)?.value;

    if (!savedState || savedState !== state) {
      return NextResponse.json({ error: "Invalid or expired OAuth state" }, { status: 400 });
    }

    const result = await exchangeLinkedInCode(code);
    const initials = result.profile.accountName
      .split(" ")
      .map((part) => part[0])
      .join("")
      .slice(0, 2)
      .toUpperCase();

    const user = {
      id: result.profile.accountId,
      name: result.profile.accountName,
      email: result.profile.email ?? "",
      initials: initials || "LI",
      provider: "linkedin" as const,
    };

    const redirectCookie = cookieStore.get("postsync_login_redirect")?.value;

    const response = NextResponse.json({
      success: true,
      user,
      redirectTo: redirectCookie ?? "/dashboard",
    });

    response.cookies.set(AUTH_COOKIE, "1", {
      httpOnly: true,
      secure: process.env.NODE_ENV === "production",
      sameSite: "lax",
      maxAge: 60 * 60 * 24 * 7,
      path: "/",
    });

    response.cookies.set(USER_COOKIE, JSON.stringify(user), {
      httpOnly: false,
      secure: process.env.NODE_ENV === "production",
      sameSite: "lax",
      maxAge: 60 * 60 * 24 * 7,
      path: "/",
    });

    response.cookies.delete(STATE_COOKIE);
    if (redirectCookie) {
      response.cookies.delete("postsync_login_redirect");
    }

    return response;
  } catch (error) {
    const message = error instanceof Error ? error.message : "LinkedIn login failed";
    return NextResponse.json({ error: message }, { status: 400 });
  }
}
