using System;

namespace Server.Engines.Harvest
{
    public class HarvestBank
    {
        private readonly int m_Maximum;
        private int m_Current;
        private DateTime m_NextRespawn;
        private HarvestVein m_Vein, m_DefaultVein;

        public HarvestBank(HarvestDefinition def, HarvestVein defaultVein)
        {
            m_Maximum = Utility.RandomMinMax(def.MinTotal, def.MaxTotal);
            m_Current = m_Maximum;
            m_DefaultVein = defaultVein;
            m_Vein = m_DefaultVein;

            Definition = def;
        }

        public HarvestDefinition Definition { get; }

        public int Current
        {
            get
            {
                CheckRespawn();
                return m_Current;
            }
        }

        public HarvestVein Vein
        {
            get
            {
                CheckRespawn();
                return m_Vein;
            }
            set => m_Vein = value;
        }

        public HarvestVein DefaultVein
        {
            get
            {
                CheckRespawn();
                return m_DefaultVein;
            }
        }

        public void CheckRespawn()
        {
            if (m_Current == m_Maximum || m_NextRespawn > Core.Now)
            {
                return;
            }

            m_Current = m_Maximum;

            if (Definition.RandomizeVeins)
            {
                m_DefaultVein = Definition.GetVeinFrom(Utility.Random(Definition.VeinWeights));
            }

            m_Vein = m_DefaultVein;
        }

        public void Consume(int amount, Mobile from)
        {
            CheckRespawn();

            if (m_Current == m_Maximum)
            {
                var min = Definition.MinRespawn.TotalMinutes;
                var max = Definition.MaxRespawn.TotalMinutes;
                var rnd = Utility.RandomDouble();

                m_Current = m_Maximum - amount;

                var minutes = min + rnd * (max - min);
                if (Definition.RaceBonus && from.Race == Race.Elf) // def.RaceBonus = Core.ML
                {
                    minutes *= .75; // 25% off the time.
                }

                m_NextRespawn = Core.Now + TimeSpan.FromMinutes(minutes);
            }
            else
            {
                m_Current -= amount;
            }

            if (m_Current < 0)
            {
                m_Current = 0;
            }
        }
    }
}
