import 'package:flutter/material.dart'; import 'package:intaleq_maps/intaleq_maps.dart'; /// Military Echelon Levels (المستوى القيادي / التشكيل) enum MilitaryEchelon { team, // طاقم / جماعة (●) squad, // حظيرة (●●) platoon, // فصيل (●●●) company, // سرية ( | ) battalion, // كتيبة ( || ) regiment, // فوج ( ||| ) brigade, // لواء ( X ) division, // فرقة ( XX ) } /// Tactical Symbol Types (الرموز العسكرية القياسية) enum TacticalSymbolType { friendlyInfantry, // مشاة صديقة friendlyArmor, // دروع / دبابات صديقة friendlyArtillery,// مدفعية ميدان صديقة friendlyAirDefense,// دفاع جوي صديق friendlyRadar, // رادار واستطلاع أرضي friendlyHq, // مركز قيادة وسيطرة (HQ) checkpoint, // نقطة غلق وتفتيش أمني observationPost, // نقطة مراقبة واستطلاع أمامي (OP) enemyInfantry, // مشاة معادية enemyArmor, // دروع معادية enemyArtillery, // مدفعية معادية minefield, // حقل ألغام hlz, // مهبط طيران عامودي } /// Tactical Unit / Symbol on Map class TacticalSymbolItem { final String id; final String name; final TacticalSymbolType type; final MilitaryEchelon echelon; final LatLng position; final double azimuthDeg; final String callsign; final String notes; const TacticalSymbolItem({ required this.id, required this.name, required this.type, this.echelon = MilitaryEchelon.battalion, required this.position, this.azimuthDeg = 0.0, this.callsign = '', this.notes = '', }); bool get isEnemy => type == TacticalSymbolType.enemyInfantry || type == TacticalSymbolType.enemyArmor || type == TacticalSymbolType.enemyArtillery; Color get color { if (isEnemy) return const Color(0xFFEF4444); // Red if (type == TacticalSymbolType.minefield) return const Color(0xFFF59E0B); // Amber if (type == TacticalSymbolType.hlz) return const Color(0xFF10B981); // Emerald if (type == TacticalSymbolType.checkpoint || type == TacticalSymbolType.observationPost) { return const Color(0xFF38BDF8); // Cyan } return const Color(0xFF0071E3); // Friendly Blue } IconData get icon { switch (type) { case TacticalSymbolType.friendlyInfantry: case TacticalSymbolType.enemyInfantry: return Icons.group; case TacticalSymbolType.friendlyArmor: case TacticalSymbolType.enemyArmor: return Icons.shield; case TacticalSymbolType.friendlyArtillery: case TacticalSymbolType.enemyArtillery: return Icons.gps_fixed; case TacticalSymbolType.friendlyAirDefense: return Icons.radar; case TacticalSymbolType.friendlyRadar: return Icons.track_changes; case TacticalSymbolType.friendlyHq: return Icons.flag; case TacticalSymbolType.checkpoint: return Icons.gavel; case TacticalSymbolType.observationPost: return Icons.visibility; case TacticalSymbolType.minefield: return Icons.warning_amber; case TacticalSymbolType.hlz: return Icons.flight_land; } } } /// Artillery Weapon Profile (أنظمة المدفعية الميدانية والراجمات) class ArtilleryWeaponSystem { final String id; final String nameAr; final String caliber; final double maxRangeMeters; final double minRangeMeters; final double muzzleVelocityMps; // سرعة الفوهة م/ث final double minElevationDeg; final double maxElevationDeg; const ArtilleryWeaponSystem({ required this.id, required this.nameAr, required this.caliber, required this.maxRangeMeters, required this.minRangeMeters, required this.muzzleVelocityMps, required this.minElevationDeg, required this.maxElevationDeg, }); static const List standardSystems = [ ArtilleryWeaponSystem( id: 'm109_155', nameAr: 'هاوتزر ذاتي الحركة M109A2/A3 (155 ملم)', caliber: '155mm', minRangeMeters: 3000, maxRangeMeters: 24000, muzzleVelocityMps: 684, minElevationDeg: 3, maxElevationDeg: 75, ), ArtilleryWeaponSystem( id: 'mortar_120', nameAr: 'هاون ثقيل M120 (120 ملم)', caliber: '120mm', minRangeMeters: 200, maxRangeMeters: 7200, muzzleVelocityMps: 318, minElevationDeg: 45, maxElevationDeg: 85, ), ArtilleryWeaponSystem( id: 'grad_122', nameAr: 'راجمة صواريخ BM-21 غراد (122 ملم)', caliber: '122mm Rocket', minRangeMeters: 5000, maxRangeMeters: 20400, muzzleVelocityMps: 690, minElevationDeg: 0, maxElevationDeg: 55, ), ArtilleryWeaponSystem( id: 'mortar_81', nameAr: 'هاون متوسط L16 (81 ملم)', caliber: '81mm', minRangeMeters: 100, maxRangeMeters: 5650, muzzleVelocityMps: 250, minElevationDeg: 45, maxElevationDeg: 85, ), ]; } /// Ballistic Trajectory Point class BallisticTrajectoryPoint { final double distanceMeters; final double altitudeMeters; final double groundElevationMeters; final LatLng coordinate; const BallisticTrajectoryPoint({ required this.distanceMeters, required this.altitudeMeters, required this.groundElevationMeters, required this.coordinate, }); } /// Complete Artillery Firing Solution (حل الرماية وقوس القذيفة) class ArtilleryFiringSolution { final ArtilleryWeaponSystem weapon; final LatLng gunPosition; final LatLng targetPosition; final double distanceMeters; final double azimuthDeg; final double azimuthMilsNato; // 6400 mils final double quadrantElevationDeg; // زاوية الارتفاع final double quadrantElevationMilsNato; final double timeOfFlightSeconds; // زمن الطيران final double apogeeAltitudeMeters; // ذروة القوس final bool isCrestClear; // سلامة تجاوز قمم الجبال (Crest Clearance) final double minCrestClearanceMeters; final List trajectoryProfile; const ArtilleryFiringSolution({ required this.weapon, required this.gunPosition, required this.targetPosition, required this.distanceMeters, required this.azimuthDeg, required this.azimuthMilsNato, required this.quadrantElevationDeg, required this.quadrantElevationMilsNato, required this.timeOfFlightSeconds, required this.apogeeAltitudeMeters, required this.isCrestClear, required this.minCrestClearanceMeters, required this.trajectoryProfile, }); } /// Helicopter Types for HLZ enum HelicopterType { lightUtility, // طوافة استطلاع خفيفة (Little Bird / Bell 407) mediumLift, // طوافة نقل وتكتيك متوسطة (UH-60 Blackhawk / AH-64 Apache) heavyTransport // طوافة نقل ثقيل (CH-47 Chinook / Super Stallion) } /// Helicopter Landing Zone Assessment Result (تقييم مهبط الطيران العامودي) class HlzAssessmentResult { final LatLng center; final HelicopterType helicopterType; final double groundElevationM; final double maxSlopePercent; // نسبة انحدار الأرض final double avgSlopePercent; final double recommendedClearanceRadiusM; final bool isSlopeAcceptable; final bool isObstacleClear; final String suitabilityGrade; // "ممتاز (OPTIMAL)", "مقبول بحذر (MARGINAL)", "غير صالح (NO-GO)" final Color gradeColor; final double approachAzimuthDeg; // ممر الاقتراب الآمن final List padBoundary; final List approachFunnel; const HlzAssessmentResult({ required this.center, required this.helicopterType, required this.groundElevationM, required this.maxSlopePercent, required this.avgSlopePercent, required this.recommendedClearanceRadiusM, required this.isSlopeAcceptable, required this.isObstacleClear, required this.suitabilityGrade, required this.gradeColor, required this.approachAzimuthDeg, required this.padBoundary, required this.approachFunnel, }); } /// Minefield Type enum MinefieldType { antiTank, // حقل ألغام ضد الدروع (AT) antiPersonnel, // حقل ألغام ضد الأفراد (AP) mixedBarrier, // حقل موانع مركب ومختلط } /// Minefield Zone & Breaching Corridor (حقل الألغام وممرات العبور) class MinefieldZoneResult { final LatLng startPoint; final LatLng endPoint; final MinefieldType type; final double widthMeters; final double lengthMeters; final double estimatedMinesCount; final List boundaryPolygon; final List breachLaneCenterline; // ممر الثغرة الآمن final List breachLanePolygon; const MinefieldZoneResult({ required this.startPoint, required this.endPoint, required this.type, required this.widthMeters, required this.lengthMeters, required this.estimatedMinesCount, required this.boundaryPolygon, required this.breachLaneCenterline, required this.breachLanePolygon, }); } /// Tactical Overlays (منظومة الشفافات العسكرية) class TacticalOverlayLayer { final String id; final String nameAr; final Color color; final bool isVisible; final List> polygons; final List> lines; const TacticalOverlayLayer({ required this.id, required this.nameAr, required this.color, this.isVisible = true, this.polygons = const [], this.lines = const [], }); TacticalOverlayLayer copyWith({bool? isVisible}) { return TacticalOverlayLayer( id: id, nameAr: nameAr, color: color, isVisible: isVisible ?? this.isVisible, polygons: polygons, lines: lines, ); } }