// homehub-data.jsx — i18n strings + mock state for the Home Hub (رختکن).
// Active-player snapshot: 24 cards, lineup partially built, missions live.

// ─── i18n ──────────────────────────────────────────────────────────────────
const HH_I18N = {
  fa: {
    // AppBar
    greetingMorning: 'صبح بخیر،',
    greetingAfternoon: 'ظهر بخیر،',
    greetingEvening: 'عصر بخیر،',
    greetingNight: 'شب بخیر،',
    level: 'سطح',
    coinShort: 'سکه',
    xpShort: 'XP',
    streakDay: 'روز',
    notifications: 'اعلان‌ها',
    menu: 'منو',
    search: 'جستجو',
    // BottomNav
    navHome: 'خانه',
    navPredict: 'پیش‌بینی',
    navLineup: 'ترکیب',
    navCards: 'رختکن',
    navLeaderboard: 'جدول',
    navShop: 'فروشگاه',
    // ─── Prediction Hero (entry to the economy: predict matches → earn coins)
    predictTitle: 'پیش‌بینی فعال',
    predictHeadline: (n) => `${n} بازی منتظر پیش‌بینیته`,
    predictTotalReward: (coins) => `تا ${coins} سکه`,
    predictNextLock: 'قفل بعدی',
    predictCount: (n) => `${n} پیش‌بینی فعال`,
    predictMatchReward: (coins) => `تا ${coins} سکه`,
    predictCta: 'پیش‌بینی کن',
    predictAllCta: 'همه بازی‌ها',
    predictKick: 'شروع بازی',
    home: 'خانه',
    away: 'مهمان',
    vs: 'مقابل',
    sponsorLED: 'با حمایت',
    // ─── Submit Status tile (separate concern: deck → submit → XP)
    submitTileTitle: 'ترکیب هفته',
    submitTileReady: 'ترکیب آماده',
    submitTilePartial: (n, of) => `${n} از ${of} کارت آماده`,
    submitTileEmpty: 'هنوز کارتی نچیدی',
    submitTileCountdown: 'تا Submit رایگان',
    submitTileCta: 'ادامه چینش',
    submitTileCtaReady: 'ثبت ترکیب',
    submitTileFree: 'رایگان',
    // ─── Coin/Pack tile
    coinTileTitle: 'سکه و پک',
    coinTileBalance: 'موجودی سکه',
    coinTilePackHint: (n) => `${n} پک رایگان منتظره`,
    coinTilePackCta: 'فروشگاه',
    // Stats
    statsTitle: 'آمار من',
    statXP: 'XP',
    statXPNext: (n) => `تا سطح بعد ${n}`,
    statRank: 'رتبه جهانی',
    statRankDelta: (n) => `${n >= 0 ? '+' : ''}${n} هفته‌ی پیش`,
    statStreak: 'روز متوالی',
    statStreakHint: 'ادامه بده!',
    statWinrate: 'برد هفته اخیر',
    statWinrateHint: 'میانگین: ',
    // Quick actions
    quickTitle: 'اکشن سریع',
    qaPredict: 'پیش‌بینی بازی',
    qaPredictSub: '۴ بازی منتظره',
    qaOpenPack: 'باز کردن پک',
    qaOpenPackSub: '۱ پک رایگان',
    qaInvite: 'دعوت دوست',
    qaInviteSub: '۵۰۰ سکه جایزه',
    // Featured
    featuredTitle: 'کارت‌های ویژه',
    featuredSub: 'منتخب امروز از کلکسیون تو',
    featuredAll: 'مشاهده همه',
    badgeNew: 'جدید',
    badgeBonus: 'بنوس',
    badgeRare: 'نادر',
    badgeMission: 'مأموریت',
    // Missions
    missionsTitle: 'مأموریت‌های فعال',
    missionsGoldenTag: 'مأموریت طلایی',
    missionsGoldenTitle: 'ترکیب طلایی هفته',
    missionsGoldenDesc: 'این ۵ کارت رو کامل کن و ۷,۵۰۰ XP ثابت بگیر.',
    missionsGoldenProgress: (have, total) => `${have} از ${total} کارت`,
    missionsGoldenTimer: 'فرصت باقی‌مانده',
    missionsGoldenCta: 'دیدن کارت‌ها',
    missionsGoldenCta2: 'باز کردن پک',
    missionsDaily: 'روزانه',
    missionsWeekly: 'هفتگی',
    missionsAll: 'همه مأموریت‌ها',
    // Pack callout
    packTitle: 'پک امروز',
    packSub: 'با تخفیف ویژه ۲۴ ساعته',
    packCta: 'دیدن فروشگاه',
    packPrice: 'سکه ۲,۴۰۰',
    packPriceWas: '۳,۰۰۰',
    // Sponsor
    sponsorTagline: 'با حمایت',
    sponsorMissionTag: 'مأموریت اسپانسری',
    sponsorMissionCta: 'دیدن مأموریت',
    // Empty
    emptyTitle: 'به رختکن خوش آمدی!',
    emptyBody: 'پک اولت رو باز کن و اولین کارت‌ها رو به دست بیار.',
    emptyCta: 'باز کردن پک اول',
    // Misc
    seeAll: 'مشاهده همه',
    seeMore: 'بیشتر',
    // Date
    timeLeft: 'باقی‌مانده',
  },
  en: {
    greetingMorning: 'Good morning,', greetingAfternoon: 'Good afternoon,',
    greetingEvening: 'Good evening,', greetingNight: 'Good night,',
    level: 'LVL', coinShort: 'COIN', xpShort: 'XP', streakDay: 'd',
    notifications: 'Notifications', menu: 'Menu', search: 'Search',
    navHome: 'Home', navPredict: 'Predict', navLineup: 'Lineup',
    navCards: 'Locker', navLeaderboard: 'Rank', navShop: 'Shop',
    predictTitle: 'Active prediction',
    predictHeadline: (n) => `${n} matches waiting`,
    predictTotalReward: (coins) => `up to ${coins} coin`,
    predictNextLock: 'Next lock',
    predictCount: (n) => `${n} open predictions`,
    predictMatchReward: (coins) => `up to ${coins} coin`,
    predictCta: 'Predict',
    predictAllCta: 'All matches',
    predictKick: 'Kick-off',
    home: 'Home', away: 'Away',
    vs: 'vs', sponsorLED: 'Sponsored by',
    submitTileTitle: "Week's deck",
    submitTileReady: 'Deck ready',
    submitTilePartial: (n, of) => `${n} of ${of} cards`,
    submitTileEmpty: 'No cards picked yet',
    submitTileCountdown: 'Free submit in',
    submitTileCta: 'Continue',
    submitTileCtaReady: 'Submit',
    submitTileFree: 'Free',
    coinTileTitle: 'Coin & Pack',
    coinTileBalance: 'Coin balance',
    coinTilePackHint: (n) => `${n} free pack waiting`,
    coinTilePackCta: 'Shop',
    statsTitle: 'My stats', statXP: 'XP',
    statXPNext: (n) => `${n} to next level`,
    statRank: 'Global rank',
    statRankDelta: (n) => `${n >= 0 ? '+' : ''}${n} last week`,
    statStreak: 'day streak', statStreakHint: 'Keep going!',
    statWinrate: 'Win rate', statWinrateHint: 'avg ',
    quickTitle: 'Quick actions',
    qaPredict: 'Predict', qaPredictSub: '4 matches open',
    qaOpenPack: 'Open pack', qaOpenPackSub: '1 free pack',
    qaInvite: 'Invite friend', qaInviteSub: '500 coin bonus',
    featuredTitle: 'Featured cards', featuredSub: "Today's picks from your collection",
    featuredAll: 'See all',
    badgeNew: 'NEW', badgeBonus: 'BONUS', badgeRare: 'RARE', badgeMission: 'MISSION',
    missionsTitle: 'Active missions',
    missionsGoldenTag: 'GOLDEN MISSION', missionsGoldenTitle: 'Lineup of the week',
    missionsGoldenDesc: 'Complete this 5-card set and earn a flat 7,500 XP.',
    missionsGoldenProgress: (have, total) => `${have} of ${total} cards`,
    missionsGoldenTimer: 'Time left',
    missionsGoldenCta: 'View cards', missionsGoldenCta2: 'Open pack',
    missionsDaily: 'Daily', missionsWeekly: 'Weekly', missionsAll: 'All missions',
    packTitle: 'Pack of the day', packSub: '24h limited offer',
    packCta: 'Open shop', packPrice: '2,400 coin', packPriceWas: '3,000',
    sponsorTagline: 'Sponsored by',
    sponsorMissionTag: 'SPONSORED MISSION', sponsorMissionCta: 'View mission',
    emptyTitle: 'Welcome to Locker!',
    emptyBody: 'Open your first pack and start your collection.',
    emptyCta: 'Open first pack',
    seeAll: 'See all', seeMore: 'More', timeLeft: 'left',
  },
  ar: {
    greetingMorning: 'صباح الخير،', greetingAfternoon: 'مساء الخير،',
    greetingEvening: 'مساء الخير،', greetingNight: 'تصبح على خير،',
    level: 'مستوى', coinShort: 'عملة', xpShort: 'XP', streakDay: 'يوم',
    notifications: 'الإشعارات', menu: 'القائمة', search: 'بحث',
    navHome: 'الرئيسية', navPredict: 'توقعات', navLineup: 'التشكيلة',
    navCards: 'خزانة', navLeaderboard: 'الترتيب', navShop: 'متجر',
    predictTitle: 'توقع نشط',
    predictHeadline: (n) => `${n} مباريات بانتظار توقعك`,
    predictTotalReward: (coins) => `حتى ${coins} عملة`,
    predictNextLock: 'الإغلاق التالي',
    predictCount: (n) => `${n} توقعات مفتوحة`,
    predictMatchReward: (coins) => `حتى ${coins} عملة`,
    predictCta: 'توقع الآن',
    predictAllCta: 'كل المباريات',
    predictKick: 'بدء المباراة',
    home: 'مضيف', away: 'ضيف',
    vs: 'ضد', sponsorLED: 'برعاية',
    submitTileTitle: 'تشكيلة الأسبوع',
    submitTileReady: 'التشكيلة جاهزة',
    submitTilePartial: (n, of) => `${n} من ${of} بطاقات`,
    submitTileEmpty: 'لم تختر بطاقات بعد',
    submitTileCountdown: 'Submit مجاني خلال',
    submitTileCta: 'متابعة',
    submitTileCtaReady: 'تأكيد',
    submitTileFree: 'مجاني',
    coinTileTitle: 'العملات والحزم',
    coinTileBalance: 'رصيد العملات',
    coinTilePackHint: (n) => `${n} حزمة مجانية بانتظارك`,
    coinTilePackCta: 'المتجر',
    statsTitle: 'إحصائياتي', statXP: 'XP',
    statXPNext: (n) => `${n} للمستوى التالي`,
    statRank: 'الترتيب العالمي',
    statRankDelta: (n) => `${n >= 0 ? '+' : ''}${n} الأسبوع الماضي`,
    statStreak: 'أيام متتالية', statStreakHint: 'استمر!',
    statWinrate: 'نسبة الفوز', statWinrateHint: 'متوسط ',
    quickTitle: 'إجراءات سريعة',
    qaPredict: 'توقع المباراة', qaPredictSub: '٤ مباريات بانتظارك',
    qaOpenPack: 'فتح حزمة', qaOpenPackSub: 'حزمة مجانية',
    qaInvite: 'دعوة صديق', qaInviteSub: '٥٠٠ عملة',
    featuredTitle: 'بطاقات مميزة', featuredSub: 'مختارة لك اليوم',
    featuredAll: 'عرض الكل',
    badgeNew: 'جديد', badgeBonus: 'مكافأة', badgeRare: 'نادر', badgeMission: 'مهمة',
    missionsTitle: 'المهام النشطة',
    missionsGoldenTag: 'مهمة ذهبية', missionsGoldenTitle: 'تشكيلة الأسبوع',
    missionsGoldenDesc: 'أكمل هذه البطاقات الـ٥ واحصل على ٧٬٥٠٠ نقطة خبرة.',
    missionsGoldenProgress: (have, total) => `${have} من ${total} بطاقة`,
    missionsGoldenTimer: 'الوقت المتبقي',
    missionsGoldenCta: 'عرض البطاقات', missionsGoldenCta2: 'فتح حزمة',
    missionsDaily: 'يومي', missionsWeekly: 'أسبوعي', missionsAll: 'كل المهام',
    packTitle: 'حزمة اليوم', packSub: 'عرض محدود ٢٤ ساعة',
    packCta: 'افتح المتجر', packPrice: '٢٬٤٠٠ عملة', packPriceWas: '٣٬٠٠٠',
    sponsorTagline: 'برعاية',
    sponsorMissionTag: 'مهمة برعاية', sponsorMissionCta: 'عرض المهمة',
    emptyTitle: 'أهلاً بك في الخزانة!',
    emptyBody: 'افتح حزمتك الأولى وابدأ مجموعتك.',
    emptyCta: 'افتح أول حزمة',
    seeAll: 'عرض الكل', seeMore: 'المزيد', timeLeft: 'متبقي',
  },
};

