# inc/infos.py

import cfg
import inc.chaines as chaines
from threading import Thread

LOC_LG_FRANCAIS "francais"    # doit être égal au LG_FRANCAIS de cfg.py

# init_module():
# dossier de travail, ... """
# peut-être à déplacer plus haut, carrément dans jukebox.py
import subprocess
cmd "[ -d /m/music/pico2wave ] || mkdir /m/music/pico2wave"
ps subprocess.Popen(cmdshell=Truestdout=subprocess.PIPEstderr=subprocess.STDOUT)


def change_lang():
    """ change la langue globalement """
    arr_msg = [ """1 francais, 2 anglais, 3 allemand, 0 annuler"]
    pdrNew(arr_msg)
    new_language input("")
    langages = {
        "1""fr-FR",
        "2""en-GB",
        "3""de-DE"
    }
    # voir aussi Python switch case - JournalDev, https://www.journaldev.com/15642/python-switch-case
    if new_language in langages.keys():
        ini_set("py_pico_lang"langages.get(new_language))


def color_text(s):
    """ colorer/surligner du texte en fonction du module en cours """
    couleurs = {
        "juk""31",
        "aba""32""abk""33""abw""34",
        "rad""35""rec""36""zik""37"
    }
    curr_mod ini_get("py_current_module")
    if curr_mod in couleurs.keys():
        code_couleur couleurs.get(curr_mod)
        return '\x1b[0;' code_couleur ';40m' '\x1b[0m'
    else:
        return s


def color_text_table():
    """ prints table of formatted text format options """
    # https://stackoverflow.com/questions/287871/how-to-print-colored-text-in-terminal-in-python
    for style in range(8):
        for fg in range(30,38):
            s1 ''
            for bg in range(40,48):
                format ';'.join([str(style), str(fg), str(bg)])
                s1 += '\x1b[%sm %s \x1b[0m' % (formatformat)
            print(s1)
        print('\n')

##############################################
#                class Dire                  #
##############################################
from threading import Thread
class Dire(Thread):
    """ Thread chargé de prononcer, en arrière-plan,
        les messages les uns après les autres.
        Un message peut être interrompu pendant sa lecture,
        le suivant, s'il existe, doit alors débuter juste après
    """
    # thread à lancer dès le démarrage du module jukebox
    def __init__(self):
        # ~ print("Lancement du thread Dire ...")
        Thread.__init__(self)
        # TODO
        # contrôler que le dossier est bien présent pour lancer le thread

    def run(self):
        """Code à exécuter pendant l'exécution du thread."""
        import inc.mpc as mpc
        import mod.commun as commun
        import inc.infos as infos
        while True:
            # rechercher les fichiers à prononcer toutes les secondes
            commun.faire_pause(1)
            cmd "ls -1 {}/*txt 2> /dev/null".format(cfg.DIRE_FILE_ATTENTE)
            str_liste_textes mpc.sub_proc(cmd)

            # si fichiers à prononcer présents
            if len(str_liste_textes) > 10:
                list_prononcer str_liste_textes.split("\n")
                n_prononcer 0
                # afficher tous les .txt présents
                for nom_fichier in list_prononcer:
                    n_prononcer += 1
                    masque "DEBUG prononcer en attente, {} sur {} {}"
                    msg masque.format(n_prononcerlen(list_prononcer), nom_fichier)
                    log(msg)

                # prononcer seulement le premier fichier de list_prononcer
                fichier_prononcer list_prononcer[0]
                with open(fichier_prononcer"r"as fp:
                    texte fp.read().strip()
                wav cfg.WAV_WAV

                # inscrire dans le fichier qch comme :
                # de-DE|sagen sie etwas hier bitte
                # fr-FR|les chaussettes de l'archiduchesse sont-elles  sèches, oui archi sèches
                # ...
                langue_texte texte.split("|")
                if len(langue_texte) == 2:
                    langue_langue langue_texte[0]
                    texte langue_texte[1]
                else:
                    langue_langue cfg.LG_FRANCAIS

                langue_pico "fr-FR"   # par défaut
                if langue_langue == cfg.LG_FRANCAIS:
                    langue_pico "fr-FR"
                elif langue_langue == cfg.LG_ANGLAIS:
                    langue_pico "en-GB"
                elif langue_langue == cfg.LG_ALLEMAND:
                    langue_pico "de-DE"

                # créer fichier wave tts
                # langue_pico et texte ne doivent pas être entourés de guillemets
                cmd 'pico2wave -l ' langue_pico ' -w ' wav ' "' texte '"'
                log(cmd)
                mpc.sub_proc(cmd)

                # jouer wav
                if mpc.is_playing():
                    mpc.pause()
                    cmd "aplay -q " wav
                    log(cmd)
                    mpc.sub_proc(cmd)
                    mpc.toggle()
                else:
                    cmd "aplay -q " wav
                    log(cmd)
                    mpc.sub_proc(cmd)

                # supprimer fichier texte
                cmd "rm " fichier_prononcer
                log(cmd)
                mpc.sub_proc(cmd)


            # on quitte le thread
            if file_exists("/m/quitter_dire"):
                infos.m_g("*** fin thread Dire")
                cmd "rm {}/*txt".format(cfg.DIRE_FILE_ATTENTE)
                mpc.sub_proc(cmd)
                cmd "rm /m/quitter_dire"
                mpc.sub_proc(cmd)
                break


DEV_lancer_thread True
if DEV_lancer_thread == True:
    thread_dire Dire()
    # Lancement des threads
    thread_dire.start()


def dis_sh(textepauses Nonelangue LOC_LG_FRANCAIS):
    """ crée un nouveau fichier à prononcer pour Dire
        dans le dossier cfg.DIRE_FILE_ATTENTE
        le fichier devra arriver en dernière position
        d'une commande ls -1 .../*txt | sort
        solution : utiliser un horodatage
    """
    # test avec multithreading pour pouvoir interrompre dès qu'une touche est tapée
    from datetime import datetime
    now datetime.now()
    date_fichier now.strftime("%H%M%S.%f")  # 121940.948000
    fichier cfg.DIRE_FILE_ATTENTE "/" date_fichier ".txt"
    log("dis_sh crée le fichier " fichier)
    with open(fichier"w"as fp:
        fp.write(langue '|' texte)


def file_exists(fichier):
    """ teste existence d'un fichier/dossier """
    from os import path
    return path.isfile(fichier)


def heure_actu():
    """ renvoie heure au format HH:MM:SS """
    # https://stackoverflow.com/questions/415511/how-to-get-the-current-time-in-python
    from time import localtimestrftime
    # return strftime("%Y-%m-%d %H:%M:%S", localtime())
    return strftime("%H:%M:%S"localtime())


def ini_file_get(ini_filevar_inidefault):
    """ retourne la valeur de var_ini dans le fichier ini_file
        les lignes de données sont du type :
        variable=valeur
    """
    if file_exists(ini_file) == False:
        return default

    with open(ini_file"r"as fileIni:
        les_lignes fileIni.readlines()
    for ligne in les_lignes:
        if ligne.startswith(var_ini "="):
            valeur ligne.split("=")[1].strip()
            if valeur != "":
                return valeur
    return default


def ini_get(var_inidefault None):
    """ renvoie la valeur de var_ini dans cfg.CONFIG_INI """
    rrr ini_file_get(cfg.CONFIG_INIvar_inidefault)
    # ~ print("rrr {} = {}".format(var_ini, rrr))
    return rrr


def ini_file_set(ini_filevar_inivaleur):
    """ enregistre la valeur de la variable donnée
        dans ini_file
        met à jour une variable existante,
        ou crée la ligne pour cette variable
        les lignes sont du type :
        variable=valeur
        ex :
        biblio_actuelle=cle_usb
    """
    if file_exists(ini_file) == True:
        var_ini_found False
        # stocker toutes les lignes dans les_lignes[]
        with open(ini_file"r"as fileIni:
            les_lignes fileIni.readlines()
        new_lignes = []
        for ligne in les_lignes:
            if ligne.startswith(var_ini "="):
                var_ini_found True
                new_lignes.append(var_ini "=" str(valeur))
            else:
                new_lignes.append(ligne)
        if not var_ini_found:
            new_lignes.append(var_ini "=" str(valeur))

        # tout réenregistrer dans le fichier ini
        # (même si valeur inchangée)
        with open(ini_file"w"as fileIni:
            for ligne in new_lignes:
                if ligne.endswith("\n"):
                    fileIni.write(ligne)
                else:
                    fileIni.write(ligne "\n")
    else:
        with open(ini_file"w"as fileIni:
            fileIni.write(str(var_ini) + "=" str(valeur))


def ini_set(var_inivaleur):
    """ enregistre la valeur de la variable donnée
        dans cfg.CONFIG_INI """
    ini_file_set(cfg.CONFIG_INIvar_inivaleur)


def jour_heure_actu():
    """ date/heure du type 2020-01-22 12:37:55 """
    from time import localtimestrftime
    return strftime("%Y-%m-%d %H:%M:%S"localtime())


def m_g(ligne):
    """ affiche des informations pour voyants et développeur """
    # ex :
    # 11:45:15 [rad] (voc2) rad_infos_go (), vous écoutez France Inter
    # 15:05:02 [juk] (voc0) Raspberry Pi 3 Model B Rev 1.2, 948M, gpu=76M
    module_couleur ini_get("py_current_module""juk")
    module_couleur color_text(module_couleur)
    print("{} [{}{}] {}".format(heure_actu(), module_couleurniveau_aide_voc(), ligne))


def g_m(ligne):
    """ affiche des informations pour voyants et développeur, mode debug """
    # ex :
    # 11:45:15 [rad] (voc2) rad_infos_go (), vous écoutez France Inter
    # 15:05:02 [juk] (voc0) Raspberry Pi 3 Model B Rev 1.2, 948M, gpu=76M
    module_couleur ini_get("py_current_module""juk")
    module_couleur color_text(module_couleur)
    # ~ print("{} [{}] (voc{}) {}".format(heure_actu(), module_couleur, niveau_aide_voc(), ligne))


def log(text):
    """ journaliser les actions dans fichiers log
    """
    pass


def niveau_aide_voc():
    """ renvoie niveau aide sonore """
    return int(ini_get("py_niv_aide_voc"cfg.NIV_AIDE_VOC_DEFAULT))


def pdrNew(txtlangue LOC_LG_FRANCAIS):
    """ prononce le texte en fonction du niveau d'aide actuel
        txt contient le texte des 4 niveaux
        S'il n'y a que deux éléments,
        on prononce le premier texte pour les niveaux 0 et 1,
        on prononce le second pour les niveaux 2 et 3

        txt : string, ou list de string à 2 ou 4 éléments,
    """
    # devra remplacer les fonctions pdr_...
    if isinstance(txtstr):
        arr_new = [ txttxttxttxt ]
    elif isinstance(txtlist):
        if len(txt) == 2:
            arr_new = [ txt[0], txt[0], txt[1], txt[1] ]
        else:
            arr_new list(txt)
    un_texte arr_new[niveau_aide_voc()]
    if un_texte == "":
        m_g("(muet) " arr_new[1]) # on suppose que arr_new[1] est non vide
    else:
        pdr_always(un_textelangue)


def pdr_always(textelangue LOC_LG_FRANCAIS):
    """ toujours prononcer le texte """
    # à remplacer par pdr_0123()
    import inc.mpc
    m_g(texte)
    if inc.mpc.is_playing():
        dis_sh(texte"pauses"langue)
    else:
        dis_sh(texte""langue)