import { NextRequest, NextResponse } from "next/server";
import { z } from "zod";
import { db, reports, comments, recipes, users, eq } from "@epicure/db";
import { requireSession } from "@/lib/api-auth";
import { applyRateLimit } from "@/lib/rate-limit";
import { dispatchAdminWebhook } from "@/lib/admin-webhooks";
import { randomUUID } from "crypto";

const Schema = z.object({
  targetType: z.enum(["recipe", "comment", "user"]),
  targetId: z.string().min(1),
  reason: z.string().min(1).max(1000),
});

export async function POST(req: NextRequest) {
  const { session, response } = await requireSession();
  if (response) return response;

  const limited = await applyRateLimit(`rl:report:${session!.user.id}`, 10, 60);
  if (limited) return limited;

  const body = await req.json() as unknown;
  const parsed = Schema.safeParse(body);
  if (!parsed.success) return NextResponse.json({ error: "Validation error" }, { status: 400 });

  const { targetType, targetId, reason } = parsed.data;

  const exists =
    targetType === "recipe"
      ? await db.query.recipes.findFirst({ where: eq(recipes.id, targetId) })
      : targetType === "comment"
        ? await db.query.comments.findFirst({ where: eq(comments.id, targetId) })
        : await db.query.users.findFirst({ where: eq(users.id, targetId) });

  if (!exists) return NextResponse.json({ error: "Target not found" }, { status: 404 });

  const id = randomUUID();
  await db.insert(reports).values({
    id,
    reporterId: session!.user.id,
    targetType,
    targetId,
    reason,
  });

  void dispatchAdminWebhook("report.filed", { id, reporterId: session!.user.id, targetType, targetId, reason });

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