use std::hint::black_box;

use criterion::{criterion_group, criterion_main, Criterion};
use ratatui::{
    buffer::Buffer,
    layout::{Alignment, Rect},
    style::Stylize,
    text::Line,
    widgets::Widget,
};

fn line_render(criterion: &mut Criterion) {
    for alignment in [Alignment::Left, Alignment::Center, Alignment::Right] {
        let mut group = criterion.benchmark_group(format!("line_render/{alignment}"));
        group.sample_size(1000);

        let line = &Line::from(vec![
            "This".red(),
            " ".green(),
            "is".italic(),
            " ".blue(),
            "SPARTA!!".bold(),
        ])
        .alignment(alignment);

        for width in [0, 3, 4, 6, 7, 10, 42] {
            let area = Rect::new(0, 0, width, 1);

            group.bench_function(width.to_string(), |bencher| {
                let mut buffer = Buffer::empty(area);
                bencher.iter(|| black_box(line).render(area, &mut buffer));
            });
        }
        group.finish();
    }
}

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