import { NextResponse } from "next/server";
import { prisma } from "@/lib/db";
import { requireAuth } from "@/lib/auth/middleware";
import { deployQueue } from "@/lib/queue";

export async function POST(req: Request, ctx: { params: Promise<{ id: string }> }) {
  const auth = await requireAuth(req);
  if (!auth.ok) {
    return NextResponse.json({ error: "unauthorized" }, { status: auth.status });
  }

  const { id } = await ctx.params;
  const body = (await req.json().catch(() => ({}))) as { deployId?: string };
  if (!body.deployId) {
    return NextResponse.json({ error: "missing_deployId" }, { status: 400 });
  }

  const project = await prisma.project.findUnique({ where: { id } });
  if (!project) {
    return NextResponse.json({ error: "project_not_found" }, { status: 404 });
  }
  if (!project.deployTargetId) {
    return NextResponse.json({ error: "no_deploy_target" }, { status: 400 });
  }

  const original = await prisma.deployHistory.findUnique({
    where: { id: body.deployId },
  });
  if (!original || original.projectId !== id) {
    return NextResponse.json({ error: "deploy_not_found" }, { status: 404 });
  }
  if (original.status !== "success") {
    return NextResponse.json(
      { error: "cannot_rollback_to_failed_deploy" },
      { status: 400 },
    );
  }

  // Reuse existing image — skip build, go straight to deploy queue.
  const dep = await prisma.deployHistory.create({
    data: {
      projectId: id,
      imageTag: original.imageTag,
      commitHash: original.commitHash,
      status: "deploying",
      targetId: project.deployTargetId,
      logBlob: `[rollback] reusing image ${original.imageTag} from deploy ${original.id}\n`,
    },
  });

  await deployQueue.add("deploy", {
    deployId: dep.id,
    projectId: id,
    targetId: project.deployTargetId,
    imageTag: original.imageTag,
  });

  return NextResponse.json({
    ok: true,
    deployId: dep.id,
    imageTag: original.imageTag,
    rolledBackFrom: original.id,
  });
}
