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

const Schema = z.object({
  textProvider: z.string().nullable().optional(),
  textModel: z.string().nullable().optional(),
  visionProvider: z.string().nullable().optional(),
  visionModel: z.string().nullable().optional(),
  mealPlanProvider: z.string().nullable().optional(),
  mealPlanModel: z.string().nullable().optional(),
});

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

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

  return NextResponse.json(prefs ?? null);
}

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

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

  await db
    .insert(userModelPrefs)
    .values({ id: crypto.randomUUID(), userId: session!.user.id, ...body.data, updatedAt: new Date() })
    .onConflictDoUpdate({
      target: userModelPrefs.userId,
      set: { ...body.data, updatedAt: new Date() },
    });

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