import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; import '../../models/subscription_model.dart'; import '../../services/currency_util.dart'; import '../../providers/locale_provider.dart'; import '../../utils/haptic_feedback_helper.dart'; import '../../theme/app_colors.dart'; import '../glassmorphism_card.dart'; import '../themed_text.dart'; import '../../l10n/app_localizations.dart'; /// 총 지출 요약을 보여주는 카드 위젯 class TotalExpenseSummaryCard extends StatelessWidget { final List subscriptions; final double totalExpense; final AnimationController animationController; const TotalExpenseSummaryCard({ super.key, required this.subscriptions, required this.totalExpense, required this.animationController, }); @override Widget build(BuildContext context) { final locale = context.watch().locale.languageCode; return SliverToBoxAdapter( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: FadeTransition( opacity: CurvedAnimation( parent: animationController, curve: const Interval(0.2, 0.8, curve: Curves.easeOut), ), child: SlideTransition( position: Tween( begin: const Offset(0, 0.2), end: Offset.zero, ).animate(CurvedAnimation( parent: animationController, curve: const Interval(0.2, 0.8, curve: Curves.easeOut), )), child: GlassmorphismCard( blur: 10, opacity: 0.1, borderRadius: 16, child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ ThemedText.headline( text: AppLocalizations.of(context).totalExpenseSummary, style: const TextStyle( fontSize: 18, ), ), IconButton( icon: const Icon(Icons.content_copy), iconSize: 20, padding: EdgeInsets.zero, constraints: const BoxConstraints(), onPressed: () async { final totalExpenseText = CurrencyUtil.formatTotalAmountWithLocale( totalExpense, locale); await Clipboard.setData( ClipboardData(text: totalExpenseText)); HapticFeedbackHelper.lightImpact(); if (!context.mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(AppLocalizations.of(context) .totalExpenseCopied(totalExpenseText)), duration: const Duration(seconds: 2), behavior: SnackBarBehavior.floating, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), backgroundColor: AppColors.glassBackground .withValues(alpha: 0.3), margin: const EdgeInsets.symmetric( horizontal: 16, vertical: 8, ), ), ); }, ), ], ), const SizedBox(height: 8), ThemedText.subtitle( text: AppLocalizations.of(context).monthlyTotalAmount, style: const TextStyle( fontSize: 14, ), ), const SizedBox(height: 16), Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ThemedText.caption( text: AppLocalizations.of(context).totalExpense, style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 4), ThemedText( CurrencyUtil.formatTotalAmountWithLocale( totalExpense, locale), style: const TextStyle( fontSize: 26, fontWeight: FontWeight.bold, letterSpacing: -0.5, ), ), ], ), ), const SizedBox(width: 16), Expanded( child: Column( children: [ Row( children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: AppColors.glassBackground .withValues(alpha: 0.3), borderRadius: BorderRadius.circular(8), border: Border.all( color: AppColors.glassBorder .withValues(alpha: 0.2), ), ), child: const FaIcon( FontAwesomeIcons.listCheck, size: 16, color: AppColors.primaryColor, ), ), const SizedBox(width: 12), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ThemedText.caption( text: AppLocalizations.of(context) .totalServices, style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 2), ThemedText( AppLocalizations.of(context) .subscriptionCount( subscriptions.length), style: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, ), ), ], ), ], ), const SizedBox(height: 12), Row( children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: AppColors.glassBackground .withValues(alpha: 0.3), borderRadius: BorderRadius.circular(8), border: Border.all( color: AppColors.glassBorder .withValues(alpha: 0.2), ), ), child: const FaIcon( FontAwesomeIcons.chartLine, size: 16, color: AppColors.successColor, ), ), const SizedBox(width: 12), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ThemedText.caption( text: AppLocalizations.of(context) .averageCost, style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 2), ThemedText( CurrencyUtil .formatTotalAmountWithLocale( subscriptions.isEmpty ? 0 : totalExpense / subscriptions.length, locale), style: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, ), ), ], ), ], ), ], ), ), ], ), ], ), ), ), ), ), ), ); } }