// ─── Greeting helper (deterministic for screenshots) ──────────────────────
function hhGreeting(locale, hour = 11) {
  const ll = HH_I18N[locale];
  if (hour < 6)  return ll.greetingNight;
  if (hour < 12) return ll.greetingMorning;
  if (hour < 17) return ll.greetingAfternoon;
  if (hour < 21) return ll.greetingEvening;
  return ll.greetingNight;
}

// ─── Mock active-player state ──────────────────────────────────────────────
// Names are localized: each value is { fa, en, ar }.
const HH_USER = {
  displayName: { fa: 'علی محمدی', en: 'Ali Mohammadi', ar: 'علي محمدي' },
  shortName:   { fa: 'علی', en: 'Ali', ar: 'علي' },
  avatarInitial: 'ع',
  level: 24,
  xpInLevel: 3200,
  xpForLevel: 5000,
  xpTotal: 45200,
  globalRank: 324,
  rankDelta: 18,   // +18 = better
  streak: 7,
  winRate: 0.62,
  weekAvgScore: 482,
  coinBalance: 12450,
  unreadNotifications: 3,
  totalCards: 24,
};

// Featured matches carousel for the Hub. Each entry surfaces ENOUGH for the
// user to recognize the match + decide whether to predict — full prediction
// details live in the swipe-up sheet (Prediction Hub screen, not this scope).
//
// Reward range = max coin payout summed across all open prediction items
// for that match (per design doc §11: Final Score, Total Goals, BTTS, etc).
const HH_PREDICTIONS = {
  matches: [
    {
      id: 'mw28-per-est',
      home:  { fa: 'پرسپولیس', en: 'Persepolis', ar: 'بيرسبوليس', code: 'PER', color: '#DC2626' },
      away:  { fa: 'استقلال',  en: 'Esteghlal',  ar: 'إستقلال',   code: 'EST', color: '#1D4ED8' },
      league: { fa: 'لیگ برتر · هفته ۲۸', en: 'Persian Gulf · MW28', ar: 'الدوري · الأسبوع ٢٨' },
      leagueShort: { fa: 'لیگ برتر', en: 'PGPL', ar: 'الدوري' },
      venue: { fa: 'تهران · آزادی', en: 'Tehran · Azadi', ar: 'طهران · آزادي' },
      dateJalali:   { fa: '۲۹ اردیبهشت ۱۴۰۵', en: 'Ordibehesht 29, 1405', ar: '٢٩ أرديبهشت ١٤٠٥' },
      dateGregorian: 'May 19, 2026',
      kickoff: { fa: '۱۹:۳۰', en: '19:30', ar: '١٩:٣٠' },
      hours: 3, minutes: 42, seconds: 10,
      // Number of open prediction items: Final Score, Total Goals, BTTS, …
      predictionCount: 5,
      rewardMax: 480,           // sum of max payouts across all items
      featured: true,           // emphasized "DERBY" style framing
      tag: { fa: 'دربی', en: 'Derby', ar: 'دربي' },
    },
    {
      id: 'cl-rma-bar',
      home:  { fa: 'رئال مادرید', en: 'Real Madrid', ar: 'ريال مدريد', code: 'RMA', color: '#FFFFFF' },
      away:  { fa: 'بارسلونا',    en: 'Barcelona',   ar: 'برشلونة',    code: 'BAR', color: '#A50044' },
      league: { fa: 'لیگ قهرمانان · نیمه‌نهایی', en: 'Champions League · SF', ar: 'دوري الأبطال · النصف' },
      leagueShort: { fa: 'لیگ قهرمانان', en: 'UCL', ar: 'الأبطال' },
      venue: { fa: 'مادرید · سانتیاگو برنابئو', en: 'Madrid · Bernabéu', ar: 'مدريد · بيرنابيو' },
      dateJalali:   { fa: '۳۰ اردیبهشت ۱۴۰۵', en: 'Ordibehesht 30, 1405', ar: '٣٠ أرديبهشت ١٤٠٥' },
      dateGregorian: 'May 20, 2026',
      kickoff: { fa: '۲۳:۰۰', en: '23:00', ar: '٢٣:٠٠' },
      hours: 27, minutes: 12, seconds: 30,
      predictionCount: 6,
      rewardMax: 620,
      featured: true,
      tag: { fa: 'الکلاسیکو', en: 'El Clásico', ar: 'كلاسيكو' },
    },
    {
      id: 'epl-mci-liv',
      home:  { fa: 'منچستر سیتی', en: 'Man City',  ar: 'مانشستر سيتي', code: 'MCI', color: '#6CABDD' },
      away:  { fa: 'لیورپول',      en: 'Liverpool', ar: 'ليفربول',     code: 'LIV', color: '#C8102E' },
      league: { fa: 'لیگ جزیره · هفته ۳۶', en: 'Premier League · MW36', ar: 'البريميرليج · ٣٦' },
      leagueShort: { fa: 'لیگ جزیره', en: 'EPL', ar: 'البريميرليج' },
      venue: { fa: 'منچستر · اتحاد', en: 'Manchester · Etihad', ar: 'مانشستر · اتحاد' },
      dateJalali:   { fa: '۱ خرداد ۱۴۰۵', en: 'Khordad 1, 1405', ar: '١ خرداد ١٤٠٥' },
      dateGregorian: 'May 22, 2026',
      kickoff: { fa: '۱۸:۳۰', en: '18:30', ar: '١٨:٣٠' },
      hours: 76, minutes: 0, seconds: 0,
      predictionCount: 4,
      rewardMax: 340,
      featured: false,
    },
    {
      id: 'ir-fri',
      home:  { fa: 'ایران',  en: 'Iran',   ar: 'إيران',  code: 'IRN', color: '#239F40' },
      away:  { fa: 'ژاپن',    en: 'Japan',  ar: 'اليابان', code: 'JPN', color: '#BC002D' },
      league: { fa: 'دوستانه · ملی', en: 'International friendly', ar: 'ودية دولية' },
      leagueShort: { fa: 'دوستانه', en: 'Friendly', ar: 'ودية' },
      venue: { fa: 'تهران · آزادی', en: 'Tehran · Azadi', ar: 'طهران · آزادي' },
      dateJalali:   { fa: '۲ خرداد ۱۴۰۵', en: 'Khordad 2, 1405', ar: '٢ خرداد ١٤٠٥' },
      dateGregorian: 'May 23, 2026',
      kickoff: { fa: '۲۰:۰۰', en: '20:00', ar: '٢٠:٠٠' },
      hours: 102, minutes: 30, seconds: 0,
      predictionCount: 3,
      rewardMax: 240,
      featured: false,
    },
  ],
  // Total across all matches — shown as the global "تا ۲,۵۰۰ سکه" headline
  rewardTotal: 2500,
  // Time until the next prediction LOCK (the earliest match to kick off)
  nextLock: { h: 3, m: 24, s: 10 },
};

