import telebot
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton
from deep_translator import GoogleTranslator
from langdetect import detect
import re


# Константы для языков и их эмодзи
LANGUAGES = {
    'en': 'Английский 🇬🇧',
    'ru': 'Русский 🇷🇺',
    'es': 'Испанский 🇪🇸',
    'fr': 'Французский 🇫🇷',
    'de': 'Немецкий 🇩🇪'
}

def translate_text(text, target_language):
    source_language = detect(text)
    translator = GoogleTranslator(source=source_language, target=target_language)
    return translator.translate(text), source_language

def create_language_selection_markup():
    markup = InlineKeyboardMarkup()
    markup.row_width = 2
    for lang_code, lang_name in LANGUAGES.items():
        markup.add(InlineKeyboardButton(lang_name, callback_data=f"target_{lang_code}"))
    return markup

@bot.message_handler(commands=['переведи'])
def send_welcome(message):
    markup = create_language_selection_markup()
    bot.send_message(message.chat.id, "Выберите язык, на который будет переведён текст.", reply_markup=markup)

@bot.message_handler(func=lambda message: re.search(r'переведи текст', message.text, re.IGNORECASE))
def translate_message(message):
    try:
        # Используем регулярное выражение чтобы подобрать последний "слово как язык" из input
        match = re.search(r'переведи текст\s*(.+)\s+(\w+)$', message.text, re.IGNORECASE)
        if not match:
            bot.reply_to(message, "Пожалуйста, используйте формат:\nпереведи текст <текст> <язык>")
            return

        text_to_translate = match.group(1).strip()
        target_lang_code = match.group(2).strip().lower()

        if target_lang_code not in LANGUAGES:
            bot.reply_to(message, "Указан неверный язык. Пожалуйста, выберите один из предложенных.")
            return

        translated_text, source_lang_code = translate_text(text_to_translate, target_lang_code)
        source_language_name = LANGUAGES.get(source_lang_code, "неизвестный язык")
        bot.reply_to(message, f"Перевод ({source_language_name.split()[0]} -> {LANGUAGES[target_lang_code].split()[0]}):\n{translated_text}")
    except Exception as e:
        bot.reply_to(message, f"Произошла ошибка: {e}")

@bot.callback_query_handler(func=lambda call: call.data.startswith("target_"))
def callback_inline(call):
    if call.message:
        target_lang = call.data.split("_")[1]
        global target_language  # Задаем глобальную переменную для языка перевода
        target_language = target_lang
        bot.answer_callback_query(call.id, f"Язык перевода установлен на {LANGUAGES[target_lang]}")
        bot.send_message(call.message.chat.id, "Пожалуйста, введите текст, который нужно перевести.")

@bot.message_handler(func=lambda message: True)
def handle_text(message):
    try:
        if 'target_language' not in globals():
            bot.reply_to(message, "")
            return
        target_lang_code = target_language
        translated_text, source_lang_code = translate_text(message.text, target_lang_code)
        source_language_name = LANGUAGES.get(source_lang_code, "неизвестный язык")
        bot.reply_to(message, f"Перевод ({source_language_name.split()[0]} -> {LANGUAGES[target_lang_code].split()[0]}):\n{translated_text}")
    except Exception as e:
        bot.reply_to(message, f"Произошла ошибка: {e}")

ПЕРЕВЕДИ ТЕКСТ УБЕРИ ЭТО И СДЕЛАЙ ПЕРЕВЕДИ БЕЗ / И ДОБАВЬ ВАРИЦИИ КОМАНДЫ ПЕРЕВЕДИ ТЕКС,  ПЕРЕВЕДИ СООБЩЕНИЕ И ТД, СООБЩЕНИЕ ПОСЛЕ КОМАНДЫ ДОЛЖНО ИГНОРИРОВАТЬСЯ: НАПРИМЕР ПЕРЕВЕДИ ПРИВЕТ