import { NextResponse } from "next/server";
import { getSessionUser } from "@/lib/auth/get-session-user";
import { clearOAuthCookies, readOAuthCookies } from "@/lib/social/oauth-cookies";
import { exchangeYouTubeCode, fetchYouTubeChannel } from "@/lib/social/youtube-oauth";
import { persistSocialConnection } from "@/lib/social/save-connection";

const PREFIX = "youtube";

export async function POST(request: Request) {
  try {
    const user = await getSessionUser();
    if (!user) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });

    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 cookies = await readOAuthCookies(PREFIX);
    if (!cookies.state || cookies.state !== state) {
      return NextResponse.json({ error: "Invalid or expired OAuth state" }, { status: 400 });
    }
    if (!cookies.projectId) {
      return NextResponse.json({ error: "Missing project context" }, { status: 400 });
    }

    const token = await exchangeYouTubeCode(code);
    const channel = await fetchYouTubeChannel(token.accessToken);
    const expiresAt = token.expiresIn
      ? new Date(Date.now() + token.expiresIn * 1000).toISOString()
      : null;

    const account = await persistSocialConnection(
      user.id,
      cookies.projectId,
      {
        platform: "youtube",
        profileName: channel.title,
        accessToken: token.accessToken,
        refreshToken: token.refreshToken ?? null,
        externalId: channel.channelId,
        expiresAt,
      },
      { email: user.email, name: user.name },
    );

    const response = NextResponse.json({
      success: true,
      projectId: cookies.projectId,
      returnTo: cookies.returnTo,
      platform: "youtube",
      profileName: account.profileName,
      externalId: account.externalId,
      expiresAt: account.expiresAt,
    });

    clearOAuthCookies(response, PREFIX);
    return response;
  } catch (error) {
    const message = error instanceof Error ? error.message : "YouTube connection failed";
    return NextResponse.json({ error: message }, { status: 400 });
  }
}
