"""
بروتوكول اختبار المجسات الكهربائية
Phase 2 - Electrical Validation
"""

import numpy as np
from datetime import datetime

class FieldMillTester:
    """نظام اختبار حساسات E-field"""
    
    def __init__(self):
        self.test_results = {}
        self.timestamp = datetime.now()
        
        # معايير الاختبار من Phase 1
        self.specs = {
            'field_range': (-20000, 20000),  # V/m
            'resolution': 0.1,               # V/m
            'noise_floor': 0.5,              # V/m RMS
            'bandwidth': 1000,               # Hz
            'linearity_error': 0.5,          # %
            'temperature_range': (-40, 85),  # °C
        }
    
    def test_power_consumption(self, sensor_id):
        """اختبار استهلاك الطاقة"""
        print(f"\n⚡ اختبار استهلاك الطاقة - Sensor {sensor_id}")
        print("-"*40)
        
        # القيم المتوقعة
        expected_current = 0.010  # A (10mA)
        expected_power = 3.3 * expected_current  # W
        
        # محاكاة القياس (في الواقع ستقرأ من multimeter)
        measured_current = np.random.normal(0.010, 0.001)
        measured_power = 3.3 * measured_current
        
        error = abs(measured_current - expected_current) / expected_current * 100
        
        result = {
            'expected_current': expected_current,
            'measured_current': measured_current,
            'expected_power': expected_power,
            'measured_power': measured_power,
            'error_percent': error,
            'pass': error < 10  # ±10% tolerance
        }
        
        print(f"التيار المتوقع: {expected_current*1000:.1f} mA")
        print(f"التيار المقاس: {measured_current*1000:.1f} mA")
        print(f"الخطأ: {error:.1f}%")
        print(f"الحالة: {'✅ PASS' if result['pass'] else '❌ FAIL'}")
        
        return result
    
    def test_noise_floor(self, sensor_id):
        """اختبار مستوى الضوضاء"""
        print(f"\n📊 اختبار ضوضاء الخلفية - Sensor {sensor_id}")
        print("-"*40)
        
        # محاكاة قياس الضوضاء (في الواقع: FFT على إشارة بدون مجال)
        noise_samples = np.random.normal(0, 0.3, 10000)  # V/m
        
        noise_rms = np.sqrt(np.mean(noise_samples**2))
        noise_peak = np.max(np.abs(noise_samples))
        
        result = {
            'noise_rms': noise_rms,
            'noise_peak': noise_peak,
            'spec_limit': self.specs['noise_floor'],
            'pass': noise_rms < self.specs['noise_floor']
        }
        
        print(f"الضوضاء RMS: {noise_rms:.2f} V/m")
        print(f"الضوضاء القصوى: {noise_peak:.2f} V/m")
        print(f"الحد المسموح: {self.specs['noise_floor']} V/m")
        print(f"الحالة: {'✅ PASS' if result['pass'] else '❌ FAIL'}")
        
        return result
    
    def test_linearity(self, sensor_id):
        """اختبار الخطية عبر المدى الكامل"""
        print(f"\n📈 اختبار الخطية - Sensor {sensor_id}")
        print("-"*40)
        
        # نقاط اختبار عبر المدى
        test_fields = [-20000, -10000, -5000, 0, 5000, 10000, 20000]  # V/m
        
        errors = []
        for field in test_fields:
            # محاكاة القراءة (في الواقع: تطبيق مجال معروف)
            measured = field * (1 + np.random.normal(0, 0.002))  # 0.2% عشوائي
            error = abs(measured - field) / abs(field) * 100 if field != 0 else 0
            errors.append(error)
            
            print(f"المجال: {field/1000:6.1f} kV/m → القراءة: {measured/1000:6.1f} kV/m | الخطأ: {error:5.2f}%")
        
        max_error = max(errors)
        
        result = {
            'max_error': max_error,
            'spec_limit': self.specs['linearity_error'],
            'pass': max_error < self.specs['linearity_error']
        }
        
        print(f"\nالخطأ الأقصى: {max_error:.2f}%")
        print(f"الحد المسموح: {self.specs['linearity_error']}%")
        print(f"الحالة: {'✅ PASS' if result['pass'] else '❌ FAIL'}")
        
        return result
    
    def run_complete_test(self):
        """تشغيل جميع اختبارات المجسات الأربعة"""
        print("="*60)
        print("🔬 نظام اختبار المجسات الكهربائية - PHASE 2")
        print(f"التاريخ: {self.timestamp}")
        print("="*60)
        
        all_results = {}
        
        for sensor_id in range(4):
            print(f"\n{'='*40}")
            print(f"المجس #{sensor_id + 1}")
            print(f"{'='*40}")
            
            sensor_results = {
                'power': self.test_power_consumption(sensor_id),
                'noise': self.test_noise_floor(sensor_id),
                'linearity': self.test_linearity(sensor_id),
            }
            
            # تحديد الحالة النهائية
            all_pass = all(r['pass'] for r in sensor_results.values())
            sensor_results['overall_pass'] = all_pass
            
            all_results[f'sensor_{sensor_id}'] = sensor_results
            
            print(f"\n📋 النتيجة النهائية للمجس #{sensor_id + 1}:")
            print(f"   استهلاك الطاقة: {'✅' if sensor_results['power']['pass'] else '❌'}")
            print(f"   ضوضاء الخلفية: {'✅' if sensor_results['noise']['pass'] else '❌'}")
            print(f"   الخطية: {'✅' if sensor_results['linearity']['pass'] else '❌'}")
            print(f"   الحالة الكلية: {'✅ APPROVED' if all_pass else '❌ REJECTED'}")
        
        # تقرير موجز
        print(f"\n{'='*60}")
        print("📊 تقرير موجز لجميع المجسات:")
        passed = sum(1 for r in all_results.values() if r['overall_pass'])
        print(f"المجسات الناجحة: {passed}/4 ({passed/4*100:.0f}%)")
        
        if passed == 4:
            print("🎉 جميع المجسات اجتازت الاختبار!")
            print("✅ جاهز للمرحلة التالية: المعايرة")
        else:
            print("⚠️  بعض المجسات تحتاج إصلاح/استبدال")
            print("❌ لا تنتقل للمعايرة قبل الإصلاح")
        
        return all_results

if __name__ == "__main__":
    tester = FieldMillTester()
    results = tester.run_complete_test()
    
    # حفظ النتائج
    with open("electrical_test_results.txt", "w") as f:
        f.write(str(results))
