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

const PutSchema = z.object({
  caloriesKcal: z.number().int().min(0).optional(),
  proteinG: z.number().int().min(0).optional(),
  carbsG: z.number().int().min(0).optional(),
  fatG: z.number().int().min(0).optional(),
});

export async function GET() {
  const { session, response } = await requireSession();
  if (response) return response;

  const goals = await db.query.userNutritionGoals.findFirst({
    where: eq(userNutritionGoals.userId, session!.user.id),
  });

  return NextResponse.json({ data: goals ?? null });
}

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

  const parsed = PutSchema.safeParse(await req.json());
  if (!parsed.success) {
    return NextResponse.json({ error: parsed.error.flatten() }, { status: 400 });
  }

  const body = parsed.data;
  const userId = session!.user.id;

  await db
    .insert(userNutritionGoals)
    .values({ id: crypto.randomUUID(), userId, ...body, updatedAt: new Date() })
    .onConflictDoUpdate({
      target: userNutritionGoals.userId,
      set: { ...body, updatedAt: new Date() },
    });

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