// Deck / Submit status — separate concern from Prediction. Drives SubmitStatusTile.
const HH_DECK = {
  ready: 3,       // cards picked
  total: 5,       // formation size
  // Time until the next FREE submit window opens (hours:minutes:seconds)
  freeIn: { h: 0, m: 42, s: 10 },
  // Or `null` if already free — set to false if you want a "ready now" state
  freeNow: false,
};

// Featured cards reference 2 recent + 2 bonus + 1 rare (5 total).
// We pull real player names/teams from MyCards INVENTORY where available;
// fallback to inline defaults if the inventory isn't loaded yet.
function hhFeatured(locale = 'fa') {
  // Read live inventory if loaded
  const inv = (typeof window !== 'undefined' && Array.isArray(window.INVENTORY))
    ? window.INVENTORY : [];
  // Helpers
  const pick = (pred) => inv.find(pred);
  const pickPlayer = (tier, position) => pick((it) =>
    it.type === 'player' && it.card.tier === tier && it.card.position === position);

  // Curated picks
  const picks = [
    { item: pickPlayer('platinum', 'FWD'), badge: 'new' },
    { item: pickPlayer('gold',     'MID'), badge: 'bonus' },
    { item: pickPlayer('gold',     'DEF'), badge: 'bonus' },
    { item: pickPlayer('silver',   'GK'),  badge: 'rare' },
    { item: pickPlayer('silver',   'MID'), badge: 'new' },
  ].filter((p) => p.item);

  // Fallback static cards in case INVENTORY is empty
  if (picks.length < 5) {
    const fallback = [
      { tier: 'platinum', position: 'FWD', overall: 92, statKey: 'att', statValue: 91,
        playerName: { fa: 'مسی', en: 'Messi', ar: 'ميسي' },
        teamName:   { fa: 'آرژانتین', en: 'Argentina', ar: 'الأرجنتين' },
        image: 'assets/mes.webp', badge: 'new' },
      { tier: 'gold', position: 'MID', overall: 88, statKey: 'mid', statValue: 87,
        playerName: { fa: 'مودریچ', en: 'Modrić', ar: 'مودريتش' },
        teamName:   { fa: 'کرواسی', en: 'Croatia', ar: 'كرواتيا' },
        image: 'assets/player.png', badge: 'bonus' },
      { tier: 'gold', position: 'DEF', overall: 85, statKey: 'def', statValue: 86,
        playerName: { fa: 'وان دایک', en: 'Van Dijk', ar: 'فان دايك' },
        teamName:   { fa: 'هلند', en: 'Netherlands', ar: 'هولندا' },
        image: 'assets/player.png', badge: 'bonus' },
      { tier: 'silver', position: 'GK', overall: 79, statKey: 'gk', statValue: 80,
        playerName: { fa: 'علیرضا بیرانوند', en: 'Beiranvand', ar: 'بيرانوند' },
        teamName:   { fa: 'ایران', en: 'Iran', ar: 'إيران' },
        image: 'assets/player.png', badge: 'rare' },
      { tier: 'silver', position: 'MID', overall: 76, statKey: 'mid', statValue: 75,
        playerName: { fa: 'گرگ', en: 'Gerg', ar: 'جيرج' },
        teamName:   { fa: 'آلمان', en: 'Germany', ar: 'ألمانيا' },
        image: 'assets/player.png', badge: 'new' },
    ];
    return fallback.map((f) => ({ ...f, _fallback: true }));
  }

  return picks.map(({ item, badge }) => ({
    _instance: item.instance_id,
    tier: item.card.tier,
    position: item.card.position,
    overall: item.card.overall,
    statKey: item.card.statKey || (item.card.position === 'FWD' ? 'att' :
             item.card.position === 'DEF' ? 'def' :
             item.card.position === 'GK'  ? 'gk'  : 'mid'),
    statValue: item.card.statValue ?? item.card.overall - 1,
    // COLLECTION uses `name` / `team`, each a { fa, en, ar } locale map.
    playerName: item.card.name || item.card.playerName,
    teamName:   item.card.team || item.card.teamName,
    image:      item.card.image,
    badge,
    _inventoryItem: item,
  }));
}

