from __future__ import unicode_literals
# -*- coding: utf-8 -*-
##from __future__ import division
##import os

def attributOrdreJeu():
    """renvoie l'attribut utilise pour definir l'ordre de jeu, None s'il n'existe pas"""
    return "init"

def sensTriOrdreJeu():
    """renvoie le type de tri pour l'ordre de jeu: 0 = croissant / 1 = decroissant"""
    return 1



def ordreAttributs():
    """renvoie la liste des attributs avec leur position relative (pour l'affichage en combat)"""
    lst = ["init", "PV", "TotalPV", "CA", "BBA", "Ref", "Vig", "Vol", "F", "D", "C", "I", "S", "Ch", "B_init"]
    return lst     

def ordreAttributsFichePerso():
    """renvoie la liste des attributs avec leur position relative
        (pour l'affichage sur la fiche de perso)
        les chaines vides corresponsent a des espacements"""
    lst = ["Classe", "Niv", "Exp", "", \
           "TotalPV", "CA", "BBA", "B_init", "", \
           "F", "D", "C", "I", "S", "Ch", "", \
           "Ref", "Vig", "Vol"]
    return lst  

def listeAttributs():
    """renvoie un dictionnaire vide des attributs d'une creature ou joueur"""
    dico = {}
    ctrl = listeControle()
    for attr in ctrl:
        dico[attr] = ctrl[attr].defaut
    return dico

def listeControle():
    """retourne la liste de controle des attributs de la creature ou joueur"""
    dico = {\
           "F": Attribut("Force", "F", "entier", 0, None, 10, True, False, False), \
           "D": Attribut("Dexterité", "D", "entier", 0, None, 10, True, False, False), \
           "C": Attribut("Constitution", "C", "entier", 0, None, 10, True, False, False), \
           "I": Attribut("Intelligence", "I", "entier", 0, None, 10, True, False, False), \
           "S": Attribut("Sagesse", "S", "entier", 0, None, 10, True, False, False), \
           "Ch": Attribut("Charisme", "Ch", "entier", 0, None, 10, True, False, False), \
           "Ref": Attribut("Réflexes", "Ref", "entier", None, None, 0, True, False, False), \
           "Vig": Attribut("Vigueur", "Vig", "entier", None, None, 0, True, False, False), \
           "Vol": Attribut("Volonté", "Vol", "entier", None, None, 0, True, False, False), \
           "TotalPV": Attribut("Points de vie\ntotaux", "TotalPV", "entier", None, None, 0, True, False, False), \
           "PV": Attribut("Points de vie", "PV", "entier", None, None, 0, True, True, False), \
           "CA": Attribut("Capacité d'armure", "CA", "entier", 0, None, 10, True, False, False), \
           "BBA": Attribut("Bonus de base\nà l'attaque", "BBA", "entier", 0, None, 0, True, False, False), \
           "B_init": Attribut("Bonus d'initiative", "B_init", "entier", None, None, 0, True, False, False), \
           "init": Attribut("Initiative", "B_init", "entier", None, None, 10, True, True, False), \
           "Classe": Attribut("Classe", "Classe", "texte", None, None, "", False, False, False), \
           "Niv": Attribut("Niveau", "Niv", "entier", 0, None, 0, True, False, False), \
           "Exp": Attribut("Expérience", "Exp", "entier", 0, None, 0, False, False, True)
           }
    return dico 

def attribut(nomCourt):
    """renvoie l'attribut demande"""
    dico = listeControle()
    if nomCourt in dico:
        retour = dico[nomCourt]
    else:
        retour = None
    return retour    

def ordreAttributsAttaques():
    """renvoie la liste des attributs avec leur position relative"""
    lst = ["BA", "Dgts", "Crit.", "DD", "svg"]
    return lst     

def listeAttributsAttaques():
    """renvoie un dictionnaire vide des attributs d'une creature ou joueur"""
    dico = {}
    ctrl = listeControleAttaques()
    for attr in ctrl:
        dico[attr] = ctrl[attr].defaut
    return dico

def listeControleAttaques():
    """retourne la liste caracteristiques des attaques de la creature / joueur"""
    dico = {\
           "BA": Attribut("Bonus d'attaque", "BA", "entier", None, None, 0, True, False, False), \
           "Dgts": Attribut("Degats", "Dgts", "texte", None, None, "", True, False, False), \
           "Crit.": Attribut("Critique", "Crit.", "texte", None, None, "20/x2", True, False, False), \
           "DD": Attribut("DD", "DD", "entier", None, None, 10, True, False, False), \
           "svg": Attribut("Type de sauvegarde", "svg", "texte", None, None, "", True, False, False), \
           }
    return dico 

def attributAttaque(nomCourt):
    """renvoie l'attribut d'attaque demande"""
    dico = listeControleAttaques()
    if nomCourt in dico:
        retour = dico[nomCourt]
    else:
        retour = None
    return retour    

class Attribut():
    """attribut des pions et personnages"""
    def __init__(self, nom, nomCourt, typ, mini, maxi, defaut, afficherCombat, combatSeulement, joueursSeulement):
        """initialisation de l'attribut"""
        self.nom = nom
        self.nomCourt = nomCourt
        self.typ = typ
        self.mini = mini   #tests sur les valeurs pour les nombres, sur les longueurs pour les textes
        self.maxi = maxi
        self.defaut = defaut
        self.afficherCombat = afficherCombat   #afficher dans les tables de combat
        self.combatSeulement = combatSeulement   #afficher dans les tables de combat seulement      
        self.joueursSeulement = joueursSeulement     #n'afficher que chez les joueurs

        self.valeur = defaut

    def controler(self, val):
        """renvoie la la valeur entrée si celle ci est valide pour cet attribut, None sinon"""
        if self.typ == "entier":
            try:
                retour = long(val)
            except:
                retour = None
            if retour != None:
                if self.mini != None:
                    if not retour >= self.mini:
                        retour = None
                if self.maxi != None:
                    if not retour <= self.maxi:
                        retour = None
        elif self.typ == "booleen":
            try:
                retour = bool(val)
            except:
                retour = None
        else:
            try:
                retour = str(val)
            except:
                retour = None
                
            if retour != None:
                if self.mini != None:
                    if not len(retour) >= self.mini:
                        retour = None
                if self.maxi != None:
                    if not len(retour) <= self.maxi:
                        retour = None                
        return retour


#### autres donnees liees aux regles
def valeurDefaut(nom):
    """renvoie la valeur par defaut demandee"""
    retour = None
    dico = {"depMarche": 9, "depNage": 6, "depEscalade": 3, "depVol": 0, "saut": 6}
    if nom in dico:
        retour = dico[nom]
    return retour

def nomMonnaie():
    """retourne la monnaie par defaut utilisee dans le jeu"""
    return "po"



if __name__ == "__main__":
     val = "3"
     dico = listeControleAttaques()
     print(dico["svg"].controler(val))

















            
