import { NextRequest } from "next/server";
import { UserBonusStatus } from "@prisma/client";
import { prisma } from "@/server/db";
import { fail, ok } from "@/server/http";
import { requireUser } from "@/server/security/auth";
import { ensureVipRewardsForUser } from "@/server/vip/rewards";

export const dynamic = "force-dynamic";

export async function GET(request: NextRequest) {
  try {
    const { user } = await requireUser(request);
    const currency = user.profile?.currency ?? "EUR";
    await ensureVipRewardsForUser(user.id, currency);

    const [bonuses, tiers, progress] = await Promise.all([
      prisma.userBonus.findMany({
        where: {
          userId: user.id,
          status: { in: [UserBonusStatus.OFFERED, UserBonusStatus.ACTIVE] }
        },
        include: { promotion: true },
        orderBy: { createdAt: "desc" },
        take: 100
      }),
      prisma.vipTier.findMany({ orderBy: [{ sortOrder: "asc" }, { minVolume: "asc" }] }),
      prisma.userVipProgress.findUnique({ where: { userId: user.id } })
    ]);
    const lifetimeVolume = progress?.lifetimeVolume ?? "0";

    return ok({
      user: {
        id: user.id,
        email: user.email,
        username: user.username,
        currency
      },
      progress: {
        tierKey: progress?.tierKey ?? tiers[0]?.key ?? "bronze",
        rollingVolume: progress?.rollingVolume?.toString() ?? "0",
        lifetimeVolume: lifetimeVolume.toString()
      },
      tiers: tiers.map((tier) => ({
        key: tier.key,
        name: tier.name,
        minVolume: tier.minVolume.toString(),
        cashbackBps: tier.cashbackBps,
        rakebackBps: tier.rakebackBps,
        perks: tier.perks,
        sortOrder: tier.sortOrder
      })),
      bonuses: bonuses.map((bonus) => ({
        id: bonus.id,
        status: bonus.status,
        bonusAmount: bonus.bonusAmount.toString(),
        wagerRequired: bonus.wagerRequired.toString(),
        wagerProgress: bonus.wagerProgress.toString(),
        expiresAt: bonus.expiresAt,
        createdAt: bonus.createdAt,
        promotion: {
          name: bonus.promotion.name,
          type: bonus.promotion.type,
          currency: bonus.promotion.currency,
          terms: bonus.promotion.terms,
          wageringMultiplier: bonus.promotion.wageringMultiplier.toString()
        }
      }))
    });
  } catch (error) {
    return fail(error);
  }
}
