const express = require("express");
const Badge = require("../models/Badge");
const UserBadge = require("../models/UserBadge");
const auth = require("../middleware/auth");
const { asyncHandler } = require("../middleware/errorHandler");
const { getUserBadgeProgress } = require("../services/gamificationService");
const { getCacheMiddleware } = require("../middleware/cache");

const router = express.Router();

/**
 * GET /api/badges
 * Get all available badges
 */
router.get(
  "/",
  getCacheMiddleware(600), // 10 minute cache
  asyncHandler(async (req, res) => {
    const badges = await Badge.findAll();
    // Sort by order and rarity in JavaScript since CouchDB doesn't support complex sorting
    badges.sort((a, b) => {
      if (a.order !== b.order) return a.order - b.order;
      return a.rarity.localeCompare(b.rarity);
    });
    res.json(badges);
  })
);

/**
 * GET /api/badges/progress
 * Get current user's badge progress (requires authentication)
 */
router.get(
  "/progress",
  auth,
  getCacheMiddleware(600), // 10 minute cache
  asyncHandler(async (req, res) => {
    const progress = await getUserBadgeProgress(req.user.id);
    res.json(progress);
  })
);

/**
 * GET /api/users/:userId/badges
 * Get badges earned by a specific user with progress
 */
router.get(
  "/users/:userId",
  getCacheMiddleware(600), // 10 minute cache
  asyncHandler(async (req, res) => {
    const { userId } = req.params;

    const userBadges = await UserBadge.findByUser(userId);

    // Sort by earnedAt in JavaScript
    userBadges.sort((a, b) => new Date(b.earnedAt) - new Date(a.earnedAt));

    res.json(
      userBadges.map((ub) => ({
        badge: ub.badge,
        earnedAt: ub.earnedAt,
        progress: ub.progress,
      }))
    );
  })
);

/**
 * GET /api/badges/:badgeId
 * Get a specific badge by ID
 */
router.get(
  "/:badgeId",
  getCacheMiddleware(600), // 10 minute cache
  asyncHandler(async (req, res) => {
    const { badgeId } = req.params;

    const badge = await Badge.findById(badgeId);
    if (!badge) {
      return res.status(404).json({ msg: "Badge not found" });
    }

    res.json(badge);
  })
);

module.exports = router;
