import 'package:flutter/material.dart'; import '../../controllers/add_subscription_controller.dart'; import '../common/form_fields/currency_input_field.dart'; import '../common/form_fields/date_picker_field.dart'; import '../../theme/app_colors.dart'; import '../../l10n/app_localizations.dart'; /// 구독 추가 화면의 이벤트/할인 섹션 class AddSubscriptionEventSection extends StatelessWidget { final AddSubscriptionController controller; final Animation fadeAnimation; final Animation slideAnimation; final Function setState; const AddSubscriptionEventSection({ super.key, required this.controller, required this.fadeAnimation, required this.slideAnimation, required this.setState, }); @override Widget build(BuildContext context) { return FadeTransition( opacity: Tween(begin: 0.0, end: 1.0).animate( CurvedAnimation( parent: controller.animationController!, curve: const Interval(0.4, 1.0, curve: Curves.easeIn), ), ), child: SlideTransition( position: Tween( begin: const Offset(0.0, 0.5), end: Offset.zero, ).animate(CurvedAnimation( parent: controller.animationController!, curve: const Interval(0.4, 1.0, curve: Curves.easeOutCubic), )), child: Container( margin: const EdgeInsets.only(bottom: 20), padding: const EdgeInsets.all(24), decoration: BoxDecoration( color: AppColors.glassCard, borderRadius: BorderRadius.circular(20), border: Border.all( color: AppColors.glassBorder.withValues(alpha: 0.1), width: 1, ), boxShadow: [ BoxShadow( color: AppColors.shadowBlack, blurRadius: 10, offset: const Offset(0, 4), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: controller.gradientColors[0].withValues(alpha: 0.1), borderRadius: BorderRadius.circular(12), ), child: Icon( Icons.local_offer_rounded, color: controller.gradientColors[0], size: 24, ), ), const SizedBox(width: 12), Builder( builder: (context) { final locale = Localizations.localeOf(context); String titleText; switch (locale.languageCode) { case 'ko': titleText = '이벤트 가격'; break; case 'ja': titleText = 'イベント価格'; break; case 'zh': titleText = '活动价格'; break; default: titleText = 'Event Price'; } return Text( titleText, style: const TextStyle( fontSize: 18, fontWeight: FontWeight.w700, color: AppColors.darkNavy, ), ); }, ), ], ), Switch.adaptive( value: controller.isEventActive, onChanged: (value) { setState(() { controller.isEventActive = value; if (!controller.isEventActive) { // 이벤트 비활성화 시 관련 데이터 초기화 controller.eventStartDate = null; controller.eventEndDate = null; controller.eventPriceController.clear(); } }); }, activeColor: controller.gradientColors[0], ), ], ), // 이벤트 활성화 시 추가 필드 표시 AnimatedContainer( duration: const Duration(milliseconds: 300), height: controller.isEventActive ? null : 0, child: AnimatedOpacity( duration: const Duration(milliseconds: 300), opacity: controller.isEventActive ? 1.0 : 0.0, child: Column( children: [ const SizedBox(height: 20), // 이벤트 설명 Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: AppColors.infoColor.withValues(alpha: 0.08), borderRadius: BorderRadius.circular(12), border: Border.all( color: AppColors.infoColor.withValues(alpha: 0.3), width: 1, ), ), child: Row( children: [ Icon( Icons.info_outline_rounded, color: AppColors.infoColor, size: 20, ), const SizedBox(width: 8), Expanded( child: Builder( builder: (context) { final locale = Localizations.localeOf(context); String infoText; switch (locale.languageCode) { case 'ko': infoText = '할인 또는 프로모션 가격을 설정하세요'; break; case 'ja': infoText = '割引またはプロモーション価格を設定してください'; break; case 'zh': infoText = '设置折扣或促销价格'; break; default: infoText = 'Set up discount or promotion price'; } return Text( infoText, style: TextStyle( fontSize: 14, color: AppColors.darkNavy, fontWeight: FontWeight.w500, ), ); }, ), ), ], ), ), const SizedBox(height: 20), // 이벤트 기간 Builder( builder: (context) { final locale = Localizations.localeOf(context); String startLabel; String endLabel; switch (locale.languageCode) { case 'ko': startLabel = '시작일'; endLabel = '종료일'; break; case 'ja': startLabel = '開始日'; endLabel = '終了日'; break; case 'zh': startLabel = '开始日期'; endLabel = '结束日期'; break; default: startLabel = 'Start Date'; endLabel = 'End Date'; } return DateRangePickerField( startDate: controller.eventStartDate, endDate: controller.eventEndDate, onStartDateSelected: (date) { setState(() { controller.eventStartDate = date; // 시작일 설정 시 종료일이 없으면 자동으로 1달 후로 설정 if (date != null && controller.eventEndDate == null) { controller.eventEndDate = date.add(const Duration(days: 30)); } }); }, onEndDateSelected: (date) { setState(() { controller.eventEndDate = date; }); }, startLabel: startLabel, endLabel: endLabel, primaryColor: controller.gradientColors[0], ); }, ), const SizedBox(height: 20), // 이벤트 가격 Builder( builder: (BuildContext innerContext) { // 현재 로케일 확인 final currentLocale = Localizations.localeOf(innerContext); // 로케일에 따라 직접 텍스트 설정 String eventPriceLabel; String eventPriceHint; switch (currentLocale.languageCode) { case 'ko': eventPriceLabel = '이벤트 가격'; eventPriceHint = '할인된 가격을 입력하세요'; break; case 'ja': eventPriceLabel = 'イベント価格'; eventPriceHint = '割引価格を入力してください'; break; case 'zh': eventPriceLabel = '活动价格'; eventPriceHint = '输入折扣价格'; break; default: eventPriceLabel = 'Event Price'; eventPriceHint = 'Enter discounted price'; } return CurrencyInputField( controller: controller.eventPriceController, currency: controller.currency, label: eventPriceLabel, hintText: eventPriceHint, ); }, ), ], ), ), ), ], ), ), ), ); } }