import { NextRequest, NextResponse } from "next/server";
import { z } from "zod";
import { db, ingredients, eq } from "@epicure/db";
import { requireAdmin } from "@/lib/api-auth";

type Params = { params: Promise<{ id: string }> };

const Schema = z.object({
  name: z.string().trim().min(1).max(100).optional(),
  aliases: z.array(z.string().trim().min(1).max(100)).max(50).optional(),
  category: z.string().max(50).nullable().optional(),
});

export async function PUT(req: NextRequest, { params }: Params) {
  const { response } = await requireAdmin();
  if (response) return response;
  const { id } = await params;

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

  const data = parsed.data;
  try {
    await db.update(ingredients).set({
      ...(data.name && { name: data.name }),
      ...(data.aliases && { aliases: data.aliases }),
      ...(data.category !== undefined && { category: data.category ?? undefined }),
    }).where(eq(ingredients.id, id));
  } catch {
    return NextResponse.json({ error: "An ingredient with this name already exists" }, { status: 409 });
  }

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

// Unlinks (doesn't cascade-delete) any pantry item / recipe ingredient that
// pointed at this canonical entry — both onDelete: "set null".
export async function DELETE(req: NextRequest, { params }: Params) {
  const { response } = await requireAdmin();
  if (response) return response;
  const { id } = await params;

  await db.delete(ingredients).where(eq(ingredients.id, id));
  return new NextResponse(null, { status: 204 });
}
