// Use this for initialization

    public static Dictionary <string, AssessementAction> getActionsFromNode(JSONNode node)
    {
        if (node != null)
        {
            Dictionary <string, AssessementAction> AsAction = new Dictionary <string, AssessementAction> ();
            foreach (JSONNode x in node["Actions"].AsArray)
            {
                AssessementAction aa = new AssessementAction();
                aa.label      = x ["Label"];
                aa.address    = x ["Address"];
                aa.indicators = Indicator.getIndicatorsFromNode(x);
                aa.bloquant   = x ["Bloquant"];
                AsAction.Add(aa.address, aa);
            }
            return(AsAction);
        }
        else
        {
            return(null);
        }
    }
 //debut du parsing du json node
 public void getActions()
 {
     //si le fichier est chargé
     if (fileLoaded)
     {
         //si les action ne sont pas chargées
         if (!actionsLoaded)
         {
             actions       = AssessementAction.getActionsFromNode(node);
             actionsLoaded = true;
         }
     }
     else
     {
         loadJSON();
         if (!actionsLoaded)
         {
             actions       = AssessementAction.getActionsFromNode(node);
             actionsLoaded = true;
         }
     }
 }
    //call Assessement utilisé par les colliders pour calculer les nouveau valeurs des indicateur à partir du base des actions
    //string address : id unique d'une action
    //string cause : cause de changement du valeur de l'indicateur
    public void callAssessement(string address, string cause)
    {
        //si les action ne sont pas chargées on les charge au debut
        if (!actionsLoaded)
        {
            getActions();
        }
        AssessementAction aa = new AssessementAction();

        //recupération de l'action à partir du dictionnaire avec le param Address passer par le collider
        actions.TryGetValue(address, out aa);
        //Debug.Log ("getting action "+address+" label : "+aa.label);

        //parcour des indicateur pour trouver la situation -> consequence convenant
        foreach (Indicator idctr in aa.indicators)
        {
            //matches sere à identifier si les valeur en cours sont présent à une des situation d'une action
            bool matches = true;
            //Debug.Log ("checking facts");

            //parcours des fact (situation initial)
            foreach (Fact fct in idctr.facts)
            {
                //Debug.Log ("Fact Value : "+fct.value+" ::::: Current Value : "+Indicators.GetComponent<IndicateursMainHCL> ().getIndicatorValue (fct.label));

                /* format d'un fact "Label":"un label"
                 *                  "Value":"100" c'est une egalité : le valeur en cours doit etre egale au fact pour satisfaire la situation
                 *                          ">100" le valeur en cours doit etre Supérieur au fact
                 *                          "<100" le valeur en cours doit etre Inférieur au fact
                 *         si on trouve pas un "Match" dans les situation "Fact" avec les valeur en cours, on passe au situation suivant "Fact",
                 *
                 */
                if (fct.action == Fact.actions.Above)
                {
                    if (fct.value < Indicators.GetComponent <IndicateursMainHCL> ().getIndicatorValue(fct.label))
                    {
                        matches = false;
                        //Debug.Log ("******************** Indicators : No Matche Case Found in DataBase");
                        break;
                    }
                }
                if (fct.action == Fact.actions.Below)
                {
                    if (fct.value > Indicators.GetComponent <IndicateursMainHCL> ().getIndicatorValue(fct.label))
                    {
                        matches = false;
                        //Debug.Log ("******************** Indicators : No Matche Case Found in DataBase");
                        break;
                    }
                }
                if (fct.action == Fact.actions.Equal)
                {
                    if (fct.value != Indicators.GetComponent <IndicateursMainHCL> ().getIndicatorValue(fct.label))
                    {
                        matches = false;
                        //Debug.Log ("******************** Indicators : No Matche Case Found in DataBase");
                        break;
                    }
                }
            }

            /* si "Maches", alors on a trouvez un situation egal aux valeur en cours
             *      on applique les consequence
             *            Value:100 : remplacé
             *            Value:+100 Incrementation d'indicateur
             *            Value:-100 Decrementation d'indicateur
             *
             *
             *
             */
            if (matches)
            {
                //Debug.Log ("checking consequences");
                foreach (Consequence csqce in idctr.consequences)
                {
                    if (csqce.action == Consequence.actions.Replace)
                    {
                        float value = csqce.value;
                        Indicators.GetComponent <IndicateursMainHCL> ().setIndicator(csqce.label, value, cause);
                        //Debug.Log ("Setting "+csqce.label+" To "+value+" (Was : "+Indicators.GetComponent<IndicateursMainHCL> ().getIndicatorValue (csqce.label)+")");
                    }
                    if (csqce.action == Consequence.actions.Increment)
                    {
                        float value = Indicators.GetComponent <IndicateursMainHCL> ().getIndicatorValue(csqce.label) + csqce.value;
                        if (value > 1)
                        {
                            value = 1;
                        }
                        Indicators.GetComponent <IndicateursMainHCL> ().setIndicator(csqce.label, value, cause);
                        //Debug.Log ("Setting "+csqce.label+" To "+value+" (Was : "+Indicators.GetComponent<IndicateursMainHCL> ().getIndicatorValue (csqce.label)+")");
                    }
                    if (csqce.action == Consequence.actions.Decrement)
                    {
                        float value = Indicators.GetComponent <IndicateursMainHCL> ().getIndicatorValue(csqce.label) - csqce.value;
                        if (value < 0)
                        {
                            value = 0;
                        }
                        Indicators.GetComponent <IndicateursMainHCL> ().setIndicator(csqce.label, value, cause);
                        //Debug.Log ("Setting "+csqce.label+" To "+value+" (Was : "+Indicators.GetComponent<IndicateursMainHCL> ().getIndicatorValue (csqce.label)+")");
                    }
                }
                break;
            }
        }
    }