﻿using AsmodeeDigital.Common.Plugin.Manager.Random;
using System.Collections.Generic;

namespace AsmodeeDigital.Common.Plugin.Tests.Mocks
{
    /// <summary>
    /// Mock of Random Manager
    /// </summary>
    public class RandomManagerTest : IRandomManager
    {
        private int _seed = -1;
        private System.Random _rnd;

        public List<int> RangeValuesFromStart { get; set; }
        public List<int> RangeValues { get; set; }
        public List<float> FloatValues { get; set; }

        /// <summary>
        /// Get previously defined seed
        /// </summary>
        /// <returns>Seed</returns>
        public int GetSeed()
        {
            return _seed;
        }

        /// <summary>
        /// Set a seed
        /// </summary>
        /// <param name="seed">Seed</param>
        public void SetSeed(int seed)
        {
            _rnd = new System.Random(seed);

            _seed = seed;

            //--- Each time the seed is setted, the list of range values is refreshed (for replayability)
            if(RangeValuesFromStart != null)
                RangeValues = new List<int>(RangeValuesFromStart);
        }

        /// <summary>
        /// Get an int value between min (inclusive) and max (exclusive)
        /// If RangeValues are defined, those values are returned
        /// </summary>
        /// <param name="min">Minimum of returned value (inclusive)</param>
        /// <param name="max">Maximum of returned value (exclusive)</param>
        /// <returns>Int value</returns>
        public int GetValue(int min, int max)
        {
            if (RangeValues != null && RangeValues.Count > 0)
            {
                int value = RangeValues[0];
                RangeValues.RemoveAt(0);
                return value;
            }
            else
            {
                return _rnd.Next(min, max);
            }
        }

        /// <summary>
        /// Get a float value between 0 (inclusive) and 1 (exclusive)
        /// If FloatValues are defined, those values are returned
        /// </summary>
        /// <returns>Value in [0;1[ </returns>
        public float GetValue()
        {
            if (FloatValues != null && FloatValues.Count > 0)
            {
                float value = FloatValues[0];
                FloatValues.RemoveAt(0);
                return value;
            }
            else
            {
                return (float)_rnd.NextDouble();
            }
        }

        /// <summary>
        /// Set a range of int values
        /// </summary>
        /// <param name="rangeValues"></param>
        public void SetRangeValues(List<int> rangeValues)
        {
            this.RangeValuesFromStart = new List<int>(rangeValues);
            this.RangeValues = new List<int>(rangeValues);
        }
    }
}
