// SDD-120 §3 item 5 — resampler throughput bench.
//
// The chanora_audio engine uses a hand-rolled linear resampler
// inside CaptureState (see engine.rs `resample_into_accum`); there
// is no rubato dependency. The bench drives the same code path
// via the §3 bench seam by instantiating CaptureBenchHandle at
// different `in_sample_rate` values (44_100, 16_000, 48_000) and
// feeding a 1-second buffer per iteration. Throughput is reported
// as samples/sec via criterion's `Throughput::Elements`.

#[cfg(any(target_os = "ios", target_os = "macos", target_os = "android"))]
fn main() {}

#[cfg(not(any(target_os = "ios", target_os = "macos", target_os = "android")))]
use chanora_audio::bench_seam::CaptureBenchHandle;
#[cfg(not(any(target_os = "ios", target_os = "macos", target_os = "android")))]
use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput};

#[cfg(not(any(target_os = "ios", target_os = "macos", target_os = "android")))]
mod common;
#[cfg(not(any(target_os = "ios", target_os = "macos", target_os = "android")))]
use common::synthetic_capture_buffer;

#[cfg(not(any(target_os = "ios", target_os = "macos", target_os = "android")))]
fn bench_resampler_throughput(c: &mut Criterion) {
    let mut group = c.benchmark_group("resampler_throughput");

    for (label, in_rate, frames) in [
        ("44100_to_48000", 44_100u32, 44_100usize),
        ("16000_to_48000", 16_000u32, 16_000usize),
        ("48000_passthrough", 48_000u32, 48_000usize),
    ] {
        let buf = synthetic_capture_buffer(frames, 1);
        let mut handle = CaptureBenchHandle::new(in_rate, 1);
        // Pre-warm so the first allocation does not dominate.
        for _ in 0..4 {
            handle.ingest_f32(&buf);
        }
        group.throughput(Throughput::Elements(frames as u64));
        group.bench_function(label, |b| {
            b.iter(|| {
                handle.ingest_f32(black_box(&buf));
            });
        });
    }

    group.finish();
}

#[cfg(not(any(target_os = "ios", target_os = "macos", target_os = "android")))]
criterion_group!(resampler, bench_resampler_throughput);
#[cfg(not(any(target_os = "ios", target_os = "macos", target_os = "android")))]
criterion_main!(resampler);
