import 'package:flutter/material.dart'; import '../repositories/poin_repository.dart'; class PoinProvider extends ChangeNotifier { final PoinRepository _repository; PoinProvider({PoinRepository? repository}) : _repository = repository ?? PoinRepository(); bool _isLoading = false; String? _errorMessage; int? _totalPoin; int? _expiringPoints; DateTime? _expiryDate; List> _pointHistory = []; TimeOfDay? _shiftStart; TimeOfDay? _shiftEnd; String? _namaShift; bool get isLoading => _isLoading; String? get errorMessage => _errorMessage; int? get totalPoin => _totalPoin; int? get expiringPoints => _expiringPoints; DateTime? get expiryDate => _expiryDate; List> get pointHistory => _pointHistory; TimeOfDay? get shiftStart => _shiftStart; TimeOfDay? get shiftEnd => _shiftEnd; String? get namaShift => _namaShift; bool _hasLoadedExpiring = false; Future loadExpiringPoints({bool force = false}) async { if (_hasLoadedExpiring && !force) return; _isLoading = true; _errorMessage = null; notifyListeners(); try { final result = await _repository.getExpiringPoints(); if (result['success']) { _totalPoin = int.tryParse(result['data']['total_poin'].toString()); final expiring = result['data']['expiring_points']; if (expiring != null) { _expiringPoints = int.tryParse(expiring['poin'].toString()); if (expiring['tanggal_kadaluarsa'] != null) { _expiryDate = DateTime.tryParse(expiring['tanggal_kadaluarsa']); } } else { _expiringPoints = null; _expiryDate = null; } _errorMessage = null; _hasLoadedExpiring = true; } else { _errorMessage = result['message']; } _isLoading = false; notifyListeners(); } catch (e) { _errorMessage = 'Terjadi kesalahan: ${e.toString()}'; _isLoading = false; notifyListeners(); } } Future loadPointHistory() async { _isLoading = true; _errorMessage = null; notifyListeners(); try { final result = await _repository.getPointHistory(); if (result['success']) { _pointHistory = List>.from( result['data']['history'] ?? [] ); _errorMessage = null; } else { _errorMessage = result['message']; } _isLoading = false; notifyListeners(); } catch (e) { _errorMessage = 'Terjadi kesalahan: ${e.toString()}'; _isLoading = false; notifyListeners(); } } Future checkShiftSchedule(DateTime date) async { _isLoading = true; _errorMessage = null; _shiftStart = null; _shiftEnd = null; _namaShift = null; notifyListeners(); try { String dateStr = "${date.year}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, '0')}"; final result = await _repository.checkSchedule(dateStr); if (result['success']) { final data = result['data']; if (data['jam_mulai'] != null) { final parts = (data['jam_mulai'] as String).split(':'); _shiftStart = TimeOfDay(hour: int.parse(parts[0]), minute: int.parse(parts[1])); } if (data['jam_selesai'] != null) { final parts = (data['jam_selesai'] as String).split(':'); _shiftEnd = TimeOfDay(hour: int.parse(parts[0]), minute: int.parse(parts[1])); } _namaShift = data['nama_shift']; _errorMessage = null; _isLoading = false; notifyListeners(); return true; } else { _errorMessage = result['message']; _isLoading = false; notifyListeners(); return false; } } catch (e) { _errorMessage = 'Gagal memuat jadwal: ${e.toString()}'; _isLoading = false; notifyListeners(); return false; } } Future> tukarPoin({ required int jumlah, required String keterangan, required int idPengurangan, String? jamMasukCustom, String? jamPulangCustom, }) async { _isLoading = true; _errorMessage = null; notifyListeners(); try { final result = await _repository.tukarPoin( jumlah: jumlah, keterangan: keterangan, idPengurangan: idPengurangan, jamMasukCustom: jamMasukCustom, jamPulangCustom: jamPulangCustom, ); if (result['success']) { await Future.wait([ loadExpiringPoints(), loadPointHistory(), ]); _errorMessage = null; } else { _errorMessage = result['message']; } _isLoading = false; notifyListeners(); return result; } catch (e) { _errorMessage = 'Terjadi kesalahan: ${e.toString()}'; _isLoading = false; notifyListeners(); return { 'success': false, 'message': _errorMessage, }; } } void reset() { _isLoading = false; _errorMessage = null; _totalPoin = null; _expiringPoints = null; _expiryDate = null; _pointHistory = []; _shiftStart = null; _shiftEnd = null; _namaShift = null; _hasLoadedExpiring = false; notifyListeners(); } }