Files
Siro/siro_admin/lib/controller/fuel/fuel_admin_controller.dart

130 lines
3.5 KiB
Dart

// fuel_admin_controller.dart — تحكم شاشات محفظة الوقود (لوحة إدارة سيرو)
import 'package:get/get.dart';
import 'fuel_admin_models.dart';
import 'fuel_admin_service.dart';
class FuelAdminController extends GetxController {
bool isLoading = false;
List<FuelStation> stations = [];
/// ‏حالة المنتج — لا حالة الشاشة. الشاشة تعمل دائماً؛ المنتج قد يكون
/// ‏مُجهَّزاً وغير مُشغَّل حتى يتم الاتفاق مع سلسلة المحطات.
bool productActive = false;
String searchQuery = '';
bool isSaving = false;
bool isLoadingDrawdowns = false;
FuelDrawdownsPage? drawdowns;
String? lastError;
@override
void onInit() {
super.onInit();
fetchStations();
}
Future<void> fetchStations() async {
isLoading = true;
update();
final res = await FuelAdminService.listStations(search: searchQuery);
if (res.success && res.data != null) {
stations = res.data!.stations;
productActive = res.data!.productActive;
lastError = null;
} else {
lastError = res.message;
}
isLoading = false;
update();
}
/// ‏يُرجع المفتاح الجديد عند الإنشاء، أو null عند التعديل/الفشل.
///
/// ‏المفتاح يظهر مرة واحدة فقط — مخزَّن مُهشَّراً على الخادم ولا سبيل
/// ‏لاستعادته. الشاشة مسؤولة عن عرضه فوراً قبل أي انتقال.
Future<String?> saveStation({
int? stationId,
required String nameAr,
String? chainName,
String? city,
String? address,
double? lat,
double? lng,
String? phone,
required double discountPercent,
required bool isActive,
}) async {
isSaving = true;
update();
final res = await FuelAdminService.saveStation(
stationId: stationId,
nameAr: nameAr,
chainName: chainName,
city: city,
address: address,
lat: lat,
lng: lng,
phone: phone,
discountPercent: discountPercent,
isActive: isActive,
);
isSaving = false;
lastError = res.success ? null : res.message;
update();
if (!res.success) return null;
await fetchStations();
return res.data?['api_key']?.toString();
}
Future<String?> rotateKey(int stationId) async {
final res = await FuelAdminService.rotateKey(stationId);
if (!res.success) {
lastError = res.message;
update();
return null;
}
return res.data?['api_key']?.toString();
}
/// ‏تشغيل المنتج أو إيقافه. الخادم يرفض التشغيل بلا محطة فعّالة واحدة —
/// ‏سائق يفعّل محفظته ثم لا يجد أين يصرف قسيمته تجربةٌ تُفقد الثقة.
Future<bool> toggleProduct(bool value) async {
final res = await FuelAdminService.toggleProduct(value);
if (res.success) {
productActive = res.data ?? value;
lastError = null;
update();
return true;
}
lastError = res.message;
update();
return false;
}
Future<void> fetchDrawdowns({int? stationId, String? status}) async {
isLoadingDrawdowns = true;
update();
final res =
await FuelAdminService.listDrawdowns(stationId: stationId, status: status);
if (res.success) {
drawdowns = res.data;
lastError = null;
} else {
lastError = res.message;
}
isLoadingDrawdowns = false;
update();
}
}