using HISP.Security;
using HISP.Server;

namespace HISP.Game.Horse
{
    public class HorseInstance
    {
        public HorseInstance(HorseInfo.Breed breed, int randomId = -1, string loadColor = null ,string loadName=null, string loadDescription = "", int loadSpoiled=0, string loadCategory="KEEPER", int loadMagicUsed=0, int loadAutoSell=0, int leaseTimer=0, bool loadHidden=false, int loadOwner=0)
        {
            RandomId = RandomID.NextRandomId(randomId);
            owner = loadOwner;
            if(loadName == null)
            {

                if (breed.Type == "camel")
                {
                    name = "Wild Camel";

                }
                else if (breed.Type == "llama")
                {
                    name = "Jungle Llama";
                }
                else if (breed.Type == "zebra")
                {
                    name = "Wild Zebra";
                }
                else
                {
                    name = "Wild Horse";
                }
            }
            else
            {
                name = loadName;
            }
            if(GameServer.RandomNumberGenerator.Next(0, 100) > 50)
                Gender = breed.GenderTypes()[1];
            else
                Gender = breed.GenderTypes()[0];

            description = loadDescription;
            Breed = breed;
            

            BasicStats = new HorseInfo.BasicStats(this, 1000, 0, 1000, 1000, 500, 200, 1000, 0);

            int inteligence = (GameServer.RandomNumberGenerator.Next(breed.BaseStats.Inteligence, (breed.BaseStats.Inteligence * 2)) - breed.BaseStats.Inteligence);
            int personality = (GameServer.RandomNumberGenerator.Next(breed.BaseStats.Personality, (breed.BaseStats.Personality * 2)) - breed.BaseStats.Personality);
            int height = GameServer.RandomNumberGenerator.Next(breed.BaseStats.MinHeight, breed.BaseStats.MaxHeight + 1);
            AdvancedStats = new HorseInfo.AdvancedStats(this, 0, 0, 0, 0, inteligence, 0, personality, height);

            Equipment = new HorseInfo.HorseEquips();
            autosell = loadAutoSell;
            category = loadCategory;
            spoiled = loadSpoiled;
            magicUsed = loadMagicUsed;
            leaseTime = leaseTimer;
            hidden = loadHidden;
            if(loadColor != null)
               color = loadColor;
            else
               color = breed.Colors[GameServer.RandomNumberGenerator.Next(0, breed.Colors.Length)];
            Leaser = 0;
        }
        public int Leaser;
        public int RandomId;
        public int Owner 
        {
            get
            {
                return owner;
            }
            set
            {
                owner = value;
                Database.SetHorseOwner(RandomId, owner);
            }
        }

        public bool Hidden
        {
            get
            {
                return hidden;
            }
            set
            {
                hidden = value;
                Database.SetHorseHidden(RandomId, value);
            }
        }
        public int LeaseTime
        {
            get
            {
                return leaseTime;
            }
            set
            {
                leaseTime = value;
                Database.SetLeaseTime(this.RandomId, leaseTime);
            }
        }
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value.Trim();
                Database.SetHorseName(this.RandomId, name);
            }
        }
        public string Description
        {
            get
            {
                return description;
            }
            set
            {
                description = value.Trim();
                Database.SetHorseDescription(this.RandomId, description);
            }
        }
        public string Gender;
        public string Color
        {
            get
            {
                return color;
            }
            set
            {
                color = value;
                Database.SetHorseColor(this.RandomId, color);
            }
        }
        public int TrainTimer
        {
            get
            {
                int timeout = Database.GetHorseTrainTimeout(this.RandomId);
                if (timeout < 0)
                    return 0;
                else
                    return timeout;
            }
            set
            {
                Database.SetHorseTrainTimeout(this.RandomId, value);
            }
        }
        public HorseInfo.Breed Breed;
        public HorseInfo.BasicStats BasicStats;
        public HorseInfo.AdvancedStats AdvancedStats;
        public HorseInfo.HorseEquips Equipment;
        public int AutoSell
        {
            get
            {
                return autosell;
            }
            set
            {
                Database.SetHorseAutoSell(RandomId, value);
                autosell = value;
            }
        }
        public int Spoiled
        {
            get
            {
                return spoiled;
            }
            set
            {
                Database.SetHorseSpoiled(RandomId, value);
                spoiled = value;
            }
        }
        public int MagicUsed
        {
            get
            {
                return magicUsed;
            }
            set
            {
                Database.SetHorseMagicUsed(RandomId, value);
                magicUsed = value;
            }
        }
        public string Category
        {
            get
            {
                return category;
            }
            set
            {
                Database.SetHorseCategory(RandomId, value);
                category = value;
            }
        }

        private string color;
        private int owner;
        private string name;
        private string description;
        private int spoiled;
        private int leaseTime;
        private bool hidden;
        private int magicUsed;
        private int autosell;
        private string category;

        public void ChangeNameWithoutUpdatingDatabase(string newName)
        {
            name = newName;
        }

        
    }
}