import { DIFFICULTIES, LEVELS_PER_DIFFICULTY } from "./constants.js";
import type { ProgressPayload } from "./types.js";

export const computeBadges = (payload: {
  progress: ProgressPayload;
  totals: { totalCompletions: number; totalMoves: number; totalTime: number };
  tutorialCompleted: boolean;
  isGuest?: boolean;
  isAdmin?: boolean;
  userCreatedAtMs?: number;
  launchDateMs?: number;
  rankSinceLaunch?: number;
}) => {
  const totalLevels = LEVELS_PER_DIFFICULTY * DIFFICULTIES.length;
  const totalCompleted = DIFFICULTIES.reduce(
    (sum, key) => sum + (payload.progress[key] ?? 0),
    0,
  );
  const bestPercent = DIFFICULTIES.reduce((best, key) => {
    const percent = Math.round(
      ((payload.progress[key] ?? 0) / LEVELS_PER_DIFFICULTY) * 100,
    );
    return percent > best ? percent : best;
  }, 0);
  const hasAllModes = DIFFICULTIES.every(
    (key) => (payload.progress[key] ?? 0) > 0,
  );
  const badges: string[] = [];
  if (totalCompleted >= 1) badges.push("starter");
  if (totalCompleted >= 10) badges.push("explorer");
  if (totalCompleted >= 25) badges.push("solver");
  if (totalCompleted >= 100) badges.push("veteran");
  if (totalCompleted >= 250) badges.push("marathon");
  if (payload.totals.totalCompletions >= 50) badges.push("replay");
  if (payload.totals.totalMoves >= 1000) badges.push("steady");
  // totalTime est stocké en millisecondes (somme des temps de niveaux complétés)
  if (payload.totals.totalTime >= 3600 * 1000) badges.push("endurance");
  if (payload.tutorialCompleted) badges.push("tutorial");
  if (hasAllModes) badges.push("all-rounder");
  if (bestPercent >= 50) badges.push("specialist");
  if (totalCompleted >= totalLevels) badges.push("master");

  // Badges limités: réservés aux joueurs non-admin
  if (!payload.isAdmin) {
    const launchDateMs = payload.launchDateMs;
    const userCreatedAtMs = payload.userCreatedAtMs;

    // Badge beta testeur: attribué à tous les comptes créés dans le premier mois suivant le lancement
    // Une fois obtenu, le badge est définitif (pas de limite de temps)
    if (
      typeof launchDateMs === "number" &&
      Number.isFinite(launchDateMs) &&
      typeof userCreatedAtMs === "number" &&
      Number.isFinite(userCreatedAtMs)
    ) {
      const oneMonthMs = 30 * 24 * 60 * 60 * 1000;
      if (userCreatedAtMs <= launchDateMs + oneMonthMs) {
        badges.push("early-tester");
      }
    }

    // Badge Top 100: attribué aux 100 premiers joueurs non-admin
    const rank = payload.rankSinceLaunch;
    if (typeof rank === "number" && Number.isFinite(rank) && rank <= 100) {
      badges.push("founder-100");
    }
  }

  return badges;
};
