// Created by Peoharen

using System;
using System.Collections.Generic;

namespace Server
{
    public class EnhancementAttributes
    {
        public SAAbsorptionAttributes AbsorptionAttributes;
        public AosArmorAttributes ArmorAttributes;
        public AosAttributes Attributes;
        public string Title;
        public AosWeaponAttributes WeaponAttributes;

        public EnhancementAttributes(string title)
        {
            Title = title;
            Attributes = new AosAttributes(null);
            WeaponAttributes = new AosWeaponAttributes(null);
            ArmorAttributes = new AosArmorAttributes(null);
            AbsorptionAttributes = new SAAbsorptionAttributes(null);
        }
    }

    public class Enhancement
    {
        public static Dictionary<Mobile, EnhancementAttributes> EnhancementList =
            new Dictionary<Mobile, EnhancementAttributes>();

        public static bool AddMobile(Mobile m, string title)
        {
            if (!EnhancementList.ContainsKey(m))
            {
                EnhancementList.Add(m, new EnhancementAttributes(title));
                return true;
            }

            return false;
        }

        public static bool RemoveMobile(Mobile m)
        {
            if (EnhancementList.ContainsKey(m))
            {
                EnhancementList.Remove(m);
                return true;
            }

            return false;
        }

        public static int GetValue(Mobile m, AosAttribute att)
        {
            if (EnhancementList.ContainsKey(m))
                return EnhancementList[m].Attributes[att];
            return 0;
        }

        public static void SetValue(Mobile m, AosAttribute att, int value, string title)
        {
            if (!EnhancementList.ContainsKey(m))
                AddMobile(m, title);

            if (att == AosAttribute.BonusStr)
            {
                m.RemoveStatMod("MagicalEnhancementStr");
                m.AddStatMod(new StatMod(StatType.Str, "MagicalEnhancementStr", value, TimeSpan.Zero));
            }
            else if (att == AosAttribute.BonusDex)
            {
                m.RemoveStatMod("MagicalEnhancementDex");
                m.AddStatMod(new StatMod(StatType.Dex, "MagicalEnhancementDex", value, TimeSpan.Zero));
            }
            else if (att == AosAttribute.BonusInt)
            {
                m.RemoveStatMod("MagicalEnhancementInt");
                m.AddStatMod(new StatMod(StatType.Int, "MagicalEnhancementInt", value, TimeSpan.Zero));
            }

            if (title != EnhancementList[m].Title)
                EnhancementList[m].Attributes[att] = value;
            else
                EnhancementList[m].Attributes[att] += value;
        }

        public static int GetValue(Mobile m, AosWeaponAttribute att)
        {
            if (EnhancementList.ContainsKey(m))
                return EnhancementList[m].WeaponAttributes[att];
            return 0;
        }

        public static void SetValue(Mobile m, AosWeaponAttribute att, int value, string title)
        {
            if (!EnhancementList.ContainsKey(m))
                AddMobile(m, title);

            if (title != EnhancementList[m].Title)
                EnhancementList[m].WeaponAttributes[att] = value;
            else
                EnhancementList[m].WeaponAttributes[att] += value;
        }

        public static int GetValue(Mobile m, AosArmorAttribute att)
        {
            if (EnhancementList.ContainsKey(m))
                return EnhancementList[m].ArmorAttributes[att];
            return 0;
        }

        public static void SetValue(Mobile m, AosArmorAttribute att, int value, string title)
        {
            if (!EnhancementList.ContainsKey(m))
                AddMobile(m, title);

            if (title != EnhancementList[m].Title)
                EnhancementList[m].ArmorAttributes[att] = value;
            else
                EnhancementList[m].ArmorAttributes[att] += value;
        }

        public static int GetValue(Mobile m, SAAbsorptionAttribute att)
        {
            if (EnhancementList.ContainsKey(m))
                return EnhancementList[m].AbsorptionAttributes[att];
            return 0;
        }

        public static void SetValue(Mobile m, SAAbsorptionAttribute att, int value, string title)
        {
            if (!EnhancementList.ContainsKey(m))
                AddMobile(m, title);

            if (title != EnhancementList[m].Title)
                EnhancementList[m].AbsorptionAttributes[att] = value;
            else
                EnhancementList[m].AbsorptionAttributes[att] += value;
        }
    }
}

/*
AOS.cs
MagicalEnhancements.GetValue( m, attribute );
Usage of setting total (intended use)
MagicalEnhancements.SetValue( m, AosAttribute.Luck, 50 );
Example of a timed stackable Enhancement (supports to an extent)
private Mobile m_Mobile;

public void Luckboon()
{
MagicalEnhancements.AddMobile( m );
MagicalEnhancements.EnhancementList[m].Attributes.Luck += 200;
Timer.DelayCall( TimeSpan.FromSeconds( 30 ), new TimerCallback( Expire ) );
}

private void Expire()
{
if ( m_Mobile != null && MagicalEnhancements.EnhancementList.ContainsKey( m ) )
MagicalEnhancements.EnhancementList[m].Attributes.Luck -= 200;
}
*/