// Missions: 1 golden (expanded) + 2 daily (compact). Golden = sponsored
// optionally; we mark daily[0] as "sponsored" to fulfil the placement decision.
const HH_MISSIONS = {
  golden: {
    id: 'golden-week',
    title: {
      fa: 'ترکیب طلایی هفته', en: 'Lineup of the week', ar: 'تشكيلة الأسبوع',
    },
    desc: {
      fa: 'این ۵ کارت رو کامل کن و ۷,۵۰۰ XP ثابت بگیر.',
      en: 'Complete this 5-card set and earn a flat 7,500 XP.',
      ar: 'أكمل هذه البطاقات الـ٥ واحصل على ٧٬٥٠٠ نقطة خبرة.',
    },
    have: 3, total: 5,
    // Hours:minutes:seconds remaining (deterministic for screenshots)
    hours: 12, minutes: 42, seconds: 30,
    rewardXP: 7500,
    // Mini-cards: 3 owned (silver/gold/gold) + 2 missing slots
    slots: [
      { state: 'owned', tier: 'gold' },
      { state: 'owned', tier: 'silver' },
      { state: 'owned', tier: 'gold' },
      { state: 'missing', tier: 'gold' },
      { state: 'missing', tier: 'platinum' },
    ],
  },
  daily: [
    {
      id: 'd-login',
      sponsored: 'mci',         // ← sponsor placement: همراه اول
      sponsoredMission: true,
      title: {
        fa: 'ورود ۷ روز متوالی', en: '7-day login streak', ar: 'تسجيل دخول ٧ أيام',
      },
      progress: 4, total: 7,
      reward: { fa: 'کارت آلمان', en: 'Germany fan card', ar: 'بطاقة ألمانيا' },
    },
    {
      id: 'd-submit',
      sponsored: null,
      title: {
        fa: 'ثبت ۳ ترکیب امروز', en: 'Submit 3 lineups today', ar: 'قدم ٣ تشكيلات اليوم',
      },
      progress: 1, total: 3,
      reward: { fa: 'XP ۵۰۰', en: '500 XP', ar: '٥٠٠ XP' },
    },
  ],
};

