import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../../core/constants/enums.dart'; import '../../../../shared/widgets/app_button.dart'; import '../../../../shared/widgets/app_text_field.dart'; import '../../domain/entities/app_settings.dart'; import '../providers/settings_provider.dart'; import '../widgets/settings_widgets.dart'; import '../../../../shared/widgets/app_toast.dart'; class AssetSettingsScreen extends ConsumerStatefulWidget { const AssetSettingsScreen({super.key}); @override ConsumerState createState() => _AssetSettingsScreenState(); } class _AssetSettingsScreenState extends ConsumerState { final _formKey = GlobalKey(); late final TextEditingController _prefixController; late final TextEditingController _runningLengthController; late final TextEditingController _warrantyReminderController; late final TextEditingController _expiryAlertController; late bool _autoGenerate; late bool _qrEnabled; late String _qrFormat; late String _labelSize; late Set _enabledStatuses; @override void initState() { super.initState(); final asset = ref.read(appSettingsProvider).asset; _prefixController = TextEditingController(text: asset.codePrefix); _runningLengthController = TextEditingController(text: '${asset.runningNumberLength}'); _warrantyReminderController = TextEditingController(text: '${asset.warrantyReminderDays}'); _expiryAlertController = TextEditingController(text: '${asset.expiryAlertDays}'); _autoGenerate = asset.autoGenerateCode; _qrEnabled = asset.qrEnabled; _qrFormat = asset.qrFormat; _labelSize = asset.labelSize; _enabledStatuses = asset.enabledStatuses.toSet(); } @override void dispose() { _prefixController.dispose(); _runningLengthController.dispose(); _warrantyReminderController.dispose(); _expiryAlertController.dispose(); super.dispose(); } Future _save() async { if (!_formKey.currentState!.validate()) return; await ref.read(appSettingsProvider.notifier).updateAsset( AssetSettingsConfig( codePrefix: _prefixController.text.trim(), runningNumberLength: int.parse(_runningLengthController.text.trim()), autoGenerateCode: _autoGenerate, warrantyReminderDays: int.parse(_warrantyReminderController.text.trim()), expiryAlertDays: int.parse(_expiryAlertController.text.trim()), qrEnabled: _qrEnabled, qrFormat: _qrFormat, labelSize: _labelSize, enabledStatuses: _enabledStatuses.toList(), ), ); if (mounted) { showAppToastFromSnackBar(context, const SnackBar(content: Text('Asset settings saved')), ); } } @override Widget build(BuildContext context) { final prefix = _prefixController.text.trim().isEmpty ? 'AST' : _prefixController.text.trim(); final length = int.tryParse(_runningLengthController.text.trim()) ?? 6; final preview = '$prefix-${'0' * (length - 1)}1'; return SettingsPageLayout( title: 'Asset Settings', subtitle: 'Asset codes, statuses, warranty, and QR configuration', child: Form( key: _formKey, child: Column( children: [ SettingsFormCard( title: 'Asset Code Generation', subtitle: 'Preview: $preview', children: [ AppTextField( controller: _prefixController, label: 'Prefix', hint: 'AST, LAP, MOB', onChanged: (_) => setState(() {}), ), const SizedBox(height: 16), AppTextField( controller: _runningLengthController, label: 'Running Number Length', keyboardType: TextInputType.number, onChanged: (_) => setState(() {}), ), SettingsSwitchTile( title: 'Auto Generate Asset Code', value: _autoGenerate, onChanged: (v) => setState(() => _autoGenerate = v), ), ], ), const SizedBox(height: 16), SettingsFormCard( title: 'Asset Statuses', subtitle: 'Enable or disable statuses used in the system', children: AssetStatus.values.map((status) { return CheckboxListTile( contentPadding: EdgeInsets.zero, title: Text(status.label), value: _enabledStatuses.contains(status.value), onChanged: (checked) { setState(() { if (checked == true) { _enabledStatuses.add(status.value); } else { _enabledStatuses.remove(status.value); } }); }, ); }).toList(), ), const SizedBox(height: 16), SettingsFormCard( title: 'Warranty Settings', children: [ AppTextField( controller: _warrantyReminderController, label: 'Warranty Reminder Days', keyboardType: TextInputType.number, ), const SizedBox(height: 16), AppTextField( controller: _expiryAlertController, label: 'Expiry Alert Days', keyboardType: TextInputType.number, ), ], ), const SizedBox(height: 16), SettingsFormCard( title: 'QR Settings', children: [ SettingsSwitchTile( title: 'Enable QR Codes', value: _qrEnabled, onChanged: (v) => setState(() => _qrEnabled = v), ), SettingsDropdownField( label: 'QR Format', value: _qrFormat, items: const ['asset_id', 'asset_code', 'url'], itemLabel: (v) => switch (v) { 'asset_id' => 'Asset ID', 'asset_code' => 'Asset Code', 'url' => 'URL Link', _ => v, }, onChanged: (v) => setState(() => _qrFormat = v!), ), const SizedBox(height: 16), SettingsDropdownField( label: 'Print Label Size', value: _labelSize, items: const ['50x25mm', '40x20mm', '70x35mm'], itemLabel: (v) => v, onChanged: (v) => setState(() => _labelSize = v!), ), ], ), const SizedBox(height: 24), AppButton(label: 'Save Changes', onPressed: _save), ], ), ), ); } }