use crate::io::write::calc_col_headers;
use crate::sheet_::dedup_colheader;
use crate::{Sheet, WorkBook};
use icu_locale_core::locale;

fn setup_test_calc_col_headers() -> WorkBook {
    let mut wb = WorkBook::new(locale!("de-AT"));

    let mut sh0 = Sheet::new("1");
    sh0.set_col_width(0, cm!(2.54));
    sh0.set_col_width(1, cm!(2.54));
    sh0.set_col_width(2, cm!(2.54));
    sh0.set_col_width(3, cm!(2.54));
    sh0.set_col_width(4, cm!(2.54));
    sh0.set_col_width(5, cm!(2.54));
    sh0.set_col_width(6, cm!(2.54));
    dedup_colheader(&mut sh0).unwrap();

    wb.push_sheet(sh0);

    wb
}

#[test]
fn test_calc_col_headers() {
    let mut wb = setup_test_calc_col_headers();
    let sh0 = wb.sheet_mut(0);
    sh0.set_header_cols(0, 1);
    calc_col_headers(&mut wb).unwrap();

    let sh0 = wb.sheet_mut(0);
    assert!(sh0.col_header.get(&0).is_some());
    assert!(sh0.col_header.get(&2).is_some());
    assert_eq!(sh0.col_header.get(&0).unwrap().span, 2);
    assert_eq!(sh0.col_header.get(&2).unwrap().span, 5);

    let mut wb = setup_test_calc_col_headers();
    let sh0 = wb.sheet_mut(0);
    sh0.add_col_group(1, 3);
    sh0.add_col_group(4, 6);
    calc_col_headers(&mut wb).unwrap();

    let sh0 = wb.sheet_mut(0);
    assert!(sh0.col_header.get(&0).is_some());
    assert!(sh0.col_header.get(&1).is_some());
    assert!(sh0.col_header.get(&4).is_some());
    assert_eq!(sh0.col_header.get(&0).unwrap().span, 1);
    assert_eq!(sh0.col_header.get(&1).unwrap().span, 3);
    assert_eq!(sh0.col_header.get(&4).unwrap().span, 3);

    let mut wb = setup_test_calc_col_headers();
    let sh0 = wb.sheet_mut(0);
    sh0.add_col_group(4, 9);
    calc_col_headers(&mut wb).unwrap();

    let sh0 = wb.sheet_mut(0);
    assert!(sh0.col_header.get(&0).is_some());
    assert!(sh0.col_header.get(&4).is_some());
    assert_eq!(sh0.col_header.get(&0).unwrap().span, 4);
    assert_eq!(sh0.col_header.get(&4).unwrap().span, 3);

    let mut wb = WorkBook::new(locale!("de-AT"));
    let mut sh0 = Sheet::new("1");
    sh0.add_col_group(4, 9);
    calc_col_headers(&mut wb).unwrap();
    wb.push_sheet(sh0);

    let sh0 = wb.sheet_mut(0);
    assert!(sh0.col_header.is_empty());
}
