"""
معالج الإشارات المتقدم
"""
import numpy as np
from scipy import signal
import pywt

class SignalProcessor:
    """معالجة إشارات المجال الكهربائي"""
    
    def __init__(self, sample_rate=10000):
        self.sample_rate = sample_rate
        self.filter_order = 4
        
    def apply_highpass_filter(self, data: np.ndarray, cutoff=0.5) -> np.ndarray:
        """تطبيق مرشح High-pass"""
        nyquist = self.sample_rate / 2
        normal_cutoff = cutoff / nyquist
        b, a = signal.butter(self.filter_order, normal_cutoff, btype='high', analog=False)
        return signal.filtfilt(b, a, data)
        
    def wavelet_decomposition(self, data: np.ndarray, levels=5) -> dict:
        """تحليل wavelet"""
        coeffs = pywt.wavedec(data, 'db4', level=levels)
        return {
            'approximation': coeffs[0],
            'details': coeffs[1:],
            'levels': levels
        }
        
    def compute_gradients(self, sensor_data: np.ndarray) -> np.ndarray:
        """
        حساب تدرجات المجال الكهربائي
        من قراءات 4 مستشعرات في تكوين رباعي السطوح
        """
        if len(sensor_data) != 4:
            raise ValueError("تتطلب 4 قراءات مستشعر")
            
        # إحداثيات المستشعرات في تكوين رباعي السطوح
        # النقاط: (0,0,0), (1,0,0), (0.5,√3/2,0), (0.5,√3/6,√6/3)
        positions = np.array([
            [0, 0, 0],
            [1, 0, 0],
            [0.5, np.sqrt(3)/2, 0],
            [0.5, np.sqrt(3)/6, np.sqrt(6)/3]
        ])
        
        # حساب التدرجات باستخدام طريقة الفروق المحدودة
        gradients = np.zeros((3, 3))
        for i in range(3):
            for j in range(3):
                if i == j:
                    # تدرج على القطر
                    gradients[i, j] = (sensor_data[3] - sensor_data[0]) / positions[3, i]
                else:
                    # تدرجات مختلطة
                    gradients[i, j] = 0.5 * (sensor_data[1] - sensor_data[2]) / (positions[1, i] - positions[2, i])
                    
        return gradients
