use std::f64::consts::PI;
use num_complex::{Complex};

/// 返回 N 阶 Butterworth 模拟滤波器原型的 (z, p, k)
/// z: 空的零点（无零点）
/// p: 复数极点（单位圆均匀分布）
/// k: 增益为 1
pub fn butterap(n: usize) -> Result<(Vec<Complex<f64>>, Vec<Complex<f64>>, f64), String> {
    if n == 0 {
        return Ok((vec![], vec![], 1.0));
    }

    let z = vec![]; // 没有零点

    // 生成奇数间隔序列 m: -n + 1, -n + 3, ..., n - 1
    let m: Vec<i32> = (-((n as i32) - 1)..(n as i32))
        .step_by(2)
        .collect();

    // 计算极点 p = -exp(j * pi * m / (2 * n))
    let p: Vec<Complex<f64>> = m
        .iter()
        .map(|&mi| {
            let angle = PI * (mi as f64) / (2.0 * n as f64);
            -Complex::from_polar(1.0, angle)
        })
        .collect();

    let k = 1.0;
    Ok((z.into_iter().map(|x| Complex::new(x, 0.0)).collect(), p, k))
}