// Sponsors — copy from Lineup/MyCards (kept independent so this file
// is self-contained when ported to production).
const HH_SPONSORS = {
  mci:  { brand: { fa: 'همراه اول', en: 'MCI', ar: 'إم سي آي' },
          tag:  { fa: 'با حمایت همراه اول', en: 'Sponsored by MCI', ar: 'برعاية MCI' },
          tagline: { fa: 'بسته ویژه فوتبال‌دوستان',
                     en: 'Football-fan data pack',
                     ar: 'باقة بيانات لعشاق كرة القدم' },
          accent: '#E11D48' },
  blu:  { brand: { fa: 'بلوبانک', en: 'Blubank', ar: 'بلوبانك' },
          tag:  { fa: 'با حمایت بلوبانک', en: 'Sponsored by Blubank', ar: 'برعاية بلوبانك' },
          tagline: { fa: 'کارت اعتباری بازی',
                     en: 'Match-day credit card',
                     ar: 'بطاقة ائتمان لأيام المباريات' },
          accent: '#2563EB' },
  mili: { brand: { fa: 'میلی گلد', en: 'Mili Gold', ar: 'ميلي غولد' },
          tag:  { fa: 'با حمایت میلی گلد', en: 'Sponsored by Mili Gold', ar: 'برعاية ميلي غولد' },
          tagline: { fa: 'سرمایه‌گذاری در طلا',
                     en: 'Invest in gold today',
                     ar: 'استثمر في الذهب' },
          accent: '#EAB308' },
};

// Bottom nav definitions — order in array = visual order in RTL
function hhNavTabs(locale, fiveTabs = false) {
  const ll = HH_I18N[locale];
  const all = [
    { key: 'home',  label: ll.navHome,        icon: 'home',  active: true },
    { key: 'predict', label: ll.navPredict,   icon: 'predict' },
    { key: 'lineup', label: ll.navLineup,     icon: 'lineup' },
    { key: 'cards', label: ll.navCards,       icon: 'cards' },
    { key: 'leaderboard', label: ll.navLeaderboard, icon: 'rank' },
    { key: 'shop',  label: ll.navShop,        icon: 'shop' },
  ];
  return fiveTabs ? all.filter((t) => t.key !== 'cards') : all;
}

// Mark a notif dot on Predict (4 matches open) and on Leaderboard (rank up).
const HH_NAV_BADGES = {
  predict: 4,
  // cards: 0, leaderboard: 0, shop: 0,
};

// Export to window
Object.assign(window, {
  HH_I18N, HH_USER, HH_PREDICTIONS, HH_DECK, HH_MISSIONS, HH_SPONSORS,
  HH_NAV_BADGES,
  hhGreeting, hhFeatured, hhNavTabs,
});
