#!/usr/bin/python
# -*- coding: utf-8 -*-

# --------------------------------------------------------------------------- #
#                                                                             #
#    Plugin for Isida-NG XMPP Bot for Python 3.7+                             #
#    Copyright (C) Luciferus <luciferus@ubunix.pro>                           #
#                                                                             #
#    This program is free software: you can redistribute it and/or modify     #
#    it under the terms of the GNU General Public License as published by     #
#    the Free Software Foundation, either version 3 of the License, or        #
#    (at your option) any later version.                                      #
#                                                                             #
#    This program is distributed in the hope that it will be useful,          #
#    but WITHOUT ANY WARRANTY; without even the implied warranty of           #
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
#    GNU General Public License for more details.                             #
#                                                                             #
#    You should have received a copy of the GNU General Public License        #
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.    #
#                                                                             #
# --------------------------------------------------------------------------- #

import subprocess
import os

# Транслит языков (чтобы можно было писать русскими буквами)
LANGUAGE_ALIASES = {
    'русский': 'ru',
    'английский': 'en',
    'немецкий': 'de',
    'французский': 'fr',
    'испанский': 'es',
    'итальянский': 'it',
    'португальский': 'pt',
    'голландский': 'nl',
    'польский': 'pl',
    'украинский': 'uk',
    'белорусский': 'be',
    'болгарский': 'bg',
    'чешский': 'cs',
    'датский': 'da',
    'греческий': 'el',
    'эстонский': 'et',
    'финский': 'fi',
    'венгерский': 'hu',
    'индонезийский': 'id',
    'японский': 'ja',
    'корейский': 'ko',
    'литовский': 'lt',
    'латышский': 'lv',
    'норвежский': 'no',
    'румынский': 'ro',
    'словацкий': 'sk',
    'словенский': 'sl',
    'шведский': 'sv',
    'турецкий': 'tr',
    'вьетнамский': 'vi',
    'китайский': 'zh',
    'арабский': 'ar',
    'иврит': 'he',
    'хинди': 'hi',
    'тайский': 'th',
}

def get_lang_code(lang):
    """Преобразует язык в код"""
    lang = lang.lower().strip()
    if lang in LANGUAGE_ALIASES:
        return LANGUAGE_ALIASES[lang]
    return lang

def tr(type, jid, nick, text):
    """
    Команда перевода
    Форматы:
    - tr list - список языков
    - tr ru en привет - перевод
    - tr ru привет - перевод на русский
    - tr привет - автоопределение на русский
    """
    try:
        text = text.strip()

        if not text:
            send_msg(type, jid, nick, L('Usage: tr [from] to text\nExample: tr ru en Hello', '%s/%s' % (jid, nick)))
            return

        # Список языков
        if text.lower() == 'list':
            langs = []
            for code, name in sorted(LANGUAGE_ALIASES.items()):
                langs.append('%s - %s' % (name, code))
            msg = L('Available languages:', '%s/%s' % (jid, nick)) + '\n' + ', '.join(langs)
            send_msg(type, jid, nick, msg)
            return

        # Разбираем команду
        parts = text.split(' ', 2)

        # Определяем параметры перевода
        from_lang = 'auto'
        to_lang = 'ru'
        text_to_translate = text

        if len(parts) == 1:
            # tr текст
            from_lang = 'auto'
            to_lang = 'ru'
            text_to_translate = parts[0]

        elif len(parts) == 2:
            # tr ru текст или tr en текст
            first = get_lang_code(parts[0])
            # Проверяем, является ли первый параметр языком (2 буквы)
            if len(first) == 2 and first.isalpha():
                from_lang = first
                to_lang = 'ru'
                text_to_translate = parts[1]
            else:
                # tr текст - автоопределение
                from_lang = 'auto'
                to_lang = 'ru'
                text_to_translate = text

        elif len(parts) == 3:
            # tr ru en текст
            from_lang = get_lang_code(parts[0])
            to_lang = get_lang_code(parts[1])
            text_to_translate = parts[2]

            # Проверяем, что оба языка корректны (2 буквы)
            if len(from_lang) != 2 or len(to_lang) != 2:
                send_msg(type, jid, nick, L('Invalid language codes. Use "tr list" to see available languages.', '%s/%s' % (jid, nick)))
                return

        # Выполняем перевод через trans
        try:
            cmd = ['/usr/bin/trans', '-b', '-s', from_lang, '-t', to_lang, text_to_translate]
            result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)

            if result.returncode == 0 and result.stdout:
                translated = result.stdout.strip()
                # Если перевод пустой - пробуем еще раз
                if not translated:
                    send_msg(type, jid, nick, L('Translation returned empty result.', '%s/%s' % (jid, nick)))
                    return

                # Формируем сообщение
                if from_lang == 'auto':
                    msg = translated
                else:
                    # Показываем языки
                    from_name = LANGUAGE_ALIASES.get(from_lang, from_lang)
                    to_name = LANGUAGE_ALIASES.get(to_lang, to_lang)
                    msg = '%s (%s → %s)' % (translated, from_name, to_name)

                send_msg(type, jid, nick, msg)
            else:
                send_msg(type, jid, nick, L('Translation failed. Check your text and try again.', '%s/%s' % (jid, nick)))

        except subprocess.TimeoutExpired:
            send_msg(type, jid, nick, L('Translation timeout.', '%s/%s' % (jid, nick)))
        except FileNotFoundError:
            send_msg(type, jid, nick, L('translate-shell not found. Install: apt-get install translate-shell', '%s/%s' % (jid, nick)))
        except Exception as e:
            send_msg(type, jid, nick, L('Translation error: %s', '%s/%s' % (jid, nick)) % str(e))

    except Exception as e:
        send_msg(type, jid, nick, L('Something broken.', '%s/%s' % (jid, nick)))

def transhell(type, jid, nick, text):
    """Полное имя команды"""
    tr(type, jid, nick, text)

global execute

execute = [
    (3, 'tr', tr, 2, 'Translate text using translate-shell\nUsage:\ntr list - languages\ntr ru en Hello - translate'),
    (3, 'transhell', transhell, 2, 'Translate text using translate-shell\nUsage:\ntranshell list - languages\ntranshell ru en Hello - translate'),
]
