use crate::prelude::*;
use tokio::task::spawn_blocking;

/// Gets the name of the master password, encryptes the account and adds it to the DB
#[allow(clippy::too_many_arguments)]
async fn get_master_pass(
    bot: Throttle<Bot>,
    msg: Message,
    db: Pool,
    dialogue: MainDialogue,
    mut ids: MessageIds,
    locale: LocaleRef,
    name: String,
    login: String,
    password: String,
    master_pass: String,
) -> crate::Result<()> {
    dialogue.exit().await?;

    let user_id = msg.from().ok_or(NoUserInfo)?.id.0;

    let account = spawn_blocking(move || {
        DecryptedAccount {
            name,
            login,
            password,
        }
        .into_account(user_id, &master_pass)
    })
    .await?;
    account.insert(&db).await?;

    ids.alter_message(&bot, &locale.success, deletion_markup(locale), None)
        .await?;
    Ok(())
}

handler!(
    get_password(name:String, login: String, password: String),
    send_master_password,
    State::GetMasterPass,
    get_master_pass
);
handler!(get_login(name: String, login: String),
send_password,
    State::GetPassword,
    get_password
);
handler!(get_account_name(name: String), send_login, State::GetLogin, get_login);
first_handler!(
    add_account,
    send_account_name,
    State::GetNewName,
    get_account_name
);