/**
 * @copyright 2026 NHCarrigan
 * @license Naomi's Public License
 * @author Naomi Carrigan
 */

import { FastifyPluginAsync } from "fastify";
import type {
  LeaderboardResponse,
  SuggestionsLeaderboard,
  LikesLeaderboard,
  CommentsLeaderboard,
  OverallLeaderboard,
} from "@library/shared-types";
import { LeaderboardService } from "../../services/leaderboard.service";

const leaderboardRoutes: FastifyPluginAsync = async (app) => {
  const leaderboardService = new LeaderboardService();
  /**
   * Get all leaderboards at once.
   */
  app.get<{
    Querystring: { limit?: number };
    Reply: LeaderboardResponse;
  }>("/", async (request) => {
    const limit = request.query.limit && request.query.limit > 0
      ? Math.min(request.query.limit, 100)
      : 25;
    return leaderboardService.getAllLeaderboards(limit);
  });

  /**
   * Get top users by suggestions.
   */
  app.get<{
    Querystring: { limit?: number };
    Reply: SuggestionsLeaderboard[];
  }>("/suggestions", async (request) => {
    const limit = request.query.limit && request.query.limit > 0
      ? Math.min(request.query.limit, 100)
      : 25;
    return leaderboardService.getTopSuggestions(limit);
  });

  /**
   * Get top users by likes.
   */
  app.get<{
    Querystring: { limit?: number };
    Reply: LikesLeaderboard[];
  }>("/likes", async (request) => {
    const limit = request.query.limit && request.query.limit > 0
      ? Math.min(request.query.limit, 100)
      : 25;
    return leaderboardService.getTopLikes(limit);
  });

  /**
   * Get top users by comments.
   */
  app.get<{
    Querystring: { limit?: number };
    Reply: CommentsLeaderboard[];
  }>("/comments", async (request) => {
    const limit = request.query.limit && request.query.limit > 0
      ? Math.min(request.query.limit, 100)
      : 25;
    return leaderboardService.getTopComments(limit);
  });

  /**
   * Get overall leaderboard.
   */
  app.get<{
    Querystring: { limit?: number };
    Reply: OverallLeaderboard[];
  }>("/overall", async (request) => {
    const limit = request.query.limit && request.query.limit > 0
      ? Math.min(request.query.limit, 100)
      : 25;
    return leaderboardService.getOverallLeaderboard(limit);
  });
};

export default leaderboardRoutes;
