import 'package:get/get.dart'; import 'package:intaleq_maps/intaleq_maps.dart'; import '../models/military_operations_models.dart'; import '../services/minefield_engine.dart'; /// ============================================================================ /// [MinefieldController] - وحدة التحكم بحقول الألغام وممرات الثغرات /// ============================================================================ /// English: /// GetX Controller managing minefield zone geometry, barrier types, threat /// envelope generation, mine density estimation, and safe breaching corridor calculations. /// /// العربية: /// متحكم GetX لإدارة هندسة حقول الألغام والموانع، تصنيف نوع الألغام، /// حساب الكثافة التقديرية، وتخطيط ممرات الثغرات الآمنة (Breaching Lanes). /// ============================================================================ class MinefieldController extends GetxController { // ── Observables / الحالات التفاعلية ────────────────────────────────────── final Rx startPoint = Rx(null); final Rx endPoint = Rx(null); final Rx minefieldType = Rx(MinefieldType.antiTank); final RxDouble widthMeters = 200.0.obs; final Rx zoneResult = Rx(null); /// Set Minefield Start Point (A) / تعيين بداية حقل الألغام void setStartPoint(LatLng pos) { startPoint.value = pos; calculateZone(); } /// Set Minefield End Point (B) / تعيين نهاية حقل الألغام void setEndPoint(LatLng pos) { endPoint.value = pos; calculateZone(); } /// Swap Start and End Points / تبديل نقاط بداية ونهاية الحقل void swapPoints() { final temp = startPoint.value; startPoint.value = endPoint.value; endPoint.value = temp; calculateZone(); } /// Select Minefield Type / تحديد نوع المانع (ضد دروع / ضد أفراد / مركب) void setType(MinefieldType type) { minefieldType.value = type; calculateZone(); } /// Set Frontage Depth / تحديد عمق الحقل بالمتر void setWidth(double width) { widthMeters.value = width; calculateZone(); } /// Calculate Minefield Threat Box & Breaching Corridor / حساب منطقة الخطر وممر الثغرة void calculateZone() { if (startPoint.value == null || endPoint.value == null) { zoneResult.value = null; return; } final res = MinefieldEngine.calculateMinefieldZone( startPoint: startPoint.value!, endPoint: endPoint.value!, type: minefieldType.value, widthMeters: widthMeters.value, ); zoneResult.value = res; } /// Reset minefield state / إعادة ضبط حقل الألغام void reset() { startPoint.value = null; endPoint.value = null; zoneResult.value = null; } }