use std::str::FromStr;

use sea_orm::Iden;
use sea_orm::Iterable;
use sea_orm::prelude::*;
use sea_orm_macros::DeriveEntityModel;

#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "user", rename_all = "camelCase")]
pub struct Model {
    #[sea_orm(primary_key)]
    id: i32,
    username: String,
    first_name: String,
    middle_name: String,
    #[sea_orm(column_name = "lAsTnAmE")]
    last_name: String,
    orders_count: i32,
}

#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}

impl ActiveModelBehavior for ActiveModel {}

#[test]
fn test_column_names() {
    let columns: Vec<String> = Column::iter().map(|item| item.to_string()).collect();

    assert_eq!(
        columns,
        vec![
            "id",
            "username",
            "firstName",
            "middleName",
            "lAsTnAmE",
            "ordersCount",
        ]
    );

    let col =
        Column::from_str("firstName").expect("column from str should recognize column_name attr");
    assert!(matches!(col, Column::FirstName));
    let col =
        Column::from_str("first_name").expect("column from str should recognize column_name attr");
    assert!(matches!(col, Column::FirstName));

    let col =
        Column::from_str("lastName").expect("column from str should recognize column_name attr");
    assert!(matches!(col, Column::LastName));
    let col =
        Column::from_str("last_name").expect("column from str should recognize column_name attr");
    assert!(matches!(col, Column::LastName));
    let col =
        Column::from_str("lAsTnAmE").expect("column from str should recognize column_name attr");
    assert!(matches!(col, Column::LastName));
}
