import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import '../../../common/theme/theme.dart'; // Models (simplified) class DrawEvent { final String id; final String name; final String description; final int entryPoints; final String icon; final Color primaryColor; final String prize; final String prizeValue; final DateTime drawDate; final int totalParticipants; final int hadiah; final String status; // 'active', 'ended' final int minSpending; DrawEvent({ required this.id, required this.name, required this.description, required this.entryPoints, required this.icon, required this.primaryColor, required this.prize, required this.prizeValue, required this.drawDate, required this.totalParticipants, required this.hadiah, required this.status, required this.minSpending, }); bool get isActive => status == 'active'; } class UserEntry { final String drawId; final DateTime entryDate; UserEntry({required this.drawId, required this.entryDate}); } @RoutePage() class DrawPage extends StatefulWidget { const DrawPage({super.key}); @override State createState() => _DrawPageState(); } class _DrawPageState extends State { String selectedTab = 'active'; // 'active' or 'finished' final List userEntries = [ UserEntry( drawId: "1", entryDate: DateTime.now().subtract(Duration(hours: 3)), ), ]; final List drawEvents = [ DrawEvent( id: "1", name: "Emas 3 Gram", description: "Gebyar Undian Enaklo\nMenangkan hadiah menarik", entryPoints: 0, icon: "👑", primaryColor: AppColor.primary, prize: "Emas 3 Gram", prizeValue: "Rp 2.500.000", drawDate: DateTime.now().add(Duration(hours: 1, minutes: 20)), totalParticipants: 0, hadiah: 2, status: 'active', minSpending: 50000, ), DrawEvent( id: "2", name: "iPhone 15 Pro", description: "Undian Smartphone Premium\nDapatkan iPhone terbaru", entryPoints: 0, icon: "📱", primaryColor: AppColor.info, prize: "iPhone 15 Pro", prizeValue: "Rp 18.000.000", drawDate: DateTime.now().subtract(Duration(days: 1)), totalParticipants: 156, hadiah: 1, status: 'ended', minSpending: 100000, ), ]; List get filteredDraws { return drawEvents.where((draw) { if (selectedTab == 'active') { return draw.isActive; } else { return !draw.isActive; } }).toList(); } bool _isUserEntered(String drawId) { return userEntries.any((entry) => entry.drawId == drawId); } String _getTimeRemaining(DateTime targetDate) { final now = DateTime.now(); final difference = targetDate.difference(now); if (difference.isNegative) return "Berakhir"; if (difference.inHours > 0) { return "${difference.inHours}h ${difference.inMinutes % 60}m"; } else if (difference.inMinutes > 0) { return "${difference.inMinutes}m"; } else { return "Sekarang!"; } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColor.background, appBar: AppBar(title: Text("Undian")), body: Column( children: [ // Tab selector Container( margin: EdgeInsets.all(16), decoration: BoxDecoration( color: AppColor.surface, borderRadius: BorderRadius.circular(25), boxShadow: [ BoxShadow( color: AppColor.black.withOpacity(0.05), blurRadius: 8, offset: Offset(0, 2), ), ], ), child: Row( children: [ Expanded( child: GestureDetector( onTap: () => setState(() => selectedTab = 'active'), child: Container( padding: EdgeInsets.symmetric(vertical: 12), decoration: BoxDecoration( color: selectedTab == 'active' ? AppColor.primary : Colors.transparent, borderRadius: BorderRadius.circular(25), ), child: Text( "Aktif (${drawEvents.where((d) => d.isActive).length})", textAlign: TextAlign.center, style: AppStyle.md.copyWith( color: selectedTab == 'active' ? AppColor.textWhite : AppColor.textSecondary, fontWeight: FontWeight.w600, ), ), ), ), ), Expanded( child: GestureDetector( onTap: () => setState(() => selectedTab = 'finished'), child: Container( padding: EdgeInsets.symmetric(vertical: 12), decoration: BoxDecoration( color: selectedTab == 'finished' ? AppColor.primary : Colors.transparent, borderRadius: BorderRadius.circular(25), ), child: Text( "Selesai (${drawEvents.where((d) => !d.isActive).length})", textAlign: TextAlign.center, style: AppStyle.md.copyWith( color: selectedTab == 'finished' ? AppColor.textWhite : AppColor.textSecondary, fontWeight: FontWeight.w600, ), ), ), ), ), ], ), ), // Draw list Expanded( child: ListView.builder( padding: EdgeInsets.symmetric(horizontal: 16), itemCount: filteredDraws.length, itemBuilder: (context, index) { final draw = filteredDraws[index]; return _buildSimpleDrawCard(draw); }, ), ), ], ), ); } Widget _buildSimpleDrawCard(DrawEvent draw) { _isUserEntered(draw.id); final timeRemaining = _getTimeRemaining(draw.drawDate); return Container( margin: EdgeInsets.only(bottom: 16), decoration: BoxDecoration( color: AppColor.surface, borderRadius: BorderRadius.circular(12), boxShadow: [ BoxShadow( color: AppColor.black.withOpacity(0.08), blurRadius: 12, offset: Offset(0, 4), ), ], ), child: Column( children: [ // Header with gradient background Container( height: 160, width: double.infinity, decoration: BoxDecoration( gradient: LinearGradient( colors: [draw.primaryColor, draw.primaryColor.withOpacity(0.8)], begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.vertical(top: Radius.circular(12)), ), child: Stack( children: [ // Background pattern (coins and gold bar) Positioned( right: 20, top: 20, child: Opacity( opacity: 0.3, child: Column( children: [ Row( children: [ _buildCoin(), SizedBox(width: 8), _buildCoin(), ], ), SizedBox(height: 8), _buildGoldBar(), ], ), ), ), // Content Padding( padding: EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (draw.isActive) Container( padding: EdgeInsets.symmetric( horizontal: 8, vertical: 4, ), decoration: BoxDecoration( color: AppColor.success, borderRadius: BorderRadius.circular(4), ), child: Text( "AKTIF", style: AppStyle.xs.copyWith( color: AppColor.textWhite, fontWeight: FontWeight.bold, ), ), ), SizedBox(height: 8), Text( "MAKAN\nDAPAT", style: AppStyle.h5.copyWith( color: AppColor.textWhite, fontWeight: FontWeight.bold, height: 0.9, ), ), SizedBox(height: 4), Text( draw.description, style: AppStyle.sm.copyWith(color: AppColor.textWhite), ), ], ), ), ], ), ), // Card content Padding( padding: EdgeInsets.all(16), child: Column( children: [ // Prize info Row( children: [ Text(draw.icon, style: AppStyle.h5), SizedBox(width: 8), Text( draw.prize, style: AppStyle.lg.copyWith( fontWeight: FontWeight.bold, color: AppColor.textPrimary, ), ), ], ), SizedBox(height: 16), // Stats row Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Column( children: [ Text( "-", style: AppStyle.h5.copyWith( fontWeight: FontWeight.bold, color: AppColor.textPrimary, ), ), Text( "Peserta", style: AppStyle.sm.copyWith( color: AppColor.textSecondary, ), ), ], ), Column( children: [ Text( "${draw.hadiah}", style: AppStyle.h5.copyWith( fontWeight: FontWeight.bold, color: AppColor.textPrimary, ), ), Text( "Hadiah", style: AppStyle.sm.copyWith( color: AppColor.textSecondary, ), ), ], ), Column( children: [ Text( "0", style: AppStyle.h5.copyWith( fontWeight: FontWeight.bold, color: AppColor.error, ), ), Text( "Voucher Anda", style: AppStyle.sm.copyWith( color: AppColor.textSecondary, ), ), ], ), ], ), SizedBox(height: 16), // Timer if (draw.isActive) Row( children: [ Icon(Icons.access_time, color: AppColor.error, size: 16), SizedBox(width: 4), Text( "Berakhir dalam:", style: AppStyle.md.copyWith( color: AppColor.textPrimary, ), ), Spacer(), Text( timeRemaining, style: AppStyle.lg.copyWith( fontWeight: FontWeight.bold, color: AppColor.error, ), ), ], ), SizedBox(height: 12), // Spending requirement GestureDetector( onTap: () => _showSpendingInfo(draw), child: Container( padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16), decoration: BoxDecoration( color: AppColor.backgroundLight, borderRadius: BorderRadius.circular(8), border: Border.all(color: AppColor.borderLight, width: 1), ), child: Row( children: [ Expanded( child: Text( "Belanja min. Rp ${_formatCurrency(draw.minSpending)} untuk berpartisipasi", style: AppStyle.sm.copyWith( color: AppColor.textSecondary, ), ), ), Icon( Icons.chevron_right, color: AppColor.textSecondary, size: 16, ), ], ), ), ), ], ), ), ], ), ); } Widget _buildCoin() { return Container( width: 20, height: 20, decoration: BoxDecoration( color: AppColor.warning, shape: BoxShape.circle, border: Border.all(color: Colors.yellow, width: 1), ), child: Center( child: Text( "₹", style: AppStyle.xs.copyWith( color: Colors.orange[800], fontWeight: FontWeight.bold, ), ), ), ); } Widget _buildGoldBar() { return Container( width: 30, height: 15, decoration: BoxDecoration( color: AppColor.warning, borderRadius: BorderRadius.circular(2), border: Border.all(color: Colors.yellow, width: 1), ), child: Center( child: Text( "GOLD", style: TextStyle( color: Colors.orange[800], fontSize: 6, fontWeight: FontWeight.bold, ), ), ), ); } String _formatCurrency(int amount) { return amount.toString().replaceAllMapped( RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), (Match m) => '${m[1]}.', ); } void _showSpendingInfo(DrawEvent draw) { showDialog( context: context, builder: (context) => AlertDialog( backgroundColor: AppColor.surface, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), title: Text( "Syarat Partisipasi", style: AppStyle.lg.copyWith( fontWeight: FontWeight.w600, color: AppColor.textPrimary, ), ), content: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Untuk mengikuti undian ${draw.name}, Anda perlu:", style: AppStyle.md.copyWith(color: AppColor.textPrimary), ), SizedBox(height: 12), Row( children: [ Icon(Icons.shopping_cart, color: draw.primaryColor, size: 20), SizedBox(width: 8), Expanded( child: Text( "Belanja minimum Rp ${_formatCurrency(draw.minSpending)}", style: AppStyle.md.copyWith( fontWeight: FontWeight.w600, color: AppColor.textPrimary, ), ), ), ], ), SizedBox(height: 8), Row( children: [ Icon(Icons.schedule, color: draw.primaryColor, size: 20), SizedBox(width: 8), Expanded( child: Text( "Sebelum ${_formatDateTime(draw.drawDate)}", style: AppStyle.md.copyWith( fontWeight: FontWeight.w600, color: AppColor.textPrimary, ), ), ), ], ), ], ), actions: [ TextButton( onPressed: () => Navigator.of(context).pop(), child: Text( "Mengerti", style: AppStyle.md.copyWith( color: AppColor.primary, fontWeight: FontWeight.w600, ), ), ), ], ), ); } String _formatDateTime(DateTime date) { return "${date.day}/${date.month}/${date.year} ${date.hour.toString().padLeft(2, '0')}:${date.minute.toString().padLeft(2, '0')}"; } }