use criterion::{Bencher, Criterion};
use raft::{storage::MemStorage, Config, Raft};
use DEFAULT_RAFT_SETS;

pub fn bench_raft(c: &mut Criterion) {
    bench_raft_new(c);
    bench_raft_campaign(c);
}

fn quick_raft(voters: usize, learners: usize) -> Raft<MemStorage> {
    let id = 1;
    let storage = MemStorage::default();
    let config = Config::new(id);
    let mut raft = Raft::new(&config, storage);
    (0..voters).for_each(|id| {
        raft.add_node(id as u64);
    });
    (voters..learners).for_each(|id| {
        raft.add_learner(id as u64);
    });
    raft
}

pub fn bench_raft_new(c: &mut Criterion) {
    let bench = |voters, learners| {
        move |b: &mut Bencher| {
            // No setup.
            b.iter(|| quick_raft(voters, learners));
        }
    };

    DEFAULT_RAFT_SETS.iter().for_each(|(voters, learners)| {
        c.bench_function(
            &format!("Raft::new ({}, {})", voters, learners),
            bench(*voters, *learners),
        );
    });
}

pub fn bench_raft_campaign(c: &mut Criterion) {
    let bench = |voters, learners, variant| {
        move |b: &mut Bencher| {
            b.iter(|| {
                // TODO: Make raft clone somehow.
                let mut raft = quick_raft(voters, learners);
                raft.campaign(variant)
            })
        }
    };

    DEFAULT_RAFT_SETS
        .iter()
        .skip(1)
        .for_each(|(voters, learners)| {
            // We don't want to make `raft::raft` public at this point.
            let msgs = [
                "CampaignPreElection",
                "CampaignElection",
                "CampaignTransfer",
            ];
            // Skip the first since it's 0,0
            for msg in &msgs {
                c.bench_function(
                    &format!("Raft::campaign ({}, {}, {})", voters, learners, msg),
                    bench(*voters, *learners, msg.as_bytes()),
                );
            }
        });
}
