#!/usr/bin/env python3
"""
نظام Snow Dust المتقدم مع محاكاة كاملة
"""
import asyncio
import numpy as np
import sys
import os

# إضافة مسار الحزمة
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

class AdvancedSnowDustSystem:
    """نظام Snow Dust المتكامل"""
    
    def __init__(self):
        self.running = False
        
    async def initialize(self):
        """تهيئة النظام"""
        print("🔧 تهيئة نظام Snow Dust المتقدم...")
        
        # استيراد المكونات الديناميكي
        from snow_dust.hardware.sensor_array import SensorArray
        from snow_dust.navigation.navigation_core import NavigationCore
        from snow_dust.simulation.field_simulator import FieldSimulator
        
        # إنشاء المكونات
        self.sensor_array = SensorArray()
        self.navigator = NavigationCore()
        self.simulator = FieldSimulator(wind_speed=15.0)
        
        # التهيئة
        await self.sensor_array.initialize()
        await self.navigator.start(initial_position=[0, 0, 0])
        
        print("✅ تم تهيئة النظام")
        self.running = True
        
    async def navigation_loop(self, duration=5):
        """حلقة الملاحة الرئيسية"""
        print(f"🧭 بدء حلقة الملاحة لمدة {duration} ثواني")
        print("-" * 70)
        
        start_time = asyncio.get_event_loop().time()
        update_count = 0
        
        # استيراد المعالج
        from snow_dust.processing.signal_processor import SignalProcessor
        processor = SignalProcessor()
        
        async for e_field in self.simulator.stream_data(interval=0.12):
            if not self.running:
                break
                
            # محاكاة قراءة المستشعرات
            sensor_readings = await self.sensor_array.read_sensors()
            
            # تحويل القائمة إلى مصفوفة numpy
            sensor_data = np.array(sensor_readings)
            
            # إضافة تأثير المجال المحاكي
            sensor_data += e_field[0]  # استخدام المكون الأول فقط للتجريب
            
            # حساب تدرجات بسيطة (بدلاً من المعالجة المعقدة)
            gradients = np.random.randn(3, 3) * 10  # محاكاة للتدرجات
            
            # تحديث الملاحة
            nav_update = await self.navigator.update_from_e_field(gradients)
            
            # عرض النتائج
            self.display_status(nav_update, update_count)
            update_count += 1
            
            # التحقق من الوقت
            current_time = asyncio.get_event_loop().time()
            if current_time - start_time > duration:
                print("⏰ انتهى الوقت المحدد")
                break
                
    def display_status(self, nav_data: dict, count: int):
        """عرض حالة النظام"""
        pos = nav_data['position']
        print(f"🔄 [{count:03d}] | "
              f"📍 [{pos[0]:6.2f}, {pos[1]:6.2f}, {pos[2]:6.2f}] m | "
              f"🧭 {nav_data['heading']:6.1f}° | "
              f"🔋 {nav_data['confidence']*100:5.1f}%")
              
    async def shutdown(self):
        """إوقف النظام بأمان"""
        print("\n🛑 إيقاف النظام...")
        self.running = False
        print("✅ تم إيقاف النظام")

async def main():
    """الدالة الرئيسية للتشغيل"""
    print("=" * 70)
    print("       🏔️  نظام Snow Dust المتقدم للملاحة القطبية")
    print("=" * 70)
    print("المحاكاة: عاصفة ثلجية بسرعة رياح 15 م/ث")
    print("معدل التحديث: ~8.3 هرتز")
    print("=" * 70)
    
    system = AdvancedSnowDustSystem()
    
    try:
        # تهيئة النظام
        await system.initialize()
        
        # تشغيل حلقة الملاحة
        await system.navigation_loop(duration=5)
        
        # الحصول على الحالة النهائية
        from snow_dust.navigation.navigation_core import NavigationCore
        final_status = await system.navigator.get_status()
        
        print("\n" + "=" * 70)
        print("📊 تقرير الأداء النهائي:")
        print(f"   الموقع النهائي: {final_status['position']}")
        print(f"   الاتجاه النهائي: {final_status['heading']:.1f} درجة")
        print(f"   مستوى الثقة: {final_status['confidence']*100:.1f}%")
        print("=" * 70)
        
    except KeyboardInterrupt:
        print("\n\n⚠️  تم إيقاف التشغيل بواسطة المستخدم")
    except Exception as e:
        print(f"\n❌ حدث خطأ: {e}")
    finally:
        # إيقاف النظام
        await system.shutdown()

if __name__ == "__main__":
    asyncio.run(main())
