use criterion::{Criterion, criterion_group, criterion_main};

pub fn criterion_benchmark(c: &mut Criterion) {
    puffin::set_scopes_on(true);

    c.bench_function("profile_function", |b| {
        puffin::GlobalProfiler::lock().new_frame();
        puffin::profile_scope!("keep one scope open so we don't profile sending scopes");
        b.iter(|| {
            puffin::profile_function!();
        })
    });
    c.bench_function("profile_function_data", |b| {
        puffin::GlobalProfiler::lock().new_frame();
        puffin::profile_scope!("keep one scope open so we don't profile sending scopes");
        b.iter(|| {
            puffin::profile_function!("my_mesh.obj");
        })
    });
    c.bench_function("profile_scope", |b| {
        puffin::GlobalProfiler::lock().new_frame();
        puffin::profile_scope!("keep one scope open so we don't profile sending scopes");
        b.iter(|| {
            puffin::profile_scope!("my longish scope name");
        })
    });
    c.bench_function("profile_scope_data", |b| {
        puffin::GlobalProfiler::lock().new_frame();
        puffin::profile_scope!("keep one scope open so we don't profile sending scopes");
        b.iter(|| {
            puffin::profile_scope!("my longish scope name", "my_mesh.obj");
        })
    });
    c.bench_function("flush_frames", |b| {
        puffin::GlobalProfiler::lock().new_frame();
        let _fv = puffin::GlobalFrameView::default();

        b.iter(|| {
            puffin::profile_function!();
            puffin::GlobalProfiler::lock().new_frame();
        })
    });

    puffin::set_scopes_on(false);
    c.bench_function("profile_function_off", |b| {
        puffin::GlobalProfiler::lock().new_frame();
        puffin::profile_scope!("keep one scope open so we don't profile sending scopes");
        b.iter(|| {
            puffin::profile_function!();
        })
    });
    c.bench_function("profile_function_data_off", |b| {
        puffin::GlobalProfiler::lock().new_frame();
        puffin::profile_scope!("keep one scope open so we don't profile sending scopes");
        b.iter(|| {
            puffin::profile_function!("my_mesh.obj");
        })
    });
    c.bench_function("profile_scope_off", |b| {
        puffin::GlobalProfiler::lock().new_frame();
        puffin::profile_scope!("keep one scope open so we don't profile sending scopes");
        b.iter(|| {
            puffin::profile_scope!("my longish scope name");
        })
    });
    c.bench_function("profile_scope_data_off", |b| {
        puffin::GlobalProfiler::lock().new_frame();
        puffin::profile_scope!("keep one scope open so we don't profile sending scopes");
        b.iter(|| {
            puffin::profile_scope!("my longish scope name", "my_mesh.obj");
        })
    });
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
