/**
 * Admin Analytics System
 * Comprehensive analytics for platform monitoring and decision making
 */

export interface PlayerMetrics {
  totalPlayers: number;
  activePlayers: number;
  newPlayersToday: number;
  newPlayersThisWeek: number;
  newPlayersThisMonth: number;
  churnRate: number;
  averageSessionDuration: number;
  averageDailyActiveUsers: number;
}

export interface RevenueMetrics {
  totalRevenue: number;
  dailyRevenue: number;
  weeklyRevenue: number;
  monthlyRevenue: number;
  averageRevenuePerUser: number;
  averageRevenuePerSession: number;
  totalDeposits: number;
  totalWithdrawals: number;
}

export interface GameMetrics {
  gameId: string;
  gameName: string;
  totalPlays: number;
  uniquePlayers: number;
  averagePlayDuration: number;
  totalWagered: number;
  totalWon: number;
  houseEdge: number;
  playerRetentionRate: number;
}

export interface FraudMetrics {
  suspiciousAccounts: number;
  blockedTransactions: number;
  reportedAccounts: number;
  detectedBotAccounts: number;
  chargebackRate: number;
  duplicateAccountsDetected: number;
}

export interface EngagementMetrics {
  dailyActiveUsers: number;
  weeklyActiveUsers: number;
  monthlyActiveUsers: number;
  averageSessionsPerUser: number;
  bounceRate: number;
  returnPlayerRate: number;
  featureUsageRate: Record<string, number>;
}

export interface AdminDashboard {
  timestamp: Date;
  players: PlayerMetrics;
  revenue: RevenueMetrics;
  games: GameMetrics[];
  fraud: FraudMetrics;
  engagement: EngagementMetrics;
  topGames: GameMetrics[];
  topPlayers: Array<{
    userId: number;
    username: string;
    totalSpend: number;
    totalWon: number;
    sessions: number;
  }>;
  alerts: Alert[];
}

export interface Alert {
  id: string;
  severity: 'low' | 'medium' | 'high' | 'critical';
  type: string;
  message: string;
  createdAt: Date;
  resolved: boolean;
  resolvedAt?: Date;
}

/**
 * Calculate player metrics
 */
export function calculatePlayerMetrics(
  totalPlayers: number,
  activePlayers: number,
  newPlayersToday: number,
  newPlayersThisWeek: number,
  newPlayersThisMonth: number,
  churnedPlayers: number,
  totalSessions: number,
  totalSessionDuration: number
): PlayerMetrics {
  return {
    totalPlayers,
    activePlayers,
    newPlayersToday,
    newPlayersThisWeek,
    newPlayersThisMonth,
    churnRate: totalPlayers > 0 ? (churnedPlayers / totalPlayers) * 100 : 0,
    averageSessionDuration: totalSessions > 0 ? totalSessionDuration / totalSessions : 0,
    averageDailyActiveUsers: activePlayers,
  };
}

/**
 * Calculate revenue metrics
 */
export function calculateRevenueMetrics(
  totalRevenue: number,
  dailyRevenue: number,
  weeklyRevenue: number,
  monthlyRevenue: number,
  totalPlayers: number,
  totalSessions: number,
  totalDeposits: number,
  totalWithdrawals: number
): RevenueMetrics {
  return {
    totalRevenue,
    dailyRevenue,
    weeklyRevenue,
    monthlyRevenue,
    averageRevenuePerUser: totalPlayers > 0 ? totalRevenue / totalPlayers : 0,
    averageRevenuePerSession: totalSessions > 0 ? totalRevenue / totalSessions : 0,
    totalDeposits,
    totalWithdrawals,
  };
}

/**
 * Calculate game metrics
 */
export function calculateGameMetrics(
  gameId: string,
  gameName: string,
  totalPlays: number,
  uniquePlayers: number,
  totalPlayDuration: number,
  totalWagered: number,
  totalWon: number,
  playerRetentionCount: number
): GameMetrics {
  return {
    gameId,
    gameName,
    totalPlays,
    uniquePlayers,
    averagePlayDuration: totalPlays > 0 ? totalPlayDuration / totalPlays : 0,
    totalWagered,
    totalWon,
    houseEdge: totalWagered > 0 ? ((totalWagered - totalWon) / totalWagered) * 100 : 0,
    playerRetentionRate: uniquePlayers > 0 ? (playerRetentionCount / uniquePlayers) * 100 : 0,
  };
}

