import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:intl/intl.dart'; import '../../core/theme/app_theme.dart'; import '../../core/widgets/loading_button.dart'; import '../../core/api/api_client.dart'; import '../../shared/providers/lookup_providers.dart'; import 'contracts_provider.dart'; class ContractFormScreen extends ConsumerStatefulWidget { final int editId; const ContractFormScreen({super.key, required this.editId}); @override ConsumerState createState() => _ContractFormScreenState(); } class _ContractFormScreenState extends ConsumerState { final _formKey = GlobalKey(); final _titleCtrl = TextEditingController(); DateTime? _periodStart; DateTime? _periodEnd; int? _companyId; int? _vendorId; bool _loading = false; bool _initDone = false; @override void dispose() { _titleCtrl.dispose(); super.dispose(); } Future _init() async { if (_initDone) return; _initDone = true; try { final resp = await apiDio.get('/contracts/${widget.editId}'); final d = resp.data as Map; setState(() { _titleCtrl.text = d['title'] ?? ''; _companyId = d['company_id']; _vendorId = d['vendor_id']; if (d['period_start'] != null) _periodStart = DateTime.tryParse(d['period_start']); if (d['period_end'] != null) _periodEnd = DateTime.tryParse(d['period_end']); }); } catch (_) {} } Future _submit() async { if (!_formKey.currentState!.validate()) return; setState(() => _loading = true); try { await updateContract(widget.editId, { 'title': _titleCtrl.text.trim(), 'company_id': _companyId, 'vendor_id': _vendorId, if (_periodStart != null) 'period_start': DateFormat('yyyy-MM-dd').format(_periodStart!), if (_periodEnd != null) 'period_end': DateFormat('yyyy-MM-dd').format(_periodEnd!), }); if (mounted) context.pop(); } on ApiException catch (e) { if (mounted) ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(e.message), backgroundColor: AppColors.danger)); } finally { if (mounted) setState(() => _loading = false); } } Future _pickDate(bool isStart) async { final picked = await showDatePicker( context: context, initialDate: (isStart ? _periodStart : _periodEnd) ?? DateTime.now(), firstDate: DateTime(2000), lastDate: DateTime(2035), ); if (picked != null) setState(() => isStart ? _periodStart = picked : _periodEnd = picked); } @override Widget build(BuildContext context) { _init(); final companiesAsync = ref.watch(companiesProvider); final vendorsAsync = ref.watch(vendorsProvider); return Scaffold( appBar: AppBar(title: const Text('Edit Contract')), body: Form( key: _formKey, child: ListView( padding: const EdgeInsets.all(16), children: [ _label('Contract Title'), TextFormField(controller: _titleCtrl, decoration: const InputDecoration(hintText: 'Contract title'), validator: (v) => (v == null || v.isEmpty) ? 'Title is required' : null), const SizedBox(height: 16), _label('Company'), companiesAsync.when( loading: () => const LinearProgressIndicator(), error: (_, __) => const Text('Failed'), data: (list) => DropdownButtonFormField( value: _companyId, decoration: const InputDecoration(hintText: 'Select company'), items: list.map((c) => DropdownMenuItem(value: c.id, child: Text(c.name))).toList(), onChanged: (v) => setState(() => _companyId = v), ), ), const SizedBox(height: 16), _label('Vendor (optional)'), vendorsAsync.when( loading: () => const LinearProgressIndicator(), error: (_, __) => const Text('Failed'), data: (list) => DropdownButtonFormField( value: _vendorId, decoration: const InputDecoration(hintText: 'Select vendor'), items: [ const DropdownMenuItem(value: null, child: Text('None')), ...list.map((v) => DropdownMenuItem(value: v.id, child: Text(v.name))), ], onChanged: (v) => setState(() => _vendorId = v), ), ), const SizedBox(height: 16), Row(children: [ Expanded(child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ _label('Start Date'), _datePicker(_periodStart, () => _pickDate(true)), ])), const SizedBox(width: 12), Expanded(child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ _label('End Date'), _datePicker(_periodEnd, () => _pickDate(false)), ])), ]), const SizedBox(height: 32), LoadingButton(loading: _loading, label: 'Save', onPressed: _submit), ], ), ), ); } Widget _datePicker(DateTime? date, VoidCallback onTap) => GestureDetector( onTap: onTap, child: Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 14), decoration: BoxDecoration( color: AppColors.surface, border: Border.all(color: AppColors.border), borderRadius: BorderRadius.circular(10), ), child: Text( date != null ? DateFormat('d MMM yyyy').format(date) : 'Select date', style: TextStyle(fontSize: 13, color: date != null ? AppColors.text : AppColors.textSub), ), ), ); Widget _label(String text) => Padding( padding: const EdgeInsets.only(bottom: 6), child: Text(text, style: const TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: AppColors.text)), ); }