import { NextResponse } from "next/server";
import { getSessionUser } from "@/lib/auth/get-session-user";
import { runNextSequenceGeneration, runPostGeneration } from "@/lib/generation/run-generation";
import { logAppError } from "@/lib/logging/app-error-logger";
import { logGeneration } from "@/lib/logging/generation-logger";
import type { GeneratePostRequest } from "@/types/workflow";

export async function POST(request: Request) {
  let projectId: string | undefined;
  try {
    const user = await getSessionUser();
    if (!user) {
      return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
    }

    const body = (await request.json()) as GeneratePostRequest & {
      mode?: "next" | "specific";
    };
    projectId = body.projectId;

    if (!body.projectId) {
      return NextResponse.json({ error: "projectId is required" }, { status: 400 });
    }

    if (!body.project?.name) {
      return NextResponse.json({ error: "Project data is required" }, { status: 400 });
    }

    if (body.project.status === "paused") {
      return NextResponse.json(
        {
          error: "Project is paused. Set status to Active before generating content.",
          code: "PROJECT_PAUSED",
        },
        { status: 403 },
      );
    }

    const options = { userId: user.id };

    const post =
      body.mode === "next" || !body.sequencePostId
        ? await runNextSequenceGeneration(
            {
              projectId: body.projectId,
              project: body.project,
              brand: body.brand,
              context: body.context,
              connectedPlatforms: body.connectedPlatforms ?? [],
              schedule: body.schedule,
              automation: body.automation,
              accounts: body.accounts,
            },
            options,
          )
        : await runPostGeneration(body, options);

    return NextResponse.json({ success: true, post });
  } catch (error) {
    const message = error instanceof Error ? error.message : "Generation failed";
    await logGeneration({
      level: "ERROR",
      event: "generation_failed",
      projectId,
      message,
      details: { error: message },
    }).catch(() => undefined);
    await logAppError({
      area: "generation",
      event: "generation_failed",
      projectId,
      message: "Live/sequence generation failed",
      error,
    }).catch(() => undefined);
    return NextResponse.json({ error: message }, { status: 400 });
  }
}