/**
 * Calculate fraud metrics
 */
export function calculateFraudMetrics(
  suspiciousAccounts: number,
  blockedTransactions: number,
  reportedAccounts: number,
  detectedBotAccounts: number,
  chargebacks: number,
  totalTransactions: number,
  duplicateAccountsDetected: number
): FraudMetrics {
  return {
    suspiciousAccounts,
    blockedTransactions,
    reportedAccounts,
    detectedBotAccounts,
    chargebackRate: totalTransactions > 0 ? (chargebacks / totalTransactions) * 100 : 0,
    duplicateAccountsDetected,
  };
}

/**
 * Calculate engagement metrics
 */
export function calculateEngagementMetrics(
  dailyActiveUsers: number,
  weeklyActiveUsers: number,
  monthlyActiveUsers: number,
  totalSessions: number,
  totalPlayers: number,
  bouncedSessions: number,
  returningPlayers: number,
  featureUsage: Record<string, number>
): EngagementMetrics {
  const featureUsageRate: Record<string, number> = {};
  for (const [feature, usage] of Object.entries(featureUsage)) {
    featureUsageRate[feature] = totalPlayers > 0 ? (usage / totalPlayers) * 100 : 0;
  }

  return {
    dailyActiveUsers,
    weeklyActiveUsers,
    monthlyActiveUsers,
    averageSessionsPerUser: totalPlayers > 0 ? totalSessions / totalPlayers : 0,
    bounceRate: totalSessions > 0 ? (bouncedSessions / totalSessions) * 100 : 0,
    returnPlayerRate: totalPlayers > 0 ? (returningPlayers / totalPlayers) * 100 : 0,
    featureUsageRate,
  };
}

/**
 * Generate admin dashboard
 */
export function generateAdminDashboard(
  players: PlayerMetrics,
  revenue: RevenueMetrics,
  games: GameMetrics[],
  fraud: FraudMetrics,
  engagement: EngagementMetrics,
  topPlayers: Array<{
    userId: number;
    username: string;
    totalSpend: number;
    totalWon: number;
    sessions: number;
  }>,
  alerts: Alert[]
): AdminDashboard {
  const topGames = games.sort((a, b) => b.totalPlays - a.totalPlays).slice(0, 5);

  return {
    timestamp: new Date(),
    players,
    revenue,
    games,
    fraud,
    engagement,
    topGames,
    topPlayers: topPlayers.slice(0, 10),
    alerts: alerts.filter((a) => !a.resolved),
  };
}

/**
 * Detect anomalies and generate alerts
 */
export function detectAnomalies(dashboard: AdminDashboard): Alert[] {
  const alerts: Alert[] = [];

  // Check for unusual churn rate
  if (dashboard.players.churnRate > 15) {
    alerts.push({
      id: `alert_churn_${Date.now()}`,
      severity: 'high',
      type: 'churn_rate',
      message: `High churn rate detected: ${dashboard.players.churnRate.toFixed(2)}%`,
      createdAt: new Date(),
      resolved: false,
    });
  }

  // Check for fraud indicators
  if (dashboard.fraud.suspiciousAccounts > 10) {
    alerts.push({
      id: `alert_fraud_${Date.now()}`,
      severity: 'critical',
      type: 'suspicious_accounts',
      message: `${dashboard.fraud.suspiciousAccounts} suspicious accounts detected`,
      createdAt: new Date(),
      resolved: false,
    });
  }

  // Check for high chargeback rate
  if (dashboard.fraud.chargebackRate > 2) {
    alerts.push({
      id: `alert_chargebacks_${Date.now()}`,
      severity: 'high',
      type: 'high_chargebacks',
      message: `High chargeback rate: ${dashboard.fraud.chargebackRate.toFixed(2)}%`,
      createdAt: new Date(),
      resolved: false,
    });
  }

  // Check for low engagement
  if (dashboard.engagement.returnPlayerRate < 30) {
    alerts.push({
      id: `alert_engagement_${Date.now()}`,
      severity: 'medium',
      type: 'low_engagement',
      message: `Low return player rate: ${dashboard.engagement.returnPlayerRate.toFixed(2)}%`,
      createdAt: new Date(),
      resolved: false,
    });
  }

  // Check for game performance issues
  for (const game of dashboard.games) {
    if (game.houseEdge < 2) {
      alerts.push({
        id: `alert_game_${game.gameId}_${Date.now()}`,
        severity: 'medium',
        type: 'low_house_edge',
        message: `${game.gameName} has low house edge: ${game.houseEdge.toFixed(2)}%`,
        createdAt: new Date(),
        resolved: false,
      });
    }
  }

  // Check for revenue decline
  if (dashboard.revenue.dailyRevenue < dashboard.revenue.monthlyRevenue / 30 * 0.7) {
    alerts.push({
      id: `alert_revenue_${Date.now()}`,
      severity: 'medium',
      type: 'revenue_decline',
      message: `Daily revenue below average`,
      createdAt: new Date(),
      resolved: false,
    });
  }

  return alerts;
}

