"""
النواة المركزية للملاحة
"""
import numpy as np
import asyncio
from typing import Tuple, Optional

class NavigationCore:
    """نواة الملاحة الرئيسية"""
    
    def __init__(self):
        self.position = np.array([0.0, 0.0, 0.0])  # x, y, z
        self.velocity = np.array([0.0, 0.0, 0.0])
        self.heading = 0.0  # اتجاه بالدرجات
        self.confidence = 0.0
        self.running = False
        
    async def start(self, initial_position=None):
        """بدء نظام الملاحة"""
        self.running = True
        if initial_position is not None:
            self.position = np.array(initial_position)
        print("🚀 بدء نظام الملاحة")
        
    async def update_from_e_field(self, e_field_gradients: np.ndarray) -> dict:
        """
        تحديث الموقع بناءً على تدرجات المجال الكهربائي
        
        Args:
            e_field_gradients: مصفوفة 3x3 لتدرجات المجال الكهربائي
            
        Returns:
            dict: معلومات الموقع المحدث
        """
        if not self.running:
            raise RuntimeError("نظام الملاحة غير نشط")
            
        # محاكاة خوارزمية تحويل التدرجات إلى حركة
        # في النظام الحقيقي، هذه معادلات فيزيائية معقدة
        movement = np.dot(e_field_gradients, np.array([1, 0, 0]))
        
        # تحديث الموقع
        self.position += movement * 0.1  # عامل تحجيم
        self.velocity = movement * 10.0
        
        # تحديث الاتجاه
        if np.linalg.norm(movement) > 0.001:
            self.heading = np.degrees(np.arctan2(movement[1], movement[0]))
            
        # تحديث الثقة
        field_strength = np.linalg.norm(e_field_gradients.flatten())
        self.confidence = min(1.0, field_strength / 100.0)
        
        return {
            'position': self.position.copy(),
            'velocity': self.velocity.copy(),
            'heading': self.heading,
            'confidence': self.confidence,
            'timestamp': asyncio.get_event_loop().time()
        }
        
    async def get_status(self) -> dict:
        """الحصول على حالة النظام الحالية"""
        return {
            'running': self.running,
            'position': self.position.tolist(),
            'velocity': self.velocity.tolist(),
            'heading': self.heading,
            'confidence': self.confidence
        }
