import 'package:flutter/material.dart'; import '../../../../core/theme/app_theme.dart'; /// دیالوگِ استریکِ روزانه به سبکِ دولینگو: شعله‌ی بزرگ + شمارِ روز + نوارِ /// پیشرفتِ هفتگی به‌سویِ پاداشِ ۵۰۰ سکه‌ای + دکمه‌ی دریافت. class StreakDialog extends StatelessWidget { final int streak; final int best; final bool ready; final int nextReward; final VoidCallback onClaim; const StreakDialog({ super.key, required this.streak, required this.best, required this.ready, required this.nextReward, required this.onClaim, }); static Future show( BuildContext context, { required int streak, required int best, required bool ready, required int nextReward, required VoidCallback onClaim, }) { return showDialog( context: context, barrierColor: Colors.black.withValues(alpha: 0.7), builder: (_) => StreakDialog( streak: streak, best: best, ready: ready, nextReward: nextReward, onClaim: onClaim, ), ); } @override Widget build(BuildContext context) { // پیشرفت تا پاداشِ هفتگی (۷تایی). اگر روی مضربِ ۷ باشد، کاملِ ۷. int weekProg = streak % 7; if (weekProg == 0 && streak > 0) weekProg = 7; final toBonus = 7 - weekProg; return Dialog( backgroundColor: Colors.transparent, insetPadding: const EdgeInsets.symmetric(horizontal: 28, vertical: 40), child: Container( padding: const EdgeInsets.fromLTRB(20, 24, 20, 20), decoration: BoxDecoration( gradient: const LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [AppColors.lapisMid, AppColors.lapisLo], ), borderRadius: BorderRadius.circular(24), border: Border.all(color: AppColors.gold, width: 1.8), boxShadow: [ BoxShadow( color: const Color(0xFFFF7A1A).withValues(alpha: 0.25), blurRadius: 26), ], ), child: Column( mainAxisSize: MainAxisSize.min, children: [ // شعله‌ی بزرگ با عددِ استریک. SizedBox( height: 118, child: Stack( alignment: Alignment.center, children: [ const Icon(Icons.local_fire_department, color: Color(0xFFFF7A1A), size: 118), Padding( padding: const EdgeInsets.only(top: 22), child: Text( '$streak', style: const TextStyle( color: Colors.white, fontSize: 44, fontWeight: FontWeight.w900, shadows: [Shadow(color: Colors.black45, blurRadius: 6)], ), ), ), ], ), ), const SizedBox(height: 4), Text( streak > 0 ? '$streak روز پیاپی!' : 'زنجیره‌ات رو شروع کن', style: const TextStyle( color: AppColors.gold, fontSize: 20, fontWeight: FontWeight.bold), ), const SizedBox(height: 2), Text('بهترین رکورد: $best روز', style: const TextStyle(color: Colors.white54, fontSize: 12)), const SizedBox(height: 18), // نوارِ پیشرفتِ هفتگی. Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), decoration: BoxDecoration( color: Colors.black.withValues(alpha: 0.22), borderRadius: BorderRadius.circular(16), border: Border.all(color: AppColors.goldFaint), ), child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ for (var i = 0; i < 7; i++) _dayCell(i, weekProg), ], ), const SizedBox(height: 10), Text( toBonus == 0 ? '🎉 امروز پاداشِ هفتگی +۵۰۰ سکه!' : '$toBonus روز تا پاداشِ هفتگی (+۵۰۰ سکه)', style: const TextStyle(color: Colors.white70, fontSize: 12), ), ], ), ), const SizedBox(height: 18), // دکمه‌ی دریافت / وضعیتِ دریافت‌شده. SizedBox( width: double.infinity, child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: ready ? AppColors.success : AppColors.lapisHi, padding: const EdgeInsets.symmetric(vertical: 13), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(14), side: const BorderSide(color: AppColors.gold, width: 1.3), ), ), onPressed: ready ? () { Navigator.pop(context); onClaim(); } : null, child: ready ? Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Text('دریافت هدیه', style: TextStyle( color: Colors.white, fontSize: 15, fontWeight: FontWeight.bold)), const SizedBox(width: 8), const Icon(Icons.monetization_on, color: AppColors.gold, size: 20), const SizedBox(width: 3), Text('+$nextReward', style: const TextStyle( color: Colors.white, fontSize: 15, fontWeight: FontWeight.bold)), ], ) : const Text('فردا دوباره سر بزن ✓', style: TextStyle( color: Colors.white70, fontSize: 14, fontWeight: FontWeight.bold)), ), ), const SizedBox(height: 6), TextButton( onPressed: () => Navigator.pop(context), child: const Text('بستن', style: TextStyle(color: Colors.white38, fontSize: 13)), ), ], ), ), ); } // یک خانه‌ی روز در نوارِ هفتگی. خانه‌های پرشده تا weekProg شعله دارند؛ خانه‌ی // پایانی (روزِ هفتم) پاداشِ سکه‌ای است. Widget _dayCell(int i, int weekProg) { final done = i < weekProg; final isBonus = i == 6; final Color bg = done ? (isBonus ? AppColors.gold : const Color(0xFFFF7A1A)) : AppColors.lapisHi; return Column( children: [ Container( width: 32, height: 32, decoration: BoxDecoration( color: bg.withValues(alpha: done ? 1 : 0.35), shape: BoxShape.circle, border: Border.all( color: done ? AppColors.gold : Colors.white24, width: done ? 1.4 : 1, ), ), child: Icon( isBonus ? Icons.monetization_on : (done ? Icons.local_fire_department : Icons.circle_outlined), color: done ? Colors.white : Colors.white38, size: isBonus ? 18 : 16, ), ), const SizedBox(height: 4), Text('${i + 1}', style: const TextStyle(color: Colors.white38, fontSize: 10)), ], ); } }