import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import '../providers/subscription_provider.dart'; import '../theme/app_colors.dart'; import 'animated_wave_background.dart'; import 'glassmorphism_card.dart'; /// 메인 화면 상단에 표시되는 요약 카드 위젯 /// /// 총 구독 수와 월별 총 지출을 표시합니다. class MainScreenSummaryCard extends StatelessWidget { final SubscriptionProvider provider; final AnimationController fadeController; final AnimationController pulseController; final AnimationController waveController; final AnimationController slideController; const MainScreenSummaryCard({ Key? key, required this.provider, required this.fadeController, required this.pulseController, required this.waveController, required this.slideController, }) : super(key: key); @override Widget build(BuildContext context) { final double monthlyCost = provider.totalMonthlyExpense; final double yearlyCost = monthlyCost * 12; final int totalSubscriptions = provider.subscriptions.length; final double eventSavings = provider.totalEventSavings; final int activeEvents = provider.activeEventSubscriptions.length; return FadeTransition( opacity: Tween(begin: 0.0, end: 1.0).animate( CurvedAnimation(parent: fadeController, curve: Curves.easeIn)), child: Padding( padding: const EdgeInsets.fromLTRB(20, 16, 20, 4), child: GlassmorphismCard( borderRadius: 24, blur: 15, backgroundColor: AppColors.glassCard, gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: AppColors.mainGradient .map((color) => color.withValues(alpha: 0.2)) .toList(), ), border: Border.all( color: AppColors.glassBorder, width: 1, ), child: Container( width: double.infinity, constraints: BoxConstraints( minHeight: 180, maxHeight: activeEvents > 0 ? 300 : 240, ), decoration: BoxDecoration( borderRadius: BorderRadius.circular(24), color: Colors.transparent, ), child: ClipRRect( borderRadius: BorderRadius.circular(24), child: Stack( children: [ // 애니메이션 웨이브 배경 Positioned.fill( child: AnimatedWaveBackground( controller: waveController, pulseController: pulseController, ), ), Padding( padding: const EdgeInsets.all(24.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Text( '이번 달 총 구독 비용', style: TextStyle( color: AppColors .darkNavy, // color.md 가이드: 밝은 배경 위 어두운 텍스트 fontSize: 15, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 8), Row( crossAxisAlignment: CrossAxisAlignment.baseline, textBaseline: TextBaseline.alphabetic, children: [ Text( NumberFormat.currency( locale: 'ko_KR', symbol: '', decimalDigits: 0, ).format(monthlyCost), style: const TextStyle( color: AppColors .darkNavy, // color.md 가이드: 밝은 배경 위 어두운 텍스트 fontSize: 32, fontWeight: FontWeight.bold, letterSpacing: -1, ), ), const SizedBox(width: 4), Text( '원', style: TextStyle( color: AppColors .darkNavy, // color.md 가이드: 밝은 배경 위 어두운 텍스트 fontSize: 16, fontWeight: FontWeight.w500, ), ), ], ), const SizedBox(height: 16), Row( children: [ _buildInfoBox( context, title: '예상 연간 구독 비용', value: '${NumberFormat.currency( locale: 'ko_KR', symbol: '', decimalDigits: 0, ).format(yearlyCost)}원', ), const SizedBox(width: 16), _buildInfoBox( context, title: '총 구독 서비스', value: '$totalSubscriptions개', ), ], ), // 이벤트 절약액 표시 if (activeEvents > 0) ...[ const SizedBox(height: 12), Container( padding: const EdgeInsets.symmetric( vertical: 10, horizontal: 14), decoration: BoxDecoration( gradient: LinearGradient( colors: [ Colors.white.withValues(alpha: 0.2), Colors.white.withValues(alpha: 0.15), ], ), borderRadius: BorderRadius.circular(12), border: Border.all( color: AppColors.primaryColor .withValues(alpha: 0.3), width: 1, ), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Container( padding: const EdgeInsets.all(6), decoration: BoxDecoration( color: Colors.white.withValues(alpha: 0.25), shape: BoxShape.circle, ), child: const Icon( Icons.local_offer_rounded, size: 14, color: AppColors .primaryColor, // color.md 가이드: 밝은 배경 위 딥 블루 아이콘 ), ), const SizedBox(width: 10), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '이벤트 할인 중', style: TextStyle( color: AppColors .darkNavy, // color.md 가이드: 밝은 배경 위 어두운 텍스트 fontSize: 11, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 2), Row( children: [ Text( NumberFormat.currency( locale: 'ko_KR', symbol: '₩', decimalDigits: 0, ).format(eventSavings), style: const TextStyle( color: AppColors .primaryColor, // color.md 가이드: 밝은 배경 위 딥 블루 강조 fontSize: 14, fontWeight: FontWeight.bold, ), ), Text( ' 절약 ($activeEvents개)', style: TextStyle( color: AppColors .navyGray, // color.md 가이드: 밝은 배경 위 서브 텍스트 fontSize: 12, fontWeight: FontWeight.w500, ), ), ], ), ], ), ], ), ), ], ], ), ), ], ), ), ), ), ), ); } Widget _buildInfoBox(BuildContext context, {required String title, required String value}) { return Expanded( child: Container( padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), decoration: BoxDecoration( color: AppColors.glassBackground, borderRadius: BorderRadius.circular(12), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( title, style: TextStyle( color: AppColors.navyGray, // color.md 가이드: 밝은 배경 위 서브 텍스트 fontSize: 12, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 4), Text( value, style: const TextStyle( color: AppColors.darkNavy, // color.md 가이드: 밝은 배경 위 어두운 텍스트 fontSize: 14, fontWeight: FontWeight.bold, ), ), ], ), ), ); } }