import { NextResponse } from "next/server";
import { z } from "zod";
import { prisma } from "@/lib/db";
import { eventBus } from "@/lib/events/bus";

const Body = z.object({
  project: z.string().min(1),
  hash: z.string().regex(/^[0-9a-f]{7,40}$/),
  message: z.string().default(""),
  branch: z.string().optional().nullable(),
  author: z.string().optional().nullable(),
});

export async function POST(req: Request) {
  const expected = process.env.PM_WEBHOOK_TOKEN;
  const provided = req.headers.get("x-pm-token");
  if (!expected || !provided || provided !== expected) {
    return NextResponse.json({ error: "unauthorized" }, { status: 401 });
  }

  let parsed;
  try {
    parsed = Body.safeParse(await req.json());
  } catch {
    return NextResponse.json({ error: "invalid_json" }, { status: 400 });
  }
  if (!parsed.success) {
    return NextResponse.json({ error: "invalid_body", details: parsed.error.format() }, { status: 400 });
  }
  const { project, hash, message, branch, author } = parsed.data;

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

  await prisma.project.update({
    where: { id: proj.id },
    data: {
      lastCommitHash: hash,
      lastCommitMessage: message,
      lastCommitTime: new Date(),
      branch: branch ?? proj.branch,
    },
  });

  await prisma.commitLog.create({
    data: { projectId: proj.id, hash, message, author: author ?? null, branch: branch ?? null },
  });

  eventBus.emit({ type: "commit.new", projectId: proj.id, hash });
  eventBus.emit({ type: "project.updated", projectId: proj.id });

  return NextResponse.json({ ok: true });
}
