// lib/providers/receipt_provider.dart import 'package:flutter/material.dart'; import 'package:cashumit/providers/receipt_state.dart'; import 'package:cashumit/models/receipt_item.dart'; import 'package:cashumit/services/receipt_service.dart'; // Pastikan ReceiptService sudah dibuat import 'package:cashumit/models/firefly_account.dart'; // Untuk tipe akun class ReceiptProvider with ChangeNotifier { late ReceiptState _state; ReceiptState get state => _state; ReceiptProvider() { _state = ReceiptState(); } /// Inisialisasi state awal Future initialize() async { await loadCredentialsAndAccounts(); // Bisa menambahkan inisialisasi lain jika diperlukan } /// Memuat kredensial dan akun Future loadCredentialsAndAccounts() async { final credentials = await ReceiptService.loadCredentials(); if (credentials == null) { // Jika tidak ada kredensial, kita tetap perlu memberitahu listener bahwa state berubah // (misalnya untuk menampilkan pesan error di UI) _state = _state.copyWith( fireflyUrl: null, accessToken: null, accounts: [], // Kosongkan akun juga ); notifyListeners(); return; } // Periksa apakah kredensial berubah final credentialsChanged = _state.fireflyUrl != credentials['url'] || _state.accessToken != credentials['token']; _state = _state.copyWith( fireflyUrl: credentials['url'], accessToken: credentials['token'], ); notifyListeners(); // Jika kredensial ada dan berubah, lanjutkan untuk memuat akun if (credentialsChanged) { await loadAccounts(); } else if (_state.accounts.isEmpty) { // Jika akun belum pernah dimuat, muat sekarang await loadAccounts(); } } /// Memuat daftar akun Future loadAccounts() async { if (_state.fireflyUrl == null || _state.accessToken == null) { return; } try { final allAccounts = await ReceiptService.loadAccounts( baseUrl: _state.fireflyUrl!, accessToken: _state.accessToken!, ); _state = _state.copyWith(accounts: allAccounts); notifyListeners(); } catch (error) { // Error handling bisa dilakukan di sini atau dibiarkan untuk ditangani oleh UI print('Error in ReceiptProvider.loadAccounts: $error'); // Bisa memicu state error jika diperlukan notifyListeners(); // Tetap notify untuk memperbarui UI (misalnya menampilkan pesan error) } } /// Menambahkan item ke receipt void addItem(ReceiptItem item) { _state = _state.copyWith( items: [..._state.items, item], ); notifyListeners(); } /// Mengedit item di receipt void editItem(int index, ReceiptItem newItem) { if (index < 0 || index >= _state.items.length) return; final updatedItems = List.from(_state.items); updatedItems[index] = newItem; _state = _state.copyWith( items: updatedItems, ); notifyListeners(); } /// Menghapus item dari receipt void removeItem(int index) { if (index < 0 || index >= _state.items.length) return; final updatedItems = List.from(_state.items)..removeAt(index); _state = _state.copyWith( items: updatedItems, ); notifyListeners(); } /// Memilih akun sumber void selectSourceAccount(String id, String name) { _state = _state.copyWith( sourceAccountId: id, sourceAccountName: name, ); notifyListeners(); } /// Memilih akun tujuan void selectDestinationAccount(String id, String name) { _state = _state.copyWith( destinationAccountId: id, destinationAccountName: name, ); notifyListeners(); } /// Mencari ID akun berdasarkan nama dan tipe String? findAccountIdByName(String name, String expectedType) { return ReceiptService.findAccountIdByName( name: name, expectedType: expectedType, accounts: _state.accounts, ); } /// Mengirim transaksi (ini akan memanggil ReceiptService dan mungkin memperbarui state setelahnya) Future submitTransaction() async { if (_state.items.isEmpty) { throw Exception('Tidak ada item untuk dikirim'); } if (_state.fireflyUrl == null || _state.accessToken == null) { throw Exception('Kredensial Firefly III tidak ditemukan'); } // Pastikan akun sumber dan tujuan dipilih // Logika untuk mencari ID berdasarkan nama jika diperlukan bisa ditambahkan di sini // atau diharapkan UI sudah menangani ini sebelum memanggil submitTransaction if (_state.sourceAccountId == null || _state.destinationAccountId == null) { throw Exception('Akun sumber dan tujuan harus dipilih'); } final transactionId = await ReceiptService.submitTransaction( items: _state.items, transactionDate: _state.transactionDate, sourceAccountId: _state.sourceAccountId!, destinationAccountId: _state.destinationAccountId!, accounts: _state.accounts, baseUrl: _state.fireflyUrl!, accessToken: _state.accessToken!, ); return transactionId; } // Tambahkan metode lain sesuai kebutuhan, seperti untuk memperbarui transactionDate jika diperlukan }