import numpy as np

class PythonToolsEngine:
    @staticmethod
    def normalize_peak(y: np.ndarray, target_db: float = 0.0) -> np.ndarray:
        """Peak normalize audio array to target_db (0 dB default)."""
        if len(y) == 0:
            return y
        max_val = np.max(np.abs(y))
        if max_val == 0:
            return y
        target_amp = 10 ** (target_db / 20.0)
        gain = target_amp / max_val
        return y * gain

    @staticmethod
    def invert_phase(y: np.ndarray) -> np.ndarray:
        """Invert audio phase (180 degree flip)."""
        return -1.0 * y

    @staticmethod
    def swap_channels(y: np.ndarray) -> np.ndarray:
        """Swap Left and Right channels for stereo audio."""
        if y.ndim < 2 or y.shape[0] < 2:
            return y
        swapped = np.copy(y)
        swapped[[0, 1]] = swapped[[1, 0]]
        return swapped

    @staticmethod
    def generate_synth_wave(wave_type: str = "sine", freq: float = 440.0, duration: float = 2.0, sr: int = 44100) -> np.ndarray:
        """Generate pure synthesized waveform array (sine, square, sawtooth)."""
        num_samples = int(duration * sr)
        t = np.linspace(0, duration, num_samples, endpoint=False)
        
        if wave_type == "sine":
            audio = np.sin(2 * np.pi * freq * t)
        elif wave_type == "square":
            audio = np.sign(np.sin(2 * np.pi * freq * t))
        elif wave_type == "sawtooth":
            audio = 2 * (t * freq - np.floor(0.5 + t * freq))
        else:
            audio = np.sin(2 * np.pi * freq * t)
            
        return audio.astype(np.float32)
