use crate::ui::prelude::*;
use htmlescape::encode_minimal;

pub async fn fix_i18n_handler(
    bot: Bot,
    msg: Message,
    dialogue: MasterDialogue,
) -> HandlerResult {
    use crate::repository::api;

    bot.send_message(msg.chat.id, "🔍 Поиск неспаренных переводов...")
        .await?;

    match api::get_unpaired_translation().await {
        Ok(Some(translation)) => {
            let (missing_language, target_lang_code) = match translation.language_legacy_code {
                Language::Ru => ("<code>eng</code>", Language::En),
                Language::En => ("<code>rus</code>", Language::Ru),
            };

            let message = strfmt!(indoc! {r#"
                    🔤 <b>Найден неспаренный перевод:</b>

                    <b>ID:</b> <code>{hash}</code>
                    <b>Нужно перевести с</b> <code>{lang_code}</code> <b>на</b> <code>{missing_language}</code>
                    <b>Текст:</b>
                    
                    <pre><code>{content}</code></pre>

                    📝 <b>Напишите перевод для добавления:</b>
                "#},
                hash => translation.hash.clone(),
                lang_code => translation.language_legacy_code.to_string(),
                missing_language => missing_language,
                content => encode_minimal(&translation.content)
            )?;

            bot.send_message(msg.chat.id, message)
                .await?;

            dialogue.update_admin_kind(AdminStateKind::WaitingForTranslation {
                hash: translation.hash,
                target_language: target_lang_code,
                original_content: translation.content,
                original_language: translation.language_legacy_code,
            }).await?;
        }
        Ok(None) => {
            bot.send_message(msg.chat.id, "✅ Все переводы спарены! Неспаренных переводов не найдено.")
                .await?;
        }
        Err(e) => {
            log::error!("Failed to get unpaired translation: {}", e);
            bot.send_message(msg.chat.id, format!("❌ Ошибка при получении переводов: {}", e))
                .await?;
        }
    }

    Ok(())
}

pub async fn handle_translation_confirmation(
    bot: Bot,
    msg: Message,
    dialogue: MasterDialogue,
) -> HandlerResult {
    use crate::repository::api;

    let Some(state) = dialogue.get().await? else {
        return Err("No state found in dialogue".into());
    };
    let AdminStateKind::ConfirmTranslation { hash, target_language, original_content, original_language, translation_text } = state.admin_kind else {
        return Err("Expected ConfirmTranslation state".into());
    };

    bot.send_message(msg.chat.id, "💾 Сохранение перевода...")
        .await?;

    match api::add_translation(hash.clone(), target_language.clone(), translation_text.clone()).await {
        Ok(_) => {
            let success_message = strfmt!(indoc! {r#"
                    ✅ <b>Перевод успешно добавлен!</b>
 
                    <b>ID:</b> <code>{hash}</code>
                    <b>Язык:</b> {target_language}
                    <b>Оригинал</b> <code>{original_language}</code><b>:</b>
 
                    <pre><code>{original_content}</code></pre>
                    <b>Перевод</b> <code>{target_language}</code><b>:</b>
 
                    <pre><code>{translation_text}</code></pre>
                "#},
                hash => hash,
                target_language => target_language.to_string(),
                original_language => original_language.to_string(),
                original_content => encode_minimal(&original_content),
                translation_text => encode_minimal(&translation_text)
            )?;

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

            fix_i18n_handler(bot, msg, dialogue).await?;
        }
        Err(e) => {
            log::error!("Failed to add translation: {}", e);
            bot.send_message(msg.chat.id, format!("❌ Ошибка при сохранении перевода: {}", e))
                .await?;
        }
    }

    Ok(())
}

pub async fn handle_translation_input(
    bot: Bot,
    msg: Message,
    dialogue: MasterDialogue,
) -> HandlerResult {
    let Some(state) = dialogue.get().await? else {
        return Err("No state found in dialogue".into());
    };
    let AdminStateKind::WaitingForTranslation { hash, target_language, original_content, original_language } = state.admin_kind else {
        return Err("Expected WaitingForTranslation state".into());
    };

    let Some(text) = msg.text() else {
        bot.send_message(msg.chat.id, "❌ Пожалуйста, отправьте текстовое сообщение с переводом.")
            .await?;
        return Ok(());
    };

    let translation_text = text.to_string();
    if translation_text.is_empty() {
        bot.send_message(msg.chat.id, "❌ Перевод не может быть пустым. Попробуйте еще раз.")
            .await?;
        return Ok(());
    }

    log::debug!("Original content: {}", original_content);
    log::debug!("Translation text: {}", translation_text);

    let confirmation_message = strfmt!(indoc! {r#"
            🔍 <b>Подтверждение перевода:</b>
 
            <b>ID:</b> <code>{hash}</code>
            <b>Язык:</b> {target_language}
            <b>Оригинал</b> <code>{original_language}</code><b>:</b>
 
            <pre><code>{original_content}</code></pre>
            <b>Перевод</b> <code>{target_language}</code><b>:</b>
 
            <pre><code>{translation_text}</code></pre>
            
            ❓ <b>Подтвердите сохранение перевода?</b>
        "#},
        hash => hash.clone(),
        target_language => target_language.to_string(),
        original_language => original_language.to_string(),
        original_content => encode_minimal(&original_content),
        translation_text => encode_minimal(&translation_text)
    )?;

    let keyboard = make_inline_keyboard(
        vec![
            ("✅ Подтвердить", AdminCallback::ConfirmTranslation).into(),
            ("❌ Отменить", AdminCallback::CancelTranslation).into(),
        ],
        2,
    );

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

    dialogue.update_admin_kind(AdminStateKind::ConfirmTranslation {
        hash,
        target_language,
        original_content,
        original_language,
        translation_text,
    }).await?;

    Ok(())
}