use std::str::FromStr;
use std::time::Duration;
use tracing::info;
use web3_proxy::prelude::migration::sea_orm::prelude::Decimal;
use web3_proxy::prelude::reqwest;
use web3_proxy::prelude::tokio;
use web3_proxy::test_utils::mysql::TestMysql;
use web3_proxy::test_utils::TestAnvil;
use web3_proxy_cli::test_utils::admin_increases_balance::admin_increase_balance;
use web3_proxy_cli::test_utils::create_admin::create_user_as_admin;
use web3_proxy_cli::test_utils::create_user::create_user;
use web3_proxy_cli::test_utils::user_balance::user_get_balance;
use web3_proxy_cli::test_utils::TestApp;

// #[cfg_attr(not(feature = "tests-needing-docker"), ignore)]
#[ignore = "under construction"]
#[test_log::test(tokio::test)]
async fn test_admin_imitate_user() {
    todo!();
}

#[cfg_attr(not(feature = "tests-needing-docker"), ignore)]
#[test_log::test(tokio::test)]
async fn test_admin_grant_credits() {
    info!("Starting admin grant credits test");

    let a: TestAnvil = TestAnvil::spawn(31337).await;

    let db = TestMysql::spawn().await;

    let x = TestApp::spawn(&a, Some(&db), None, None).await;

    let r = reqwest::Client::builder()
        .timeout(Duration::from_secs(3))
        .build()
        .unwrap();

    // Setup variables that will be used
    let user_wallet = a.wallet(0);
    let admin_wallet = a.wallet(1);
    info!(?admin_wallet);

    let user_login_response = create_user(&x, &r, &user_wallet, None).await;
    let admin_login_response = create_user_as_admin(&x, &db, &r, &admin_wallet).await;
    info!(?admin_login_response);

    let increase_balance_response = admin_increase_balance(
        &x,
        &r,
        &admin_login_response,
        &user_wallet,
        Decimal::from(100),
    )
    .await;

    assert_eq!(
        Decimal::from_str(increase_balance_response["amount"].as_str().unwrap()).unwrap(),
        Decimal::from(100)
    );

    let user_balance = user_get_balance(&x, &r, &user_login_response).await;
    assert_eq!(user_balance.remaining(), Decimal::from(100));

    x.wait_for_stop();
}

// #[cfg_attr(not(feature = "tests-needing-docker"), ignore)]
#[ignore = "under construction"]
#[test_log::test(tokio::test)]
async fn test_admin_change_user_tier() {
    todo!();
}
