import 'package:get/get.dart'; import 'package:intaleq_maps/intaleq_maps.dart'; import '../models/military_operations_models.dart'; import '../services/artillery_ballistics_engine.dart'; /// ============================================================================ /// [ArtilleryController] - وحدة التحكم برماية المدفعية وقوس القذيفة /// ============================================================================ /// English: /// GetX Controller managing artillery firing mission parameters, ballistic /// trajectory calculations, weapon profiles, and crest clearance checks. /// /// العربية: /// متحكم GetX لإدارة معايير رماية المدفعية الميدانية، حلول الرماية البالستية، /// اختيار أنظمة السلاح، وفحص سلامة المسار من الاصطدام بقمم الجبال (Crest Clearance). /// ============================================================================ class ArtilleryController extends GetxController { // ── Observables / الحالات التفاعلية ────────────────────────────────────── final Rx gunPosition = Rx(null); final Rx targetPosition = Rx(null); final Rx selectedWeapon = Rx(ArtilleryWeaponSystem.standardSystems.first); final RxBool highAngle = false.obs; final RxBool isLoading = false.obs; final Rx firingSolution = Rx(null); /// Set Battery Gun Position / تعيين موقع مربض المدفعية void setGunPosition(LatLng pos) { gunPosition.value = pos; calculateFiringSolution(); } /// Set Enemy Target Position / تعيين موقع الهدف المعادي void setTargetPosition(LatLng pos) { targetPosition.value = pos; calculateFiringSolution(); } /// Swap Gun and Target Positions / تبديل مربض المدفعية مع الهدف void swapPositions() { final temp = gunPosition.value; gunPosition.value = targetPosition.value; targetPosition.value = temp; calculateFiringSolution(); } /// Select Weapon Profile / اختيار نوع نظام المدفعية أو الهاون void selectWeapon(ArtilleryWeaponSystem weapon) { selectedWeapon.value = weapon; calculateFiringSolution(); } /// Toggle High-Angle Trajectory / التبديل بين قوس الرماية المنخفض والعالي void toggleHighAngle(bool value) { highAngle.value = value; calculateFiringSolution(); } /// Calculate Ballistic Firing Solution / احتساب الحل البالستي الشامل Future calculateFiringSolution() async { if (gunPosition.value == null || targetPosition.value == null) { firingSolution.value = null; return; } try { isLoading.value = true; final sol = await ArtilleryBallisticsEngine.calculateFireMission( weapon: selectedWeapon.value, gunPos: gunPosition.value!, targetPos: targetPosition.value!, highAngle: highAngle.value, ); firingSolution.value = sol; } catch (e) { firingSolution.value = null; } finally { isLoading.value = false; } } /// Clear artillery state / إعادة ضبط رماية المدفعية void reset() { gunPosition.value = null; targetPosition.value = null; firingSolution.value = null; highAngle.value = false; } }