import crypto from "crypto";

export interface WinShareData {
  userId: number;
  gameTitle: string;
  gameName: string;
  winAmount: number;
  multiplier: number;
  betAmount: number;
  currency: "GC" | "SC";
  timestamp: Date;
  gameProvider: string;
}

export interface ShareLink {
  referralCode: string;
  shortUrl: string;
  fullUrl: string;
  expiresAt: Date;
}

/**
 * Generate a referral code for social sharing
 */
export function generateReferralCode(userId: number): string {
  const timestamp = Date.now();
  const random = crypto.randomBytes(4).toString("hex");
  const data = `${userId}_${timestamp}_${random}`;
  return crypto.createHash("sha256").update(data).digest("hex").substring(0, 12).toUpperCase();
}

/**
 * Create a shareable win URL with referral tracking
 */
export function createWinShareUrl(baseUrl: string, win: WinShareData, referralCode: string): string {
  const params = new URLSearchParams({
    ref: referralCode,
    game: win.gameName,
    win: win.winAmount.toString(),
    multiplier: win.multiplier.toFixed(2),
    bet: win.betAmount.toString(),
    currency: win.currency,
    provider: win.gameProvider,
  });

  return `${baseUrl}/share/win?${params.toString()}`;
}

/**
 * Generate Twitter/X share text
 */
export function generateTwitterShareText(win: WinShareData, referralCode: string): string {
  const emoji = win.multiplier >= 10 ? "🤑" : win.multiplier >= 5 ? "💰" : "🎉";
  return `${emoji} Just hit a ${win.multiplier.toFixed(2)}x multiplier on ${win.gameTitle}! Won ${win.winAmount} ${win.currency} 🎰 Join me on CoinKrazy and get a welcome bonus! 🏆 ref:${referralCode}`;
}

/**
 * Generate Facebook share text
 */
export function generateFacebookShareText(win: WinShareData, referralCode: string): string {
  return `I just won ${win.winAmount} ${win.currency} with a ${win.multiplier.toFixed(2)}x multiplier on ${win.gameTitle} at CoinKrazy! 🎰 Join me and claim your welcome bonus! ref:${referralCode}`;
}

/**
 * Generate Instagram share caption
 */
export function generateInstagramShareCaption(win: WinShareData, referralCode: string): string {
  return `🎰 ${win.multiplier.toFixed(2)}x WIN! 🎰\n\nJust crushed it on ${win.gameTitle}! 💰\nWon: ${win.winAmount} ${win.currency}\n\nJoin CoinKrazy and get your welcome bonus! 🏆\n\nref:${referralCode}\n\n#CoinKrazy #CasinoWin #SlotMachine #LuckyDay`;
}

/**
 * Generate TikTok share text
 */
export function generateTikTokShareText(win: WinShareData, referralCode: string): string {
  return `🎰 ${win.multiplier.toFixed(2)}x MULTIPLIER WIN! 🎰\n\nJust won ${win.winAmount} ${win.currency} on ${win.gameTitle}!\n\nJoin CoinKrazy now and get a welcome bonus!\n\nref:${referralCode}\n\n#CoinKrazy #CasinoWin #SlotMachine #Lucky #Gaming`;
}

/**
 * Generate WhatsApp share message
 */
export function generateWhatsAppShareText(win: WinShareData, referralCode: string): string {
  return `🎰 Hey! I just won ${win.winAmount} ${win.currency} with a ${win.multiplier.toFixed(2)}x multiplier on ${win.gameTitle} at CoinKrazy! 💰\n\nJoin me and get a welcome bonus! 🏆\n\nref:${referralCode}`;
}

/**
 * Generate Telegram share message
 */
export function generateTelegramShareText(win: WinShareData, referralCode: string): string {
  return `🎰 <b>${win.multiplier.toFixed(2)}x WIN!</b> 🎰\n\n💰 Won: ${win.winAmount} ${win.currency}\n🎮 Game: ${win.gameTitle}\n🏢 Provider: ${win.gameProvider}\n\n<i>Join CoinKrazy and claim your welcome bonus!</i>\n\n<code>ref:${referralCode}</code>`;
}

/**
 * Generate email share content
 */
export function generateEmailShareContent(
  win: WinShareData,
  referralCode: string,
  baseUrl: string
): { subject: string; body: string } {
  const winUrl = createWinShareUrl(baseUrl, win, referralCode);

  return {
    subject: `🎰 You won ${win.winAmount} ${win.currency} on CoinKrazy! Check this out!`,
    body: `
Hi there!

I just had an amazing win on CoinKrazy! 🎉

Game: ${win.gameTitle}
Multiplier: ${win.multiplier.toFixed(2)}x
Win Amount: ${win.winAmount} ${win.currency}
Bet Amount: ${win.betAmount} ${win.currency}
Provider: ${win.gameProvider}

Join me on CoinKrazy and claim your welcome bonus to start playing!

${winUrl}

Referral Code: ${referralCode}

Good luck! 🍀
    `.trim(),
  };
}

/**
 * Create share links for all platforms
 */
export function createShareLinks(
  baseUrl: string,
  win: WinShareData,
  referralCode: string
): Record<string, { url: string; text: string }> {
  const winUrl = createWinShareUrl(baseUrl, win, referralCode);

  return {
    twitter: {
      url: `https://twitter.com/intent/tweet?text=${encodeURIComponent(generateTwitterShareText(win, referralCode))}&url=${encodeURIComponent(winUrl)}`,
      text: generateTwitterShareText(win, referralCode),
    },
    facebook: {
      url: `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(winUrl)}&quote=${encodeURIComponent(generateFacebookShareText(win, referralCode))}`,
      text: generateFacebookShareText(win, referralCode),
    },
    instagram: {
      url: `https://www.instagram.com/`,
      text: generateInstagramShareCaption(win, referralCode),
    },
    tiktok: {
      url: `https://www.tiktok.com/`,
      text: generateTikTokShareText(win, referralCode),
    },
    whatsapp: {
      url: `https://wa.me/?text=${encodeURIComponent(generateWhatsAppShareText(win, referralCode))}`,
      text: generateWhatsAppShareText(win, referralCode),
    },
    telegram: {
      url: `https://t.me/share/url?url=${encodeURIComponent(winUrl)}&text=${encodeURIComponent(generateTelegramShareText(win, referralCode))}`,
      text: generateTelegramShareText(win, referralCode),
    },
    email: {
      url: `mailto:?subject=${encodeURIComponent(`🎰 You won ${win.winAmount} ${win.currency} on CoinKrazy!`)}&body=${encodeURIComponent(generateEmailShareContent(win, referralCode, baseUrl).body)}`,
      text: generateEmailShareContent(win, referralCode, baseUrl).body,
    },
  };
}

/**
 * Track share event for analytics
 */
export interface ShareEvent {
  userId: number;
  referralCode: string;
  platform: string;
  winAmount: number;
  multiplier: number;
  timestamp: Date;
  ipAddress?: string;
  userAgent?: string;
}

/**
 * Validate referral code format
 */
export function isValidReferralCode(code: string): boolean {
  return /^[A-Z0-9]{12}$/.test(code);
}
