#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# imports
from labpyproject.apps.labpyrinthe.bus.model.core_matrix import LabHelper
# Evite l'ajout non désiré de certains imports à la doc sphinx
__all__ = ["CommandHelper"]
# classe
[docs]class CommandHelper:
    """
    Helper statique fournissant des services d'interprétation, 
    sérialisation/dé-sérialisation des commandes.
    
    .. note::
       Sérialisation/dé-sérialisation trop limitées, passer en XML (V2).
    """
    #-----> Interprétation des commandes
[docs]    def translate_cmd(cls, cmd):
        """
        Traduit la commande saisie par l'utilisateur en actions
        
        Args:
            cmd (str): 1 caractère ou plus 
                        (ex, avec les chars par défauts : "n", "e25", "ps", "mn")
        
        Returns:
            dict: {"action":, **args}
        """
        if isinstance(cmd, str) and len(cmd) > 0:
            firstchar = cmd[0].lower()
            # déplacements
            listchardir = [
                LabHelper.CHAR_TOP,
                LabHelper.CHAR_BOTTOM,
                LabHelper.CHAR_LEFT,
                LabHelper.CHAR_RIGHT,
            ]
            listdir = [LabHelper.TOP, LabHelper.BOTTOM, LabHelper.LEFT, LabHelper.RIGHT]
            if firstchar in listchardir:
                indice = listchardir.index(firstchar)
                direct = listdir[indice]
                action = LabHelper.ACTION_MOVE
                nb_pas = cmd[1:]
                if LabHelper.REGEXP_INT.match(nb_pas) and int(nb_pas) > 0:
                    pas = int(nb_pas)
                else:
                    pas = 1
                return {"action": action, "direct": direct, "pas": pas}
            elif firstchar == LabHelper.CHAR_PORTE:
                secchar = cmd[1:]
                if secchar in listchardir:
                    indice = listchardir.index(secchar)
                    direct = listdir[indice]
                    action = LabHelper.ACTION_CREATE_DOOR
                    return {"action": action, "direct": direct, "pas": None}
            elif firstchar == LabHelper.CHAR_MUR:
                secchar = cmd[1:]
                if secchar in listchardir:
                    indice = listchardir.index(secchar)
                    direct = listdir[indice]
                    action = LabHelper.ACTION_CREATE_WALL
                    return {"action": action, "direct": direct, "pas": None}
            elif firstchar == LabHelper.CHAR_KILL:
                secchar = cmd[1:]
                if secchar in listchardir:
                    indice = listchardir.index(secchar)
                    direct = listdir[indice]
                    action = LabHelper.ACTION_KILL
                    return {"action": action, "direct": direct, "pas": None}
            elif firstchar == LabHelper.CHAR_MINE:
                secchar = cmd[1]
                if secchar in listchardir:
                    indice = listchardir.index(secchar)
                    direct = listdir[indice]
                    action = LabHelper.ACTION_MINE
                    puiss = cmd[2:]
                    if LabHelper.REGEXP_INT.match(puiss) and int(puiss) > 0:
                        puissance = int(puiss)
                    else:
                        puissance = 1
                    return {
                        "action": action,
                        "direct": direct,
                        "pas": None,
                        "puissance": puissance,
                    }
            elif firstchar == LabHelper.CHAR_GRENADE:
                secchar = cmd[1]
                if secchar in listchardir:
                    indice = listchardir.index(secchar)
                    direct = listdir[indice]
                    action = LabHelper.ACTION_GRENADE
                    paramsg = cmd[2:].split("-")
                    nb_pas = paramsg[0]
                    puiss = paramsg[1]
                    if LabHelper.REGEXP_INT.match(nb_pas) and int(nb_pas) > 0:
                        pas = int(nb_pas)
                    else:
                        pas = 1
                    if LabHelper.REGEXP_INT.match(puiss) and int(puiss) > 0:
                        puissance = int(puiss)
                    else:
                        puissance = 1
                    return {
                        "action": action,
                        "direct": direct,
                        "pas": pas,
                        "puissance": puissance,
                    }
            elif firstchar == LabHelper.CHAR_HELP:
                action = LabHelper.ACTION_HELP
                return {"action": action, "direct": None, "pas": None}
            elif firstchar == LabHelper.CHAR_MENU:
                action = LabHelper.ACTION_MENU
                return {"action": action, "direct": None, "pas": None}
            elif firstchar == LabHelper.CHAR_QUIT:
                action = LabHelper.ACTION_QUIT
                return {"action": action, "direct": None, "pas": None}
            elif firstchar == LabHelper.CHAR_START:
                action = LabHelper.ACTION_START
                return {"action": action, "direct": None, "pas": None}
            elif firstchar == LabHelper.CHAR_RESET_QUEUE:
                action = LabHelper.ACTION_RESET_QUEUE
                return {"action": action, "direct": None, "pas": None}
        return {"action": None, "direct": None, "pas": None} 
    translate_cmd = classmethod(translate_cmd)
    #-----> Sérialisation/désérialisation des commandes
    format_game_cmd = classmethod(format_game_cmd)
    format_cmd_sequence = classmethod(format_cmd_sequence)
[docs]    def split_game_cmd(cls, msg):
        """
        Méthode réciproque de format_game_cmd
        
        Args:
            msg (str): chaine conforme à l'expression régulière LabHelper.REGEXP_GAME 
        """
        if msg != None and LabHelper.REGEXP_GAME.match(msg):
            listp = msg.split("&")
            kwargs = dict()
            cmd = None
            for p in listp:
                kv = p.split("=")
                if kv[0] == "gamecmd":
                    cmd = kv[1]
                else:
                    val = kv[1]
                    if len(kv) > 2:
                        val = p[len(kv[0]) + 1 :]
                    kwargs[kv[0]] = cls.split_cmd_sequence(val)
            if "comuid" not in kwargs.keys():
                kwargs["comuid"] = None
            return cmd, kwargs
        return None, None 
    split_game_cmd = classmethod(split_game_cmd)
[docs]    def split_cmd_sequence(cls, chaine):
        """
        Réciproque de _format_cmd_sequence
        """
        if LabHelper.REGEXP_SEQ_LIST.match(chaine):
            chaine = chaine[1 : len(chaine) - 1]
            seq = chaine.split(",")
            return seq
        elif LabHelper.REGEXP_SEQ_TUPLE.match(chaine):
            chaine = chaine[1 : len(chaine) - 1]
            seq = chaine.split(",")
            return seq
        elif LabHelper.REGEXP_SEQ_DICT.match(chaine):
            chaine = chaine[1 : len(chaine) - 1]
            lw = chaine.split(",")
            seq = dict()
            for item in lw:
                k, v = item.split(":")
                seq[k] = v
            return seq
        else:
            return chaine 
    split_cmd_sequence = classmethod(split_cmd_sequence)