#!/usr/bin/env python3
"""
Snow Dust - النسخة المحسنة
"""
import time
import math
import random
import json

class EnhancedSnowDust:
    def __init__(self):
        self.position = [0.0, 0.0, 0.0]
        self.heading = 0.0
        self.velocity = [0.0, 0.0, 0.0]
        self.confidence = 0.7
        self.history = []
        self.start_time = time.time()
        
    def simulate_triboelectric_field(self):
        """محاكاة أكثر واقعية للمجال الكهربائي الناتج عن التكهرب بالاحتكاك"""
        t = time.time() - self.start_time
        
        # محاكاة رياح قوية (15 م/ث)
        wind_speed = 15.0
        
        # معادلة الشحنة: Q = k * v^1.2 * sin(2πft)
        k = 3.2e-16
        base_charge = k * (wind_speed ** 1.2)
        
        # ترددات مختلفة لمحاكاة التغيرات في العاصفة
        f1, f2, f3 = 0.5, 2.0, 5.0  # هرتز
        charge = base_charge * (
            math.sin(2 * math.pi * f1 * t) * 0.5 +
            math.sin(2 * math.pi * f2 * t) * 0.3 +
            math.sin(2 * math.pi * f3 * t) * 0.2
        )
        
        # تحويل الشحنة إلى مجال كهربائي (V/m)
        e_field = charge * 1e15  # عامل تحجيم
        
        # إضافة ضوضاء واقعية
        noise = random.gauss(0, e_field * 0.1)
        
        return e_field + noise
        
    def update_navigation(self, e_field):
        """تحديث الملاحة بناءً على قياس المجال الكهربائي"""
        
        # 1. تحويل المجال إلى حركة (خوارزمية مبسطة)
        movement_magnitude = abs(e_field) * 0.0001
        
        # 2. اتجاه الحركة يعتمد على اتجاه المجال وتاريخ الحركة
        if e_field > 0:
            angle_change = random.uniform(-1, 1)
        else:
            angle_change = random.uniform(-2, 2)
            
        # 3. تحديث الاتجاه
        self.heading = (self.heading + angle_change) % 360
        
        # 4. حساب مكونات الحركة
        rad = math.radians(self.heading)
        dx = movement_magnitude * math.cos(rad)
        dy = movement_magnitude * math.sin(rad)
        dz = movement_magnitude * random.uniform(-0.1, 0.1)  # تغير طفيف في الارتفاع
        
        # 5. تحديث الموقع والسرعة
        self.position[0] += dx
        self.position[1] += dy
        self.position[2] += dz
        
        self.velocity = [dx * 8.3, dy * 8.3, dz * 8.3]  # تحويل إلى م/ث
        
        # 6. تحديث الثقة (تعتمد على استقرار المجال)
        field_stability = 1.0 / (1.0 + abs(e_field - self.get_average_field()))
        self.confidence = max(0.3, min(0.95, 0.7 + field_stability * 0.3))
        
        # 7. حفظ في السجل
        self.history.append({
            'timestamp': time.time(),
            'position': self.position.copy(),
            'field': e_field,
            'heading': self.heading,
            'confidence': self.confidence
        })
        
        if len(self.history) > 100:  # حفظ آخر 100 قراءة فقط
            self.history.pop(0)
            
    def get_average_field(self):
        """متوسط المجال الكهربائي في السجل"""
        if not self.history:
            return 0
        fields = [h['field'] for h in self.history[-10:]]  # آخر 10 قراءات
        return sum(fields) / len(fields)
        
    def generate_report(self):
        """توليد تقرير عن الأداء"""
        if len(self.history) < 2:
            return "لا توجد بيانات كافية"
            
        duration = self.history[-1]['timestamp'] - self.history[0]['timestamp']
        updates = len(self.history)
        rate = updates / duration if duration > 0 else 0
        
        total_distance = 0
        for i in range(1, len(self.history)):
            p1 = self.history[i-1]['position']
            p2 = self.history[i]['position']
            dx, dy, dz = p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]
            total_distance += math.sqrt(dx*dx + dy*dy + dz*dz)
            
        avg_speed = total_distance / duration if duration > 0 else 0
        
        return {
            'duration': duration,
            'updates': updates,
            'rate': rate,
            'distance': total_distance,
            'speed': avg_speed,
            'final_position': self.position,
            'final_heading': self.heading,
            'final_confidence': self.confidence
        }
        
    def run(self, duration=10):
        """تشغيل النظام"""
        print("=" * 70)
        print("                 🏔️  Snow Dust - النسخة المحسنة")
        print("=" * 70)
        print("محاكاة: عاصفة ثلجية بسرعة رياح 15 م/ث")
        print(f"المدة: {duration} ثانية | معدل التحديث: ~8.3 هرتز")
        print("=" * 70)
        
        start_time = time.time()
        update_count = 0
        
        while time.time() - start_time < duration:
            # 1. قياس المجال الكهربائي
            e_field = self.simulate_triboelectric_field()
            
            # 2. تحديث الملاحة
            self.update_navigation(e_field)
            
            # 3. عرض النتائج
            update_count += 1
            pos = self.position
            
            # ألوان بناءً على الثقة
            if self.confidence > 0.8:
                confidence_color = "🟢"
            elif self.confidence > 0.6:
                confidence_color = "🟡"
            else:
                confidence_color = "🔴"
                
            print(f"🔄 [{update_count:03d}] | "
                  f"📍 [{pos[0]:7.3f}, {pos[1]:7.3f}, {pos[2]:7.3f}] m | "
                  f"🧭 {self.heading:6.1f}° | "
                  f"{confidence_color} {self.confidence*100:5.1f}% | "
                  f"⚡ {e_field:8.2f} V/m | "
                  f"📏 {self.velocity[0]:5.2f} m/s")
                  
            time.sleep(0.12)  # 8.3 هرتز
            
        # تقرير نهائي
        print("=" * 70)
        report = self.generate_report()
        
        print("📊 تقرير الأداء النهائي:")
        print(f"   ⏱️  المدة: {report['duration']:.1f} ثانية")
        print(f"   🔄 التحديثات: {report['updates']}")
        print(f"   📈 المعدل: {report['rate']:.1f} هرتز")
        print(f"   🛣️  المسافة: {report['distance']:.2f} متر")
        print(f"   🏎️  السرعة: {report['speed']:.2f} م/ث")
        print(f"   📍 الموقع النهائي: [{pos[0]:.2f}, {pos[1]:.2f}, {pos[2]:.2f}]")
        print(f"   🧭 الاتجاه النهائي: {self.heading:.1f}°")
        print(f"   🔋 الثقة النهائية: {self.confidence*100:.1f}%")
        print("=" * 70)
        
        # حفظ التقرير إلى ملف
        with open('snowdust_report.json', 'w') as f:
            json.dump(report, f, indent=2)
        print("💾 تم حفظ التقرير في: snowdust_report.json")

# التشغيل
if __name__ == "__main__":
    print("🚀 بدء تشغيل Snow Dust المحسن...")
    system = EnhancedSnowDust()
    system.run(duration=5)
