from __future__ import annotations

import numpy as np


def make_signal(sample_rate: int = 44100, seconds: float = 2.0):
    t = np.arange(int(sample_rate * seconds), dtype=np.float32) / sample_rate
    left = (
        0.22 * np.sin(2 * np.pi * 93 * t)
        + 0.10 * np.sin(2 * np.pi * 997 * t)
        + 0.035 * np.sin(2 * np.pi * 7200 * t)
    )
    right = (
        0.20 * np.sin(2 * np.pi * 97 * t + 0.1)
        + 0.09 * np.sin(2 * np.pi * 1203 * t)
        + 0.03 * np.sin(2 * np.pi * 7600 * t)
    )
    audio = np.column_stack((left, right)).astype(np.float32)
    pulse = np.zeros_like(t, dtype=np.float32)
    for start in range(0, len(t), sample_rate // 2):
        width = min(1200, len(t) - start)
        pulse[start:start + width] = np.linspace(1.0, 0.0, width, dtype=np.float32)
    trigger = np.column_stack((pulse, pulse)).astype(np.float32)
    return audio, trigger, sample_rate


def run_hot_path():
    from engine.processor import AudioEngine, MasteringChainFactory

    audio, trigger, sr = make_signal()
    engine = AudioEngine(temp_dir="/tmp/autoremaster-dsp-regression")
    engine.sample_rate = sr

    processed = engine.apply_sidechain(audio, trigger, strength=0.38, mode="pump")
    processed = engine.apply_deesser(
        processed, threshold_db=-23.0, ratio=3.5, frequency_hz=6500.0, bandwidth_hz=1800.0
    )
    processed = engine.apply_multiband_compression(
        processed,
        band_settings=[
            {"threshold_db": -18.0, "ratio": 3.0, "attack_ms": 12.0, "release_ms": 110.0, "makeup_db": 1.0},
            {"threshold_db": -15.0, "ratio": 2.2, "attack_ms": 8.0, "release_ms": 90.0, "makeup_db": 0.5},
            {"threshold_db": -12.0, "ratio": 1.8, "attack_ms": 4.0, "release_ms": 55.0, "makeup_db": 0.25},
        ],
    )
    processed = engine.apply_dynamic_eq(
        processed,
        band_settings=[
            {"enabled": True, "freq_hz": 180.0, "q": 0.8, "gain_db": -0.4, "range_db": -2.0, "threshold_db": -20.0, "attack_ms": 14.0, "release_ms": 120.0, "filter_type": "low_shelf", "mode": "downward"},
            {"enabled": True, "freq_hz": 2800.0, "q": 1.4, "gain_db": 0.25, "range_db": -2.5, "threshold_db": -18.0, "attack_ms": 8.0, "release_ms": 85.0, "filter_type": "bell", "mode": "downward"},
        ],
    )
    processed = engine.apply_dereverb(processed, reduction_amount=0.25, gate_threshold_db=-38.0)
    limited = MasteringChainFactory._apply_limiter(
        processed, sr, threshold_db=-1.5, ceiling_db=-0.3, release_ms=65.0
    )

    mono = np.mean(np.abs(audio), axis=1)
    rms_envelope = engine._calculate_rms_envelope(mono, int(sr * 0.01))
    target_gain = np.linspace(1.0, 0.35, len(mono), dtype=np.float32)
    target_gain[len(target_gain)//2:] = target_gain[len(target_gain)//2:][::-1]
    gain_envelope = engine._apply_attack_release_gain(target_gain, sr, 3.0, 80.0)

    return {
        "hot_path": np.asarray(limited, dtype=np.float32),
        "rms_envelope": np.asarray(rms_envelope, dtype=np.float32),
        "gain_envelope": np.asarray(gain_envelope, dtype=np.float32),
    }
