import json
import os.path
from functools import reduce

from cpl_translation.translation_service_abc import TranslationServiceABC
from cpl_translation.translation_settings import TranslationSettings


class TranslationService(TranslationServiceABC):
    def __init__(self):
        self._translation = {}

        self._language = ""
        self._default_language = ""

        TranslationServiceABC.__init__(self)

    def set_default_lang(self, lang: str):
        if lang not in self._translation:
            raise KeyError()

        self._default_language = lang
        self.set_lang(lang)

    def set_lang(self, lang: str):
        if lang not in self._translation:
            raise KeyError()

        self._language = lang

    def load(self, lang: str):
        if not os.path.exists(f"translation/{lang}.json"):
            raise FileNotFoundError()

        file_dict = {}
        with open(f"translation/{lang}.json", "r", encoding="utf-8") as file:
            file_dict = json.load(file)
            file.close()

        self._translation[lang] = file_dict

    def load_by_settings(self, settings: TranslationSettings):
        if settings is None:
            raise Exception(f"{TranslationSettings.__name__} not loaded")

        self._language = settings.default_language
        self._default_language = settings.default_language

        for lang in settings.languages:
            self.load(lang)

    def translate(self, key: str) -> str:
        value = reduce(
            lambda d, key: d.get(key) if isinstance(d, dict) else None,
            key.split("."),
            self._translation[self._language],
        )

        if value is None:
            raise KeyError(f"Translation {key} not found")

        return value
