use std::sync::Arc;

use criterion::{Criterion, criterion_group, criterion_main};
use tempfile::TempDir;
use tici_shard::{
    config::WorkerNodeConfig,
    test_utils::{
        TEST_HDFSLOGS_INDEX_META, test_create_backend_storage, test_get_shard_writer_meta,
        write_test_data,
    },
    utils::meta_client_pool::MockMetaClientPool,
};
use tici_system::readable::ReadableSize;

fn bench_cdc_log_frag_writer(c: &mut Criterion) {
    let shard_meta = test_get_shard_writer_meta();
    let index_meta = TEST_HDFSLOGS_INDEX_META.clone();
    let temp_dir = TempDir::new().unwrap();
    let local_data_path = temp_dir.path().to_str().unwrap();
    let mut config = WorkerNodeConfig::new_for_test(local_data_path);
    config.frag_writer.index_flush_size_limit = ReadableSize::mb(1);

    let mock_client_pool = Arc::new(MockMetaClientPool::new());

    let rt = tokio::runtime::Builder::new_current_thread()
        .enable_all()
        .build()
        .unwrap();
    let backend_storage = rt.block_on(async { test_create_backend_storage().await.unwrap() });

    c.bench_function("bench_cdc_log_frag_writer", |b| {
        b.iter(|| {
            let _ = rt.block_on(write_test_data(
                &config,
                &[shard_meta.clone()],
                &index_meta,
                backend_storage.clone(),
                mock_client_pool.clone(),
            ));
        })
    });
}

criterion_group! {
    name = benches;
    config = Criterion::default().sample_size(10);
    targets = bench_cdc_log_frag_writer
}

criterion_main!(benches);
