import { router, publicProcedure, protectedProcedure } from "../_core/trpc.ts";
import { getLeaderboard, getUserRank, getPrizePool, calculatePrize, addEntry } from "../services/leaderboardService.ts";
import { z } from "zod";

export const leaderboardRouter = router({
  getLeaderboard: publicProcedure
    .input(z.object({
      type: z.enum(["global", "weekly", "daily", "game_specific"]),
      limit: z.number().default(100),
      gameId: z.string().optional(),
    }))
    .query(async ({ input }) => {
      return getLeaderboard(input.type, input.limit, input.gameId);
    }),

  getUserRank: protectedProcedure
    .input(z.object({
      type: z.enum(["global", "weekly", "daily", "game_specific"]),
      gameId: z.string().optional(),
    }))
    .query(async ({ ctx, input }) => {
      const rank = await getUserRank(ctx.user.id, input.type, input.gameId);
      const prizePool = await getPrizePool(input.type);
      const prize = rank ? await calculatePrize(input.type, rank) : 0;
      return { rank, prizePool, prize };
    }),

  addScore: protectedProcedure
    .input(z.object({
      type: z.enum(["global", "weekly", "daily", "game_specific"]),
      score: z.number().positive(),
      gameId: z.string().optional(),
    }))
    .mutation(async ({ ctx, input }) => {
      return addEntry(ctx.user.id, input.type, input.score, input.gameId);
    }),

  getPrizePool: publicProcedure
    .input(z.enum(["global", "weekly", "daily", "game_specific"]))
    .query(async ({ input }) => {
      return getPrizePool(input);
    }),
});
