import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../../constant/finance_design_system.dart'; import '../../../controller/home/journal/schedule_controller.dart'; class SchedulePage extends StatelessWidget { SchedulePage({super.key}); final ScheduleController controller = Get.put(ScheduleController()); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: FinanceDesignSystem.backgroundColor, appBar: AppBar( title: Text('My Schedule'.tr, style: TextStyle( fontWeight: FontWeight.bold, color: FinanceDesignSystem.primaryDark)), backgroundColor: Colors.transparent, elevation: 0, centerTitle: true, leading: IconButton( icon: Icon(Icons.arrow_back_ios_new_rounded, color: FinanceDesignSystem.primaryDark, size: 20), onPressed: () => Get.back()), ), body: GetBuilder(builder: (sc) { return SingleChildScrollView( padding: const EdgeInsets.all(16), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ // Summary Card Container( padding: const EdgeInsets.all(20), decoration: BoxDecoration( gradient: FinanceDesignSystem.balanceGradient, borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), ), child: Row(children: [ Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Weekly Plan'.tr, style: TextStyle( color: Colors.white.withValues(alpha: 0.7), fontSize: 14)), const SizedBox(height: 8), Text('${sc.totalWeeklyHours.toStringAsFixed(1)}h', style: const TextStyle( fontSize: 32, fontWeight: FontWeight.w900, color: Colors.white)), Text('${sc.activeDays} ${'Days'.tr}', style: TextStyle( color: Colors.white.withValues(alpha: 0.6), fontSize: 13)), ])), Container( padding: const EdgeInsets.all(14), decoration: BoxDecoration( color: Colors.white.withValues(alpha: 0.15), borderRadius: BorderRadius.circular(14)), child: const Icon(Icons.calendar_today_rounded, color: Colors.white, size: 28), ), ]), ), const SizedBox(height: 24), Text('Work Days'.tr, style: FinanceDesignSystem.headingStyle), const SizedBox(height: 12), ...sc.schedule.map((slot) => _buildDayCard(context, slot, sc)), ]), ); }), ); } Widget _buildDayCard( BuildContext context, WorkSlot slot, ScheduleController sc) { final isAr = Get.locale?.languageCode == 'ar'; return Container( margin: const EdgeInsets.only(bottom: 10), padding: const EdgeInsets.all(14), decoration: BoxDecoration( color: slot.isActive ? Colors.white : Colors.grey.shade50, borderRadius: BorderRadius.circular(14), boxShadow: slot.isActive ? [ BoxShadow( color: Colors.black.withValues(alpha: 0.03), blurRadius: 8, offset: const Offset(0, 3)) ] : null, ), child: Row(children: [ // Toggle GestureDetector( onTap: () => sc.toggleDay(slot.dayOfWeek), child: AnimatedContainer( duration: const Duration(milliseconds: 200), width: 44, height: 44, decoration: BoxDecoration( color: slot.isActive ? FinanceDesignSystem.accentBlue.withValues(alpha: 0.1) : Colors.grey.shade200, borderRadius: BorderRadius.circular(12), ), child: Center( child: Text( isAr ? slot.dayNameAr.substring(0, 2) : slot.dayName, style: TextStyle( fontSize: 12, fontWeight: FontWeight.bold, color: slot.isActive ? FinanceDesignSystem.accentBlue : Colors.grey.shade400), )), ), ), const SizedBox(width: 14), // Day name Expanded( child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(isAr ? slot.dayNameAr : slot.dayName.tr, style: TextStyle( fontSize: 14, fontWeight: FontWeight.w600, color: slot.isActive ? FinanceDesignSystem.primaryDark : Colors.grey.shade400)), if (slot.isActive) Text(slot.timeRange, style: TextStyle(fontSize: 12, color: Colors.grey.shade500)), if (!slot.isActive) Text('Day Off'.tr, style: TextStyle( fontSize: 12, color: Colors.grey.shade400, fontStyle: FontStyle.italic)), ])), // Time pickers if (slot.isActive) ...[ _timePicker(context, slot.startTime, (t) => sc.updateStartTime(slot.dayOfWeek, t)), Padding( padding: const EdgeInsets.symmetric(horizontal: 4), child: Text('-', style: TextStyle(color: Colors.grey.shade400))), _timePicker(context, slot.endTime, (t) => sc.updateEndTime(slot.dayOfWeek, t)), ], // Toggle switch Switch( value: slot.isActive, onChanged: (_) => sc.toggleDay(slot.dayOfWeek), activeThumbColor: FinanceDesignSystem.accentBlue, ), ]), ); } Widget _timePicker( BuildContext context, TimeOfDay time, Function(TimeOfDay) onChanged) { return GestureDetector( onTap: () async { final picked = await showTimePicker(context: context, initialTime: time); if (picked != null) onChanged(picked); }, child: Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( color: Colors.grey.shade100, borderRadius: BorderRadius.circular(8)), child: Text( '${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}', style: TextStyle( fontSize: 12, fontWeight: FontWeight.w600, color: FinanceDesignSystem.primaryDark)), ), ); } }