/**
 * Tiered Referral Bonus System
 * 1 SC per referral for both referrer and referee
 */

export interface ReferralBonus {
  referrerId: number;
  refereeId: number;
  referralCode: string;
  bonusAmount: number; // 1 SC per referral
  referrerBonusAmount: number; // 1 SC for referrer
  refereeBonusAmount: number; // 1 SC for referee
  status: 'pending' | 'completed' | 'cancelled';
  createdAt: Date;
  completedAt?: Date;
}

export interface ReferralStats {
  totalReferrals: number;
  completedReferrals: number;
  pendingReferrals: number;
  totalEarned: number;
  referralCode: string;
  referralLink: string;
}

/**
 * Referral Bonus Configuration
 * ENFORCED SITEWIDE:
 * - Referrer receives: 1 SC per successful referral
 * - Referee receives: 1 SC on first deposit or game play
 * - No tier limits - unlimited referrals
 * - Bonus credited immediately upon completion
 */
export const REFERRAL_BONUS_CONFIG = {
  referrerBonus: 1, // 1 SC per referral
  refereeBonus: 1, // 1 SC for new player
  minDepositForCompletion: 0, // Any activity completes the referral
  maxReferralsPerDay: 100, // Prevent abuse
  bonusExpiryDays: 30, // Bonus expires after 30 days if not claimed
};

/**
 * Calculate referral bonuses
 */
export function calculateReferralBonuses(referralCount: number): {
  referrerBonus: number;
  totalEarned: number;
} {
  return {
    referrerBonus: referralCount * REFERRAL_BONUS_CONFIG.referrerBonus,
    totalEarned: referralCount * REFERRAL_BONUS_CONFIG.referrerBonus,
  };
}

/**
 * Validate referral eligibility
 */
export function validateReferralEligibility(
  referrerId: number,
  refereeId: number,
  referralCount: number
): { valid: boolean; reason?: string } {
  if (referrerId === refereeId) {
    return { valid: false, reason: 'Cannot refer yourself' };
  }

  if (referralCount >= REFERRAL_BONUS_CONFIG.maxReferralsPerDay) {
    return { valid: false, reason: 'Daily referral limit reached' };
  }

  return { valid: true };
}

/**
 * Generate referral code
 */
export function generateReferralCode(userId: number): string {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  let code = `REF${userId}`;
  for (let i = 0; i < 6; i++) {
    code += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return code;
}

/**
 * Get referral stats for user
 */
export async function getReferralStats(userId: number): Promise<ReferralStats> {
  // TODO: Fetch from database
  return {
    totalReferrals: 0,
    completedReferrals: 0,
    pendingReferrals: 0,
    totalEarned: 0,
    referralCode: generateReferralCode(userId),
    referralLink: `https://coinkrazy.com/join?ref=${generateReferralCode(userId)}`,
  };
}

/**
 * Process referral bonus
 */
export async function processReferralBonus(
  referrerId: number,
  refereeId: number
): Promise<ReferralBonus> {
  const referralCode = generateReferralCode(referrerId);
  
  return {
    referrerId,
    refereeId,
    referralCode,
    bonusAmount: REFERRAL_BONUS_CONFIG.referrerBonus + REFERRAL_BONUS_CONFIG.refereeBonus,
    referrerBonusAmount: REFERRAL_BONUS_CONFIG.referrerBonus,
    refereeBonusAmount: REFERRAL_BONUS_CONFIG.refereeBonus,
    status: 'pending',
    createdAt: new Date(),
  };
}

/**
 * Complete referral bonus
 */
export async function completeReferralBonus(
  referrerId: number,
  refereeId: number
): Promise<ReferralBonus> {
  return {
    referrerId,
    refereeId,
    referralCode: generateReferralCode(referrerId),
    bonusAmount: REFERRAL_BONUS_CONFIG.referrerBonus + REFERRAL_BONUS_CONFIG.refereeBonus,
    referrerBonusAmount: REFERRAL_BONUS_CONFIG.referrerBonus,
    refereeBonusAmount: REFERRAL_BONUS_CONFIG.refereeBonus,
    status: 'completed',
    createdAt: new Date(),
    completedAt: new Date(),
  };
}
