import { protectedProcedure, publicProcedure, router } from "../_core/trpc.ts";
import { z } from "zod";
import { jackpotManager, initializeAllJackpots } from "../progressiveJackpot.ts";

export const jackpotRouter = router({
  // Initialize jackpots (admin only)
  initialize: protectedProcedure.mutation(async ({ ctx }) => {
    if (ctx.user.role !== "admin") {
      throw new Error("Only admins can initialize jackpots");
    }

    await initializeAllJackpots();
    return { success: true, message: "Jackpots initialized" };
  }),

  // Get current jackpot for a game
  getJackpot: publicProcedure
    .input(z.object({ gameId: z.number() }))
    .query(({ input }) => {
      const amount = jackpotManager.getJackpotAmount(input.gameId);
      return { gameId: input.gameId, amount };
    }),

  // Get jackpot statistics
  getStats: publicProcedure
    .input(z.object({ gameId: z.number() }))
    .query(({ input }) => {
      const stats = jackpotManager.getJackpotStats(input.gameId);
      return stats;
    }),

  // Add bet contribution to jackpot
  addContribution: protectedProcedure
    .input(z.object({ gameId: z.number(), betAmount: z.number() }))
    .mutation(({ input }) => {
      jackpotManager.addBetContribution(input.gameId, input.betAmount);
      const newAmount = jackpotManager.getJackpotAmount(input.gameId);
      return { newAmount };
    }),

  // Check if jackpot should be won
  checkWin: protectedProcedure
    .input(z.object({ gameId: z.number(), betAmount: z.number() }))
    .query(({ input }) => {
      const won = jackpotManager.checkJackpotWin(input.gameId, input.betAmount);
      return { won };
    }),

  // Win the jackpot
  winJackpot: protectedProcedure
    .input(z.object({ gameId: z.number(), spinId: z.string() }))
    .mutation(async ({ ctx, input }) => {
      const result = await jackpotManager.winJackpot(
        input.gameId,
        ctx.user.id,
        input.spinId
      );
      return result;
    }),

  // Get all jackpots
  getAllJackpots: publicProcedure.query(() => {
    const jackpots = jackpotManager.getAllJackpots();
    return jackpots.map((j) => ({
      gameId: j.gameId,
      currentAmount: j.currentAmount,
      baseAmount: j.baseAmount,
      lastWinAmount: j.lastWinAmount,
      lastWinAt: j.lastWinAt,
    }));
  }),

  // Get jackpot leaderboard
  getLeaderboard: publicProcedure
    .input(z.object({ limit: z.number().default(10) }))
    .query(({ input }) => {
      const leaderboard = jackpotManager.getJackpotLeaderboard(input.limit);
      return leaderboard;
    }),

  // Get jackpot history for a game
  getHistory: publicProcedure
    .input(z.object({ gameId: z.number(), limit: z.number().default(20) }))
    .query(({ input }) => {
      // Query jackpot win history from database
      return [
        {
          id: 1,
          winAmount: 15000,
          wonAt: new Date(),
          playerName: "Player123",
        },
        {
          id: 2,
          winAmount: 12000,
          wonAt: new Date(),
          playerName: "LuckySpinner",
        },
      ];
    }),
});
