"""
معالج إشارات باستخدام NumPy فقط
"""
import numpy as np

class NumpySignalProcessor:
    """معالج إشارات باستخدام مكتبات Python الأساسية"""
    
    def __init__(self, sample_rate=10000):
        self.sample_rate = sample_rate
        
    def simple_filter(self, data: np.ndarray) -> np.ndarray:
        """مرشح بسيط بدون scipy"""
        # مرشح متوسط متحرك
        window_size = 5
        kernel = np.ones(window_size) / window_size
        return np.convolve(data, kernel, mode='same')
        
    def compute_fft_simple(self, data: np.ndarray):
        """FFT مبسط باستخدام numpy فقط"""
        n = len(data)
        freq = np.fft.fftfreq(n, d=1/self.sample_rate)
        fft_values = np.fft.fft(data)
        magnitude = np.abs(fft_values)
        return freq[:n//2], magnitude[:n//2]
        
    def estimate_gradients(self, sensor_data: np.ndarray) -> np.ndarray:
        """
        تقدير تدرجات المجال الكهربائي
        من 4 مستشعرات في تكوين رباعي السطوح
        """
        if sensor_data.shape != (4,):
            raise ValueError(f"توقع 4 قيم، حصلت على {sensor_data.shape}")
            
        # إحداثيات المستشعرات (رباعي سطوح)
        positions = np.array([
            [0, 0, 0],          # المستشعر 1
            [1, 0, 0],          # المستشعر 2
            [0.5, 0.866, 0],    # المستشعر 3
            [0.5, 0.289, 0.816] # المستشعر 4
        ])
        
        # حساب التدرجات باستخدام الفروق المحدودة
        gradients = np.zeros((3, 3))
        
        for i in range(3):
            for j in range(3):
                if i == j:
                    # تدرج على المحور
                    delta_val = sensor_data[3] - sensor_data[0]
                    delta_pos = positions[3, i] - positions[0, i]
                    if abs(delta_pos) > 1e-6:
                        gradients[i, j] = delta_val / delta_pos
                else:
                    # تدرجات مختلطة (تقريب)
                    gradients[i, j] = 0.5 * (sensor_data[1] - sensor_data[2])
                    
        return gradients
        
    def detect_peaks(self, signal: np.ndarray, threshold=0.5):
        """كشف القمم في الإشارة"""
        peaks = []
        for i in range(1, len(signal)-1):
            if signal[i] > signal[i-1] and signal[i] > signal[i+1]:
                if signal[i] > threshold:
                    peaks.append(i)
        return np.array(peaks)
