use comfy_table::*;
use pretty_assertions::assert_eq;

fn get_table() -> Table {
    let mut table = Table::new();
    table
        .load_style(presets::UTF8_FULL)
        .set_header(vec![
            "hidden_header",
            "smol",
            "hidden_header",
            "Two_hidden_headers_in_a_row",
            "Header2",
            "Header3",
            "hidden_header",
        ])
        .add_row(vec![
            "start_hidden",
            "smol",
            "middle_hidden",
            "two_hidden_headers_in_a_row",
            "This is another text",
            "This is the third text",
            "end_hidden",
        ])
        .add_row(vec![
            "asdf",
            "smol",
            "asdf",
            "asdf",
            "Now\nadd some\nmulti line stuff",
            "This is awesome",
            "asdf",
        ]);

    // Hide the first, third and 6th column
    table
        .column_mut(0)
        .unwrap()
        .set_constraint(ColumnConstraint::Hidden);
    table
        .column_mut(2)
        .unwrap()
        .set_constraint(ColumnConstraint::Hidden);
    table
        .column_mut(3)
        .unwrap()
        .set_constraint(ColumnConstraint::Hidden);

    table
        .column_mut(6)
        .unwrap()
        .set_constraint(ColumnConstraint::Hidden);

    table
}

/// Make sure hidden columns won't be displayed
#[test]
fn hidden_columns() {
    let table = get_table();
    println!("{table}");
    let expected = "
┌──────┬──────────────────────┬────────────────────────┐
│ smol ┆ Header2              ┆ Header3                │
╞══════╪══════════════════════╪════════════════════════╡
│ smol ┆ This is another text ┆ This is the third text │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ smol ┆ Now                  ┆ This is awesome        │
│      ┆ add some             ┆                        │
│      ┆ multi line stuff     ┆                        │
└──────┴──────────────────────┴────────────────────────┘";
    assert_eq!(expected, "\n".to_string() + &table.to_string());
}

/// Make sure dynamic adjustment still works with hidden columns
#[test]
fn hidden_columns_with_dynamic_adjustment() {
    let mut table = get_table();
    table.set_width(25);
    table.set_content_arrangement(ContentArrangement::Dynamic);

    println!("{table}");
    let expected = "
┌──────┬────────┬───────┐
│ smol ┆ Header ┆ Heade │
│      ┆ 2      ┆ r3    │
╞══════╪════════╪═══════╡
│ smol ┆ This   ┆ This  │
│      ┆ is ano ┆ is    │
│      ┆ ther   ┆ the   │
│      ┆ text   ┆ third │
│      ┆        ┆ text  │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ smol ┆ Now    ┆ This  │
│      ┆ add    ┆ is    │
│      ┆ some   ┆ aweso │
│      ┆ multi  ┆ me    │
│      ┆ line   ┆       │
│      ┆ stuff  ┆       │
└──────┴────────┴───────┘";
    assert_eq!(expected, "\n".to_string() + &table.to_string());
}

/// Nothing breaks, if all columns are hidden
#[test]
fn only_hidden_columns() {
    let mut table = get_table();
    table.set_constraints(vec![
        ColumnConstraint::Hidden,
        ColumnConstraint::Hidden,
        ColumnConstraint::Hidden,
        ColumnConstraint::Hidden,
        ColumnConstraint::Hidden,
        ColumnConstraint::Hidden,
    ]);

    println!("{table}");
    let expected = "
┌┐
╞╡
├┤
└┘";
    assert_eq!(expected, "\n".to_string() + &table.to_string());
}
