import { NextRequest } from "next/server";
import { z } from "zod";
import { AppError } from "@/server/errors";
import { fail, ok, parseJson } from "@/server/http";
import { prisma } from "@/server/db";
import { requireUser } from "@/server/security/auth";

export const dynamic = "force-dynamic";

const limitsSchema = z.object({
  depositLimitDaily: z.number().positive().max(1000000).nullable(),
  lossLimitDaily: z.number().positive().max(1000000).nullable(),
  sessionLimitMinutes: z.number().int().min(15).max(1440).nullable()
});

export async function GET(request: NextRequest) {
  try {
    const { user } = await requireUser(request);

    if (!user.profile) {
      throw new AppError("Profile required", 422, "PROFILE_REQUIRED");
    }

    return ok(formatLimits(user.profile));
  } catch (error) {
    return fail(error);
  }
}

export async function PATCH(request: NextRequest) {
  try {
    const { user } = await requireUser(request);
    const input = await parseJson(request, limitsSchema);

    if (!user.profile) {
      throw new AppError("Profile required", 422, "PROFILE_REQUIRED");
    }

    const profile = await prisma.userProfile.update({
      where: { userId: user.id },
      data: {
        depositLimitDaily: input.depositLimitDaily === null ? null : String(input.depositLimitDaily),
        lossLimitDaily: input.lossLimitDaily === null ? null : String(input.lossLimitDaily),
        sessionLimitMinutes: input.sessionLimitMinutes
      }
    });

    return ok(formatLimits(profile));
  } catch (error) {
    return fail(error);
  }
}

function formatLimits(profile: {
  depositLimitDaily: { toString: () => string } | null;
  lossLimitDaily: { toString: () => string } | null;
  sessionLimitMinutes: number | null;
}) {
  return {
    depositLimitDaily: profile.depositLimitDaily?.toString() ?? null,
    lossLimitDaily: profile.lossLimitDaily?.toString() ?? null,
    sessionLimitMinutes: profile.sessionLimitMinutes
  };
}
