"""__main__.py"""

# Standard Library
from pathlib import Path

# Local
from .api import (
    is_file,
    list_input_files,
    pre_process_a_dictionary_file,
    process_a_dictionary_file,
    process_a_phrases_file,
    select_file,
)
from .constants import DICT_TYPE, LANGUAGES, PHRASES_TYPE
from .utility import ProcessFile


def cli_select_files() -> ProcessFile:
    """Loops until it finds a valid input_file"""
    print("Select data file:")
    in_file = None
    level = Path()
    while not in_file:
        files = list_input_files(level)
        for n, file in enumerate(files):
            print(f"{n+1} - {file}")
        s = None
        while not s or not s.isnumeric() or not 1 <= int(s) <= len(files):
            s = input(f"Please select the file [1-{len(files)}]: ")
        selected = files[int(s) - 1]
        if is_file(selected):
            in_file = selected
        else:
            level = selected
    input_file = select_file(in_file)
    return input_file


def cli_select_dictionay_tsv() -> bool:
    """If a dictionary file is selected, ask if the user wants to proccess it"""
    s = None
    while s not in ("y", "yes", "no", "n"):
        s = input("Do you want to Pre-Process a dictionary (y/n): ")
    r = s in ("y", "yes")
    return r


def cli_select_language(languages: list = None) -> str:
    """Selects a language for the trasnlatation"""
    if languages:
        avaliable_languages = {
            lan_id: lan
            for lan_id, lan in LANGUAGES.LanguageNames.items()
            if lan_id in languages
        }
    else:
        avaliable_languages = LANGUAGES.LanguageNames.items()
    if not avaliable_languages:
        raise ValueError("""No languages are avaliable,
        if this is a dictionay file, you must preprocess it first""")
    print("Select a language:")
    for language_id, language in avaliable_languages:
        if languages and language_id in languages:
            print(f"{language_id} - {language}")
    s = None
    while not s or s not in LANGUAGES.AvailableLanguages:
        lan_codes = [lan_id for lan_id, lan in avaliable_languages]
        s = input(f"Please select the language {', '.join(lan_codes)}: ")
    return s


def main():
    """CLI interface for the module"""
    while True:
        input_file = cli_select_files()
        if DICT_TYPE in input_file.input_file.suffixes:
            dict_selected = cli_select_dictionay_tsv()
            if dict_selected:
                language_id = cli_select_language()
                pre_process_a_dictionary_file(input_file, language_id)
            else:
                language_id = cli_select_language(
                    input_file.available_dictionary_languages
                )
                process_a_dictionary_file(input_file, language_id)
        elif PHRASES_TYPE in input_file.input_file.suffixes:
            language_id = cli_select_language()
            print(
                f"processing file {input_file.input_file} with language {language_id}"
            )
            process_a_phrases_file(input_file, language_id)


if __name__ == "__main__":
    main()
