"""
XDI18n - Простая и удобная библиотека для локализации Python-программ
"""

from typing import Dict, List, Optional, Callable
import json
import os


class XDI18n:
    """
    Основной класс для управления локализацией
    """

    def __init__(self, default_lang: str = "en_us", locales_dir: str = None):
        """
        Инициализация системы локализации

        Args:
            default_lang: язык по умолчанию (например, "en_us")
            locales_dir: путь к папке с файлами локализаций
        """
        self.default_lang = default_lang
        self.current_lang = default_lang
        self.locales = {}
        self.available_langs = {}

        # Загрузка локализаций из папки, если указана
        if locales_dir and os.path.exists(locales_dir):
            self.load_from_directory(locales_dir)

    def add_locale(self, lang_code: str, lang_name: str, translations: Dict[str, str]):
        """
        Добавление локализации вручную

        Args:
            lang_code: код языка (например, "ru_ru")
            lang_name: человеко-читаемое название языка
            translations: словарь с переводами
        """
        self.available_langs[lang_code] = lang_name
        self.locales[lang_code] = translations

    def load_from_directory(self, locales_dir: str):
        """
        Загрузка локализаций из файлов в указанной директории

        Args:
            locales_dir: путь к папке с JSON-файлами локализаций
        """
        for filename in os.listdir(locales_dir):
            if filename.endswith('.json'):
                lang_code = filename[:-5]  # Убираем .json
                filepath = os.path.join(locales_dir, filename)

                try:
                    with open(filepath, 'r', encoding='utf-8') as f:
                        data = json.load(f)

                    lang_name = data.get('lang_name', lang_code)
                    translations = data.get('translations', {})

                    self.add_locale(lang_code, lang_name, translations)
                    print(f"Загружен язык: {lang_name} ({lang_code})")

                except Exception as e:
                    print(f"Ошибка загрузки {filename}: {e}")

    def set_language(self, lang_code: str):
        """
        Установка текущего языка

        Args:
            lang_code: код языка для установки
        """
        if lang_code in self.locales:
            self.current_lang = lang_code
        else:
            print(f"Предупреждение: язык '{lang_code}' не найден, используется '{self.default_lang}'")
            self.current_lang = self.default_lang

    def t(self, key: str, **kwargs) -> str:
        """
        Получение перевода по ключу с подстановкой параметров

        Args:
            key: ключ перевода
            **kwargs: параметры для подстановки в строку

        Returns:
            Переведенная строка
        """
        # Пытаемся найти перевод в текущем языке
        translation = self.locales.get(self.current_lang, {}).get(key)

        # Если не нашли, пробуем язык по умолчанию
        if translation is None:
            translation = self.locales.get(self.default_lang, {}).get(key, key)

        # Подстановка параметров
        try:
            return eval(f"f'''{translation}'''", {}, kwargs)
        except Exception as e:
            return f"[подстановка ошибка: {e}] → {translation}"

    def get_available_languages(self) -> List[str]:
        """
        Получение списка доступных языков в формате для выбора

        Returns:
            Список строк в формате "код - название"
        """
        return [f"{code} - {name}" for code, name in self.available_langs.items()]

    def interactive_language_select(self, prompt: str = "Выберите язык"):
        """
        Интерактивный выбор языка (требует xdtui)

        Args:
            prompt: приглашение для выбора
        """
        try:
            from libs.xdtui.xdtui import tui_select
            lang_list = self.get_available_languages()
            _, index = tui_select(prompt, lang_list)
            selected_code = list(self.available_langs.keys())[index]
            self.set_language(selected_code)
            return selected_code
        except ImportError:
            print("Библиотека xdtui не найдена, используйте set_language()")
            return None
        except Exception as e:
            print(f"Ошибка выбора языка: {e}")
            return None


# Создание глобального экземпляра для удобства
_i18n_instance = XDI18n()


def init_i18n(default_lang: str = "en_us", locales_dir: str = None):
    """Инициализация глобальной системы локализации"""
    global _i18n_instance
    _i18n_instance = XDI18n(default_lang, locales_dir)


def t(key: str, **kwargs) -> str:
    """Глобальная функция для получения перевода"""
    return _i18n_instance.t(key, **kwargs)


def set_language(lang_code: str):
    """Установка глобального языка"""
    _i18n_instance.set_language(lang_code)


def interactive_select():
    """Интерактивный выбор глобального языка"""
    return _i18n_instance.interactive_language_select()