/**
 * Achievement Service
 * Manages player achievements and badges
 */

export interface Achievement {
  id: string;
  name: string;
  description: string;
  icon: string;
  category: 'milestone' | 'seasonal' | 'special' | 'social';
  rarity: 'common' | 'rare' | 'epic' | 'legendary';
  target: number;
  reward: string;
  rewardAmount?: number;
}

export interface PlayerAchievement {
  userId: number;
  achievementId: string;
  progress: number;
  completed: boolean;
  unlockedDate?: Date;
}

// All available achievements
const ACHIEVEMENTS: Achievement[] = [
  // Milestone Achievements
  {
    id: 'first_win',
    name: 'First Victory',
    description: 'Win your first game',
    icon: '🎯',
    category: 'milestone',
    rarity: 'common',
    target: 1,
    reward: '100 SC',
    rewardAmount: 100,
  },
  {
    id: 'hundred_wins',
    name: 'Century',
    description: 'Reach 100 total wins',
    icon: '💯',
    category: 'milestone',
    rarity: 'rare',
    target: 100,
    reward: '1000 SC',
    rewardAmount: 1000,
  },
  {
    id: 'thousand_wins',
    name: 'Legend',
    description: 'Reach 1000 total wins',
    icon: '👑',
    category: 'milestone',
    rarity: 'epic',
    target: 1000,
    reward: '10000 SC',
    rewardAmount: 10000,
  },
  {
    id: 'ten_streak',
    name: 'On Fire',
    description: 'Achieve a 10-win streak',
    icon: '🔥',
    category: 'milestone',
    rarity: 'rare',
    target: 10,
    reward: '500 SC',
    rewardAmount: 500,
  },
  {
    id: 'twenty_streak',
    name: 'Unstoppable',
    description: 'Achieve a 20-win streak',
    icon: '⚡',
    category: 'milestone',
    rarity: 'epic',
    target: 20,
    reward: '2000 SC',
    rewardAmount: 2000,
  },

  // Seasonal Achievements
  {
    id: 'halloween_master',
    name: 'Spooky Master',
    description: 'Reach top 10 in Halloween event',
    icon: '🎃',
    category: 'seasonal',
    rarity: 'epic',
    target: 1,
    reward: 'Exclusive Avatar',
  },
  {
    id: 'christmas_champion',
    name: 'Holiday Champion',
    description: 'Win Christmas tournament',
    icon: '🎄',
    category: 'seasonal',
    rarity: 'legendary',
    target: 1,
    reward: 'VIP Badge',
  },
  {
    id: 'all_events',
    name: 'Event Collector',
    description: 'Participate in all seasonal events',
    icon: '🌟',
    category: 'seasonal',
    rarity: 'epic',
    target: 4,
    reward: '5000 SC',
    rewardAmount: 5000,
  },

  // Special Achievements
  {
    id: 'big_win',
    name: 'Jackpot!',
    description: 'Win $1000 in a single spin',
    icon: '💰',
    category: 'special',
    rarity: 'rare',
    target: 1,
    reward: '500 SC',
    rewardAmount: 500,
  },
  {
    id: 'daily_player',
    name: 'Daily Grind',
    description: 'Play 30 days in a row',
    icon: '📅',
    category: 'special',
    rarity: 'rare',
    target: 30,
    reward: '1000 SC',
    rewardAmount: 1000,
  },
  {
    id: 'collector',
    name: 'Cosmetic Collector',
    description: 'Collect 10 cosmetics',
    icon: '✨',
    category: 'special',
    rarity: 'rare',
    target: 10,
    reward: 'Exclusive Frame',
  },

  // Social Achievements
  {
    id: 'five_referrals',
    name: 'Friend Maker',
    description: 'Refer 5 friends',
    icon: '👥',
    category: 'social',
    rarity: 'rare',
    target: 5,
    reward: '500 SC',
    rewardAmount: 500,
  },
  {
    id: 'influencer',
    name: 'Influencer',
    description: 'Refer 25 friends',
    icon: '⭐',
    category: 'social',
    rarity: 'epic',
    target: 25,
    reward: 'Exclusive Avatar',
  },
  {
    id: 'social_sharer',
    name: 'Social Butterfly',
    description: 'Share on all 5 platforms',
    icon: '🦋',
    category: 'social',
    rarity: 'rare',
    target: 5,
    reward: '750 SC',
    rewardAmount: 750,
  },
];

