use crate::ui::user::prelude::*;
use crate::ui::user::{update_state_preserving_cache, invalidate_profile_cache, make_menu_keyboard};

pub async fn merge_account_handler(
    bot: Bot,
    dialogue: MasterDialogue,
    msg: Message,
    settings: HandlerSettings,
) -> HandlerResult {
    let ln = settings.language;

    let message = t8x!(Ru, r#"
        🔗 <b>Объединение аккаунтов</b>
        
        Введите email или логин аккаунта, который хотите объединить с текущим.
        
        ⚠️ <b>Внимание!</b> После объединения все данные из указанного аккаунта будут перенесены в текущий, а исходный аккаунт будет удален.
    "#, &ln);

    let keyboard = make_inline_keyboard(
        vec![(t8x!(Ru, "🔙Назад к расширенным функциям🔙", &ln), Callback::AdvancedFeatures).into()],
        1,
    );

    bot.edit_message_text(msg.chat.id, msg.id, message)
        .parse_mode(teloxide::types::ParseMode::Html)
        .reply_markup(keyboard)
        .await?;

    update_state_preserving_cache(&dialogue, UserStateKind::ReceiveMergeAccountEmail).await?;
    Ok(())
}

pub async fn receive_merge_account_email(
    bot: Bot,
    msg: Message,
    dialogue: MasterDialogue,
    settings: HandlerSettings,
) -> HandlerResult {
    let ln = settings.language;

    let email_or_login = msg.text().unwrap_or("").trim().to_string();
    
    bot.delete_message(msg.chat.id, msg.id).await?;

    if email_or_login.is_empty() {
        let error_message = t8x!(Ru, "❌ Пожалуйста, введите email или логин", &ln);
        bot.send_message(msg.chat.id, error_message)
            .reply_markup(make_menu_keyboard(ln))
            .await?;
        update_state_preserving_cache(&dialogue, UserStateKind::UserMenu).await?;
        return Ok(());
    }

    let message = strfmt!(t8x!(Ru, r#"
        🔐 <b>Введите пароль</b>
        
        Введите пароль для аккаунта: <code>{email_or_login}</code>
    "#, &ln), email_or_login => email_or_login.clone()).unwrap();

    let keyboard = make_inline_keyboard(
        vec![(t8x!(Ru, "🔙Назад к расширенным функциям🔙", &ln), Callback::AdvancedFeatures).into()],
        1,
    );

    bot.send_message(msg.chat.id, message)
        .parse_mode(teloxide::types::ParseMode::Html)
        .reply_markup(keyboard)
        .await?;

    update_state_preserving_cache(&dialogue, UserStateKind::ReceiveMergeAccountPassword { 
        email_or_login: email_or_login.clone() 
    }).await?;
    Ok(())
}

pub async fn receive_merge_account_password(
    bot: Bot,
    msg: Message,
    dialogue: MasterDialogue,
    settings: HandlerSettings,
    email_or_login: String,
) -> HandlerResult {
    let ln = settings.language;

    let password = msg.text().unwrap_or("").trim();
    
    bot.delete_message(msg.chat.id, msg.id).await?;

    if password.is_empty() {
        let error_message = t8x!(Ru, "❌ Пожалуйста, введите пароль", &ln);
        bot.send_message(msg.chat.id, error_message)
            .reply_markup(make_menu_keyboard(ln))
            .await?;
        update_state_preserving_cache(&dialogue, UserStateKind::UserMenu).await?;
        return Ok(());
    }

    // Show loading message
    let loading_message = t8x!(Ru, "⏳ Проверяем учетные данные и объединяем аккаунты...", &ln);
    let loading_msg = bot.send_message(msg.chat.id, loading_message).await?;

    // Authenticate the source account
    match api::authenticate_user(&email_or_login, password).await {
        Ok(source_user_id) => {
            // Get current user's ID (Telegram ID)
            let current_user_id = msg.chat.id.0.to_string();
            
            // Perform the merge
            match api::merge_users(&source_user_id, &current_user_id).await {
                Ok(merge_results) => {
                    let mut result_text = t8x!(Ru, "✅ <b>Аккаунты успешно объединены!</b>\n\n", &ln).to_string();
                    result_text.push_str(&t8x!(Ru, "<b>Результаты объединения:</b>\n", &ln));
                    
                    for result in merge_results {
                        result_text.push_str(&strfmt!(t8x!(Ru, "• {details}: {rows_affected} записей\n", &ln), 
                            details => result.details.clone(), 
                            rows_affected => result.rows_affected).unwrap());
                    }
                    
                    bot.edit_message_text(msg.chat.id, loading_msg.id, result_text)
                        .parse_mode(teloxide::types::ParseMode::Html)
                        .reply_markup(make_inline_keyboard(
                            vec![(t8x!(Ru, "🔙Назад к профилю🔙", &ln), Callback::BackToProfile).into()],
                            1,
                        ))
                        .await?;
                        
                    // Invalidate profile cache to refresh data
                    invalidate_profile_cache(&dialogue).await?;
                }
                Err(e) => {
                    log::error!("Failed to merge users: {}", e);
                    let error_message = t8x!(Ru, "❌ Не удалось объединить аккаунты. Попробуйте позже.", &ln);
                    bot.edit_message_text(msg.chat.id, loading_msg.id, error_message)
                        .reply_markup(make_inline_keyboard(
                            vec![(t8x!(Ru, "🔙Назад к профилю🔙", &ln), Callback::BackToProfile).into()],
                            1,
                        ))
                        .await?;
                }
            }
        }
        Err(e) => {
            log::error!("Failed to authenticate user: {}", e);
            let error_message = t8x!(Ru, "❌ Неверные учетные данные. Проверьте email/логин и пароль.", &ln);
            bot.edit_message_text(msg.chat.id, loading_msg.id, error_message)
                .reply_markup(make_inline_keyboard(
                    vec![(t8x!(Ru, "🔙Назад к профилю🔙", &ln), Callback::BackToProfile).into()],
                    1,
                ))
                .await?;
        }
    }

    update_state_preserving_cache(&dialogue, UserStateKind::UserMenu).await?;
    Ok(())
}