/**
 * Get player cohort analysis
 */
export interface CohortAnalysis {
  cohortDate: Date;
  cohortSize: number;
  day1Retention: number;
  day7Retention: number;
  day30Retention: number;
  averageLifetimeValue: number;
}

export function analyzeCohorts(
  cohortDate: Date,
  cohortSize: number,
  day1Retained: number,
  day7Retained: number,
  day30Retained: number,
  totalLifetimeValue: number
): CohortAnalysis {
  return {
    cohortDate,
    cohortSize,
    day1Retention: cohortSize > 0 ? (day1Retained / cohortSize) * 100 : 0,
    day7Retention: cohortSize > 0 ? (day7Retained / cohortSize) * 100 : 0,
    day30Retention: cohortSize > 0 ? (day30Retained / cohortSize) * 100 : 0,
    averageLifetimeValue: cohortSize > 0 ? totalLifetimeValue / cohortSize : 0,
  };
}

/**
 * Generate performance report
 */
export interface PerformanceReport {
  period: 'daily' | 'weekly' | 'monthly';
  playerGrowth: number;
  revenueGrowth: number;
  engagementScore: number;
  healthScore: number;
  recommendations: string[];
}

export function generatePerformanceReport(
  dashboard: AdminDashboard,
  previousDashboard: AdminDashboard,
  period: 'daily' | 'weekly' | 'monthly'
): PerformanceReport {
  const playerGrowth = previousDashboard.players.totalPlayers > 0
    ? ((dashboard.players.totalPlayers - previousDashboard.players.totalPlayers) / previousDashboard.players.totalPlayers) * 100
    : 0;

  const revenueGrowth = previousDashboard.revenue.totalRevenue > 0
    ? ((dashboard.revenue.totalRevenue - previousDashboard.revenue.totalRevenue) / previousDashboard.revenue.totalRevenue) * 100
    : 0;

  const engagementScore = (dashboard.engagement.returnPlayerRate + dashboard.engagement.dailyActiveUsers / dashboard.players.totalPlayers * 100) / 2;
  const healthScore = Math.max(0, 100 - dashboard.fraud.suspiciousAccounts - dashboard.players.churnRate);

  const recommendations: string[] = [];

  if (playerGrowth < 0) {
    recommendations.push('Player growth is declining. Consider promotional campaigns.');
  }

  if (revenueGrowth < 0) {
    recommendations.push('Revenue is declining. Review game performance and player retention.');
  }

  if (dashboard.players.churnRate > 15) {
    recommendations.push('High churn rate. Implement retention strategies.');
  }

  if (dashboard.fraud.suspiciousAccounts > 10) {
    recommendations.push('Multiple suspicious accounts detected. Review fraud prevention measures.');
  }

  if (engagementScore < 50) {
    recommendations.push('Low engagement. Introduce new features or events.');
  }

  return {
    period,
    playerGrowth,
    revenueGrowth,
    engagementScore,
    healthScore,
    recommendations,
  };
}
