from os.path import join

from colorama import Fore

from common import exit_message, print_message
from common.file_helpers import get_files_by_extension, load_properties
from common.getopt_helper import GetOptBuilder, Param


class TranslationsValidatorBackend(GetOptBuilder):
    _translations_path = ""
    _translations_files = None

    def __init__(self, argv):
        builder = super()
        builder.__init__(argv)

        _param_translations_path = Param(
            "translations_path",
            default_value="java/impl/src/main/resources/translation",
        )

        builder.add_params([_param_translations_path])
        print_message("Carregando parâmetros para inicialização da análise")

        builder.build()

        print_message("Iniciando validação de chaves de traduções declaradas")

        self._translations_path = _param_translations_path.get_param_value()
        self._translations_files = get_files_by_extension(
            self._translations_path, ".properties"
        )
        if len(self._translations_files) == 0:
            raise ValueError(
                f"Nenhum arquivo de tradução foi encontrado em: {self._translations_path}"
            )

        print_message(
            f"Lista de arquivo de traduções localizada:{self._translations_path}"
        )

    def _load_all_translations_keys(self):
        _all_translations_keys = set()
        for _file in self._translations_files:
            _absolute_path = join(self._translations_path, _file)
            _data = load_properties(_absolute_path)
            _all_translations_keys.update(_data)

        print_message("Todas as chaves de tradução foram carregadas...")
        return _all_translations_keys

    def _check_translations_keys(self, all_translations_keys):
        print_message(
            "Iniciando verificação de declaração de chave nos arquivos de tradução"
        )

        is_contain_violations = False

        for _file in self._translations_files:
            _absolute_path = join(self._translations_path, _file)
            print_message(
                f"Verificando chaves de tradução declaradas em:{_absolute_path}"
            )
            _data = load_properties(_absolute_path)
            for _key in all_translations_keys:
                if not _data.get(_key):
                    print_message(
                        f"Chave: {_key} não declarada no arquivo de tradução:{_file}",
                        fore_color=Fore.RED,
                    )
                    is_contain_violations = True

        if is_contain_violations:
            exit_message(
                "Validação dos arquivos de traduções falhou, por favor cheque as mensagens acima para mais detalhes."
            )

    def execute(self):
        _translations_keys = self._load_all_translations_keys()
        self._check_translations_keys(_translations_keys)
