// (c) Copyright HutongGames, LLC 2010-2018. All rights reserved.
// 'inclusiveMax' option added by MaDDoX (@brenoazevedo)

using UnityEngine;

namespace HutongGames.PlayMaker.Actions
{
    [ActionCategory(ActionCategory.Math)]
    [Tooltip("Sets an Integer Variable to a random value between Min/Max.")]
    public class RandomInt : FsmStateAction
    {
        [RequiredField]
        [Tooltip("Minimum value for the random number.")]
        public FsmInt min;

        [RequiredField]
        [Tooltip("Maximim value for the random number.")]
        public FsmInt max;

        [RequiredField]
        [UIHint(UIHint.Variable)]
        [Tooltip("Store the result in an Integer variable.")]
        public FsmInt storeResult;

        [Tooltip("Should the Max value be included in the possible results?")]
        public bool inclusiveMax;

        [Tooltip("Don't repeat the same value twice.")]
        public FsmBool noRepeat;

        private int randomIndex;
        private int lastIndex = -1;

        public override void Reset()
        {
            min = 0;
            max = 100;
            storeResult = null;
            // make default false to not break old behavior.
            inclusiveMax = false;
            noRepeat = true;
        }

        public override void OnEnter()
        {
            PickRandom();
            Finish();
        }

        void PickRandom()
        {
			if (noRepeat.Value && max.Value != min.Value && (!inclusiveMax && (Mathf.Abs (max.Value - min.Value) > 1) ))
            {
                do
                {
                    randomIndex = (inclusiveMax) ?
                    Random.Range(min.Value, max.Value + 1) :
                    Random.Range(min.Value, max.Value);
                } while (randomIndex == lastIndex);

                lastIndex = randomIndex;
                storeResult.Value = randomIndex;

            }
            else
            {
                randomIndex = (inclusiveMax) ?
                Random.Range(min.Value, max.Value + 1) :
                Random.Range(min.Value, max.Value);
                storeResult.Value = randomIndex;
            }
        }
    }
}