/**
 * Get all achievements
 */
export function getAllAchievements(): Achievement[] {
  return ACHIEVEMENTS;
}

/**
 * Get achievement by ID
 */
export function getAchievement(achievementId: string): Achievement | undefined {
  return ACHIEVEMENTS.find((a) => a.id === achievementId);
}

/**
 * Get achievements by category
 */
export function getAchievementsByCategory(category: string): Achievement[] {
  return ACHIEVEMENTS.filter((a) => a.category === category);
}

/**
 * Check if achievement is unlocked
 */
export function isAchievementUnlocked(progress: number, target: number): boolean {
  return progress >= target;
}

/**
 * Get achievement progress percentage
 */
export function getProgressPercentage(progress: number, target: number): number {
  return Math.min((progress / target) * 100, 100);
}

/**
 * Get uncompleted achievements
 */
export function getUncompletedAchievements(
  playerAchievements: PlayerAchievement[]
): PlayerAchievement[] {
  return playerAchievements.filter((pa) => !pa.completed);
}

/**
 * Get completed achievements
 */
export function getCompletedAchievements(playerAchievements: PlayerAchievement[]): PlayerAchievement[] {
  return playerAchievements.filter((pa) => pa.completed);
}

/**
 * Update achievement progress
 */
export function updateAchievementProgress(
  achievement: PlayerAchievement,
  newProgress: number
): PlayerAchievement {
  const achievementDef = getAchievement(achievement.achievementId);
  if (!achievementDef) return achievement;

  const completed = isAchievementUnlocked(newProgress, achievementDef.target);

  return {
    ...achievement,
    progress: Math.min(newProgress, achievementDef.target),
    completed,
    unlockedDate: completed && !achievement.completed ? new Date() : achievement.unlockedDate,
  };
}

/**
 * Get achievement rarity color
 */
export function getRarityColor(rarity: string): string {
  switch (rarity) {
    case 'common':
      return '#64748b'; // slate-500
    case 'rare':
      return '#3b82f6'; // blue-500
    case 'epic':
      return '#a855f7'; // purple-500
    case 'legendary':
      return '#eab308'; // yellow-500
    default:
      return '#64748b';
  }
}

/**
 * Get achievement reward value
 */
export function getRewardValue(achievement: Achievement): number {
  return achievement.rewardAmount || 0;
}

/**
 * Calculate total reward value
 */
export function calculateTotalRewards(playerAchievements: PlayerAchievement[]): number {
  let total = 0;

  for (const pa of playerAchievements) {
    if (pa.completed) {
      const achievement = getAchievement(pa.achievementId);
      if (achievement) {
        total += getRewardValue(achievement);
      }
    }
  }

  return total;
}

/**
 * Get next achievement milestone
 */
export function getNextMilestone(playerAchievements: PlayerAchievement[]): PlayerAchievement | undefined {
  const uncompleted = getUncompletedAchievements(playerAchievements);
  if (uncompleted.length === 0) return undefined;

  // Return the one closest to completion
  return uncompleted.reduce((closest, current) => {
    const currentAch = getAchievement(current.achievementId);
    const closestAch = getAchievement(closest.achievementId);

    if (!currentAch || !closestAch) return closest;

    const currentProgress = (current.progress / currentAch.target) * 100;
    const closestProgress = (closest.progress / closestAch.target) * 100;

    return currentProgress > closestProgress ? current : closest;
  });
}

/**
 * Get achievement stats
 */
export function getAchievementStats(playerAchievements: PlayerAchievement[]): {
  total: number;
  completed: number;
  percentage: number;
  nextMilestone?: string;
} {
  const completed = getCompletedAchievements(playerAchievements).length;
  const total = playerAchievements.length;
  const percentage = (completed / total) * 100;
  const next = getNextMilestone(playerAchievements);
  const nextMilestone = next ? getAchievement(next.achievementId)?.name : undefined;

  return {
    total,
    completed,
    percentage,
    nextMilestone,
  };
}

/**
 * Get rare achievements (rarity > common)
 */
export function getRareAchievements(): Achievement[] {
  return ACHIEVEMENTS.filter((a) => a.rarity !== 'common');
}

/**
 * Get legendary achievements
 */
export function getLegendaryAchievements(): Achievement[] {
  return ACHIEVEMENTS.filter((a) => a.rarity === 'legendary');
}
