import 'package:flutter/material.dart'; import '../../controllers/add_subscription_controller.dart'; import '../../l10n/app_localizations.dart'; import '../common/form_fields/currency_input_field.dart'; import '../common/form_fields/date_picker_field.dart'; // import '../../theme/app_colors.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: Theme.of(context).colorScheme.surface, borderRadius: BorderRadius.circular(20), border: Border.all( color: Theme.of(context).colorScheme.outline.withValues(alpha: 0.3), width: 1, ), ), 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 loc = AppLocalizations.of(context); return Text( loc.eventPrice, style: TextStyle( fontSize: 18, fontWeight: FontWeight.w700, color: Theme.of(context).colorScheme.onSurface, ), ); }, ), ], ), Switch.adaptive( value: controller.isEventActive, onChanged: (value) { setState(() { controller.isEventActive = value; if (!controller.isEventActive) { // 이벤트 비활성화 시 관련 데이터 초기화 controller.eventStartDate = null; controller.eventEndDate = null; controller.eventPriceController.clear(); } }); }, activeThumbColor: controller.gradientColors[0], activeTrackColor: controller.gradientColors[0].withValues(alpha: 0.5), ), ], ), // 이벤트 활성화 시 추가 필드 표시 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: Theme.of(context) .colorScheme .tertiary .withValues(alpha: 0.08), borderRadius: BorderRadius.circular(12), border: Border.all( color: Theme.of(context) .colorScheme .tertiary .withValues(alpha: 0.3), width: 1, ), ), child: Row( children: [ Icon( Icons.info_outline_rounded, color: Theme.of(context).colorScheme.tertiary, size: 20, ), const SizedBox(width: 8), Expanded( child: Builder( builder: (context) { final loc = AppLocalizations.of(context); final infoText = loc.eventPriceHint; return Text( infoText, style: TextStyle( fontSize: 14, color: Theme.of(context) .colorScheme .onSurface, fontWeight: FontWeight.w500, ), ); }, ), ), ], ), ), const SizedBox(height: 20), // 이벤트 기간 Builder( builder: (context) { final loc = AppLocalizations.of(context); final startLabel = loc.startDate; final endLabel = loc.endDate; 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 loc = AppLocalizations.of(innerContext); return CurrencyInputField( controller: controller.eventPriceController, currency: controller.currency, label: loc.eventPrice, hintText: loc.eventPriceHint, enabled: controller.isEventActive, // 이벤트 비활성화 시 검증을 건너뛰어 저장이 막히지 않도록 처리 validator: controller.isEventActive ? null : (_) => null, ); }, ), ], ), ), ), ], ), ), ), ); } }