export type VIPTier = "bronze" | "silver" | "gold" | "platinum" | "diamond" | "elite";

export interface VIPPerk {
  id: string;
  name: string;
  description: string;
  icon: string;
  value: string | number;
}

export interface VIPTierInfo {
  tier: VIPTier;
  displayName: string;
  color: string;
  icon: string;
  minSpend: number; // Minimum GC spent to reach this tier
  perks: VIPPerk[];
  cashbackRate: number; // Percentage
  bonusMultiplier: number; // 1x - 5x
  exclusiveGames: string[];
  prioritySupport: boolean;
  monthlyBonus: number; // GC bonus
  birthdayBonus: number; // GC bonus
}

export interface PlayerVIPStatus {
  playerId: number;
  currentTier: VIPTier;
  totalSpent: number;
  progressToNextTier: number;
  nextTierName: string;
  nextTierMinSpend: number;
  perksUnlocked: VIPPerk[];
  cashbackEarned: number;
  monthlyBonusEarned: number;
  lastBirthdayBonus?: Date;
}

// VIP Tier Definitions
export const VIP_TIERS: Record<VIPTier, VIPTierInfo> = {
  bronze: {
    tier: "bronze",
    displayName: "Bronze VIP",
    color: "#CD7F32",
    icon: "🥉",
    minSpend: 0,
    perks: [
      {
        id: "cashback_1",
        name: "1% Cashback",
        description: "Earn 1% cashback on all wins",
        icon: "💰",
        value: "1%",
      },
      {
        id: "bonus_1x",
        name: "1x Bonus Multiplier",
        description: "Standard game multiplier",
        icon: "⚡",
        value: "1x",
      },
      {
        id: "support_standard",
        name: "Standard Support",
        description: "Email support within 24 hours",
        icon: "📧",
        value: "24h",
      },
    ],
    cashbackRate: 1,
    bonusMultiplier: 1,
    exclusiveGames: [],
    prioritySupport: false,
    monthlyBonus: 500,
    birthdayBonus: 1000,
  },
  silver: {
    tier: "silver",
    displayName: "Silver VIP",
    color: "#C0C0C0",
    icon: "🥈",
    minSpend: 10000,
    perks: [
      {
        id: "cashback_2",
        name: "2% Cashback",
        description: "Earn 2% cashback on all wins",
        icon: "💰",
        value: "2%",
      },
      {
        id: "bonus_1_5x",
        name: "1.5x Bonus Multiplier",
        description: "Enhanced game multiplier",
        icon: "⚡",
        value: "1.5x",
      },
      {
        id: "exclusive_games_1",
        name: "3 Exclusive Games",
        description: "Access to Silver-tier games",
        icon: "🎮",
        value: "3",
      },
      {
        id: "support_priority",
        name: "Priority Support",
        description: "Email support within 12 hours",
        icon: "📧",
        value: "12h",
      },
    ],
    cashbackRate: 2,
    bonusMultiplier: 1.5,
    exclusiveGames: ["silver_slots_1", "silver_slots_2", "silver_slots_3"],
    prioritySupport: true,
    monthlyBonus: 1000,
    birthdayBonus: 2500,
  },
  gold: {
    tier: "gold",
    displayName: "Gold VIP",
    color: "#FFD700",
    icon: "🥇",
    minSpend: 50000,
    perks: [
      {
        id: "cashback_3",
        name: "3% Cashback",
        description: "Earn 3% cashback on all wins",
        icon: "💰",
        value: "3%",
      },
      {
        id: "bonus_2x",
        name: "2x Bonus Multiplier",
        description: "Doubled game multiplier",
        icon: "⚡",
        value: "2x",
      },
      {
        id: "exclusive_games_5",
        name: "8 Exclusive Games",
        description: "Access to Gold-tier games",
        icon: "🎮",
        value: "8",
      },
      {
        id: "support_vip",
        name: "VIP Support",
        description: "Priority chat support within 2 hours",
        icon: "💬",
        value: "2h",
      },
      {
        id: "tournament_access",
        name: "VIP Tournaments",
        description: "Exclusive Gold tournaments",
        icon: "🏆",
        value: "Yes",
      },
    ],
    cashbackRate: 3,
    bonusMultiplier: 2,
    exclusiveGames: [
      "gold_slots_1",
      "gold_slots_2",
      "gold_slots_3",
      "gold_slots_4",
      "gold_slots_5",
      "gold_slots_6",
      "gold_slots_7",
      "gold_slots_8",
    ],
    prioritySupport: true,
    monthlyBonus: 2500,
    birthdayBonus: 5000,
  },
  platinum: {
    tier: "platinum",
    displayName: "Platinum VIP",
    color: "#E5E4E2",
    icon: "💎",
    minSpend: 150000,
    perks: [
      {
        id: "cashback_4",
        name: "4% Cashback",
        description: "Earn 4% cashback on all wins",
        icon: "💰",
        value: "4%",
      },
      {
        id: "bonus_3x",
        name: "3x Bonus Multiplier",
        description: "Triple game multiplier",
        icon: "⚡",
        value: "3x",
      },
      {
        id: "exclusive_games_12",
        name: "15 Exclusive Games",
        description: "Access to Platinum-tier games",
        icon: "🎮",
        value: "15",
      },
      {
        id: "support_platinum",
        name: "Platinum Support",
        description: "Dedicated account manager",
        icon: "👤",
        value: "24/7",
      },
      {
        id: "vip_events",
        name: "VIP Events",
        description: "Exclusive Platinum events",
        icon: "🎉",
        value: "Yes",
      },
      {
        id: "cashout_bonus",
        name: "5% Cashout Bonus",
        description: "Bonus on every cashout",
        icon: "💸",
        value: "5%",
      },
    ],
    cashbackRate: 4,
    bonusMultiplier: 3,
    exclusiveGames: Array.from({ length: 15 }, (_, i) => `platinum_slots_${i + 1}`),
    prioritySupport: true,
    monthlyBonus: 5000,
    birthdayBonus: 10000,
  },
  diamond: {
    tier: "diamond",
    displayName: "Diamond VIP",
    color: "#B9F2FF",
    icon: "💠",
    minSpend: 500000,
    perks: [
      {
        id: "cashback_5",
        name: "5% Cashback",
        description: "Earn 5% cashback on all wins",
        icon: "💰",
        value: "5%",
      },
      {
        id: "bonus_4x",
        name: "4x Bonus Multiplier",
        description: "Quadruple game multiplier",
        icon: "⚡",
        value: "4x",
      },
      {
        id: "exclusive_games_20",
        name: "25 Exclusive Games",
        description: "Access to Diamond-tier games",
        icon: "🎮",
        value: "25",
      },
      {
        id: "support_diamond",
        name: "Diamond Support",
        description: "Personal account manager + concierge",
        icon: "👑",
        value: "24/7",
      },
      {
        id: "private_tournaments",
        name: "Private Tournaments",
        description: "Invite-only Diamond tournaments",
        icon: "🏆",
        value: "Yes",
      },
      {
        id: "cashout_bonus_10",
        name: "10% Cashout Bonus",
        description: "Bonus on every cashout",
        icon: "💸",
        value: "10%",
      },
      {
        id: "comp_tickets",
        name: "Monthly Comp Tickets",
        description: "Free play tickets each month",
        icon: "🎫",
        value: "10",
      },
    ],
    cashbackRate: 5,
    bonusMultiplier: 4,
    exclusiveGames: Array.from({ length: 25 }, (_, i) => `diamond_slots_${i + 1}`),
    prioritySupport: true,
    monthlyBonus: 10000,
    birthdayBonus: 25000,
  },
  elite: {
    tier: "elite",
    displayName: "Elite VIP",
    color: "#FF6B9D",
    icon: "👑",
    minSpend: 1000000,
    perks: [
      {
        id: "cashback_elite",
        name: "7% Cashback",
        description: "Earn 7% cashback on all wins",
        icon: "💰",
        value: "7%",
      },
      {
        id: "bonus_5x",
        name: "5x Bonus Multiplier",
        description: "Maximum game multiplier",
        icon: "⚡",
        value: "5x",
      },
      {
        id: "exclusive_games_all",
        name: "All Games + Exclusive",
        description: "Access to all games including Elite-only",
        icon: "🎮",
        value: "40+",
      },
      {
        id: "support_elite",
        name: "Elite Concierge",
        description: "Dedicated concierge team",
        icon: "👑",
        value: "24/7",
      },
      {
        id: "elite_tournaments",
        name: "Elite Tournaments",
        description: "Exclusive Elite tournaments with mega prizes",
        icon: "🏆",
        value: "Yes",
      },
      {
        id: "cashout_bonus_15",
        name: "15% Cashout Bonus",
        description: "Bonus on every cashout",
        icon: "💸",
        value: "15%",
      },
      {
        id: "elite_comp_tickets",
        name: "Monthly Comp Tickets",
        description: "Free play tickets each month",
        icon: "🎫",
        value: "25",
      },
      {
        id: "personal_manager",
        name: "Personal Manager",
        description: "Dedicated account manager",
        icon: "📱",
        value: "Yes",
      },
    ],
    cashbackRate: 7,
    bonusMultiplier: 5,
    exclusiveGames: Array.from({ length: 40 }, (_, i) => `elite_slots_${i + 1}`),
    prioritySupport: true,
    monthlyBonus: 25000,
    birthdayBonus: 50000,
  },
};

// In-memory storage
const playerVIPStatus = new Map<number, PlayerVIPStatus>();

export async function getOrCreateVIPStatus(playerId: number): Promise<PlayerVIPStatus> {
  if (!playerVIPStatus.has(playerId)) {
    playerVIPStatus.set(playerId, {
      playerId,
      currentTier: "bronze",
      totalSpent: 0,
      progressToNextTier: 0,
      nextTierName: "Silver VIP",
      nextTierMinSpend: 10000,
      perksUnlocked: VIP_TIERS.bronze.perks,
      cashbackEarned: 0,
      monthlyBonusEarned: 0,
    });
  }
  return playerVIPStatus.get(playerId)!;
}

export async function getPlayerVIPStatus(playerId: number): Promise<PlayerVIPStatus> {
  return getOrCreateVIPStatus(playerId);
}

export async function updatePlayerSpend(playerId: number, amount: number): Promise<VIPTier> {
  const status = await getOrCreateVIPStatus(playerId);
  status.totalSpent += amount;

  // Determine new tier
  let newTier: VIPTier = "bronze";
  if (status.totalSpent >= 1000000) {
    newTier = "elite";
  } else if (status.totalSpent >= 500000) {
    newTier = "diamond";
  } else if (status.totalSpent >= 150000) {
    newTier = "platinum";
  } else if (status.totalSpent >= 50000) {
    newTier = "gold";
  } else if (status.totalSpent >= 10000) {
    newTier = "silver";
  }

  if (newTier !== status.currentTier) {
    status.currentTier = newTier;
    status.perksUnlocked = VIP_TIERS[newTier].perks;
    console.log(`[VIP] Player ${playerId} promoted to ${newTier} tier`);
  }

  // Update progress to next tier
  const tierOrder: VIPTier[] = ["bronze", "silver", "gold", "platinum", "diamond", "elite"];
  const currentIndex = tierOrder.indexOf(newTier);
  if (currentIndex < tierOrder.length - 1) {
    const nextTier = tierOrder[currentIndex + 1];
    const nextTierInfo = VIP_TIERS[nextTier];
    status.nextTierName = nextTierInfo.displayName;
    status.nextTierMinSpend = nextTierInfo.minSpend;
    status.progressToNextTier = status.totalSpent - VIP_TIERS[newTier].minSpend;
  }

  return newTier;
}

export async function addCashback(playerId: number, amount: number): Promise<number> {
  const status = await getOrCreateVIPStatus(playerId);
  const tierInfo = VIP_TIERS[status.currentTier];
  const cashbackAmount = Math.floor(amount * (tierInfo.cashbackRate / 100));
  status.cashbackEarned += cashbackAmount;
  console.log(`[VIP] Player ${playerId} earned ${cashbackAmount} GC cashback`);
  return cashbackAmount;
}

export async function claimMonthlyBonus(playerId: number): Promise<number> {
  const status = await getOrCreateVIPStatus(playerId);
  const tierInfo = VIP_TIERS[status.currentTier];
  const bonus = tierInfo.monthlyBonus;
  status.monthlyBonusEarned += bonus;
  console.log(`[VIP] Player ${playerId} claimed ${bonus} GC monthly bonus`);
  return bonus;
}

export async function claimBirthdayBonus(playerId: number): Promise<number> {
  const status = await getOrCreateVIPStatus(playerId);
  const tierInfo = VIP_TIERS[status.currentTier];
  const bonus = tierInfo.birthdayBonus;
  status.lastBirthdayBonus = new Date();
  console.log(`[VIP] Player ${playerId} claimed ${bonus} GC birthday bonus`);
  return bonus;
}

export async function getVIPTierInfo(tier: VIPTier): Promise<VIPTierInfo> {
  return VIP_TIERS[tier];
}

export async function getAllVIPTiers(): Promise<VIPTierInfo[]> {
  return Object.values(VIP_TIERS);
}

export async function getExclusiveGames(playerId: number): Promise<string[]> {
  const status = await getOrCreateVIPStatus(playerId);
  const tierInfo = VIP_TIERS[status.currentTier];
  return tierInfo.exclusiveGames;
}

export async function getVIPStats(): Promise<{
  totalVIPPlayers: number;
  byTier: Record<VIPTier, number>;
  totalCashbackDistributed: number;
  totalBonusesDistributed: number;
}> {
  const stats = {
    totalVIPPlayers: playerVIPStatus.size,
    byTier: {
      bronze: 0,
      silver: 0,
      gold: 0,
      platinum: 0,
      diamond: 0,
      elite: 0,
    },
    totalCashbackDistributed: 0,
    totalBonusesDistributed: 0,
  };

  for (const status of playerVIPStatus.values()) {
    stats.byTier[status.currentTier]++;
    stats.totalCashbackDistributed += status.cashbackEarned;
    stats.totalBonusesDistributed += status.monthlyBonusEarned;
  }

  return stats;
}
