import { protectedProcedure, publicProcedure, router } from "../_core/trpc.ts";
import { z } from "zod";
import { vipTierManager, VIP_TIERS } from "../vipTiers.ts";

export const vipTiersRouter = router({
  // Get player VIP status
  getStatus: protectedProcedure.query(async ({ ctx }) => {
    const status = await vipTierManager.getPlayerStatus(ctx.user.id);
    return status;
  }),

  // Get tier progression info
  getProgression: protectedProcedure.query(async ({ ctx }) => {
    const progression = await vipTierManager.getTierProgression(ctx.user.id);
    return progression;
  }),

  // Add wager (called after each spin)
  addWager: protectedProcedure
    .input(z.object({ amount: z.number() }))
    .mutation(async ({ ctx, input }) => {
      await vipTierManager.addWager(ctx.user.id, input.amount);
      const status = await vipTierManager.getPlayerStatus(ctx.user.id);
      return status;
    }),

  // Claim daily bonus
  claimDailyBonus: protectedProcedure.mutation(async ({ ctx }) => {
    const result = await vipTierManager.claimDailyBonus(ctx.user.id);
    return result;
  }),

  // Claim weekly bonus
  claimWeeklyBonus: protectedProcedure.mutation(async ({ ctx }) => {
    const result = await vipTierManager.claimWeeklyBonus(ctx.user.id);
    return result;
  }),

  // Claim monthly bonus
  claimMonthlyBonus: protectedProcedure.mutation(async ({ ctx }) => {
    const result = await vipTierManager.claimMonthlyBonus(ctx.user.id);
    return result;
  }),

  // Get tier benefits
  getBenefits: publicProcedure
    .input(z.object({ tier: z.string() }))
    .query(({ input }) => {
      const benefits = vipTierManager.getTierBenefits(input.tier as any);
      return benefits;
    }),

  // Get all tiers
  getAllTiers: publicProcedure.query(() => {
    const tiers = vipTierManager.getAllTiers();
    return tiers;
  }),

  // Get tournament fee discount
  getTournamentDiscount: protectedProcedure.query(async ({ ctx }) => {
    const discount = await vipTierManager.getTournamentFeeDiscount(ctx.user.id);
    return { discount };
  }),

  // Get bet multiplier
  getBetMultiplier: protectedProcedure.query(async ({ ctx }) => {
    const multiplier = await vipTierManager.getBetMultiplier(ctx.user.id);
    return { multiplier };
  }),

  // Get bonus multiplier
  getBonusMultiplier: protectedProcedure.query(async ({ ctx }) => {
    const multiplier = await vipTierManager.getBonusMultiplier(ctx.user.id);
    return { multiplier };
  }),

  // Reset monthly wager (admin only, called at month start)
  resetMonthlyWager: protectedProcedure.mutation(async ({ ctx, input }) => {
    if (ctx.user.role !== "admin") {
      throw new Error("Only admins can reset monthly wager");
    }
    await vipTierManager.resetMonthlyWager(ctx.user.id);
    return { success: true };
  }),

  // Get leaderboard by tier
  getLeaderboardByTier: publicProcedure
    .input(z.object({ tier: z.string(), limit: z.number().default(20) }))
    .query(async ({ input }) => {
      // Query top players in tier from database
      // For now, return mock data
      return [
        {
          rank: 1,
          username: "TopPlayer",
          totalWagered: 500000,
          currentTier: input.tier,
        },
        {
          rank: 2,
          username: "HighRoller",
          totalWagered: 450000,
          currentTier: input.tier,
        },
      ];
    }),

  // Get VIP statistics
  getStats: publicProcedure.query(async () => {
    // Get aggregate VIP statistics
    return {
      totalVIPMembers: 1250,
      totalWageredByVIPs: 50000000,
      averageVIPTier: "silver",
      topTierMembers: 45,
    };
  }),
});
