using System;
using System.Linq;

using Server.Mobiles;

namespace Server.Items
{
    public class HelmOfVirtuousEpiphany : PlateHelm, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150233; } } // Helm of Virtuous Epiphany
		
		[Constructable]
		public HelmOfVirtuousEpiphany()
		{
			Hue = 2076;
			ArmorAttributes.MageArmor = 1;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();   
                }
            }
        }

		public HelmOfVirtuousEpiphany(Serial serial) : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
	
	public class GorgetOfVirtuousEpiphany : PlateGorget, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150234; } } // Gorget of Virtuous Epiphany
		
		[Constructable]
		public GorgetOfVirtuousEpiphany()
		{
			Hue = 2076;
			ArmorAttributes.MageArmor = 1;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }
        }

		public GorgetOfVirtuousEpiphany(Serial serial) : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
	
	public class BreastplateOfVirtuousEpiphany : PlateChest, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150235; } } // Breastplate of Virtuous Epiphany
		
		[Constructable]
		public BreastplateOfVirtuousEpiphany()
		{
			Hue = 2076;
			ArmorAttributes.MageArmor = 1;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }
        }

		public BreastplateOfVirtuousEpiphany(Serial serial) : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
	
	public class ArmsOfVirtuousEpiphany : PlateArms, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150236; } } // Arms of Virtuous Epiphany
		
		[Constructable]
		public ArmsOfVirtuousEpiphany()
		{
			Hue = 2076;
			ArmorAttributes.MageArmor = 1;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }
        }

		public ArmsOfVirtuousEpiphany(Serial serial) : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
	
	public class GauntletsOfVirtuousEpiphany : PlateGloves, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150237; } } // Gauntlets of Virtuous Epiphany
		
		[Constructable]
		public GauntletsOfVirtuousEpiphany()
		{
			Hue = 2076;
			ArmorAttributes.MageArmor = 1;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }
        }

		public GauntletsOfVirtuousEpiphany(Serial serial) : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
	
	public class LegsOfVirtuousEpiphany : PlateLegs, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150238; } } // Leggings of Virtuous Epiphany
		
		[Constructable]
		public LegsOfVirtuousEpiphany()
		{
			Hue = 2076;
			ArmorAttributes.MageArmor = 1;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }
        }

		public LegsOfVirtuousEpiphany(Serial serial) : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
	
	public class KiltOfVirtuousEpiphany : GargishPlateKilt, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150262; } } // Kilt of Virtuous Epiphany
		
		[Constructable]
		public KiltOfVirtuousEpiphany()
		{
			Hue = 2076;
			ArmorAttributes.MageArmor = 1;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }
        }

		public KiltOfVirtuousEpiphany(Serial serial) : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
	
	public class EarringsOfVirtuousEpiphany : GargishEarrings, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150262; } } // Earrings of Virtuous Epiphany
		
		[Constructable]
		public EarringsOfVirtuousEpiphany()
		{
			Hue = 2076;
			ArmorAttributes.MageArmor = 1;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }
        }

		public EarringsOfVirtuousEpiphany(Serial serial) : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
	
	public class GargishBreastplateOfVirtuousEpiphany : GargishPlateChest, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150235; } } // Breastplate of Virtuous Epiphany
		
		[Constructable]
		public GargishBreastplateOfVirtuousEpiphany()
		{
			Hue = 2076;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }
        }

		public GargishBreastplateOfVirtuousEpiphany(Serial serial) : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
	
	public class GargishArmsOfVirtuousEpiphany : GargishPlateArms, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150236; } } // Arms of Virtuous Epiphany
		
		[Constructable]
		public GargishArmsOfVirtuousEpiphany()
		{
			Hue = 2076;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }
        }

		public GargishArmsOfVirtuousEpiphany(Serial serial) : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
	
	public class NecklaceOfVirtuousEpiphany : GargishNecklace, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150261; } } // Necklace of Virtuous Epiphany
		
		[Constructable]
		public NecklaceOfVirtuousEpiphany()
		{
			Hue = 2076;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }
        }

		public NecklaceOfVirtuousEpiphany(Serial serial) : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
	
	public class GargishLegsOfVirtuousEpiphany : GargishPlateLegs, IEpiphanyArmor
	{
		public Alignment Alignment { get { return Alignment.Good; } }
		public SurgeType Type { get { return SurgeType.Mana; } }
		public int Frequency { get { return EpiphanyHelper.GetFrequency(Parent as Mobile, this); } }
		public int Bonus { get { return EpiphanyHelper.GetBonus(Parent as Mobile, this); } }
		
		public override int LabelNumber { get { return 1150238; } } // Legs of Virtuous Epiphany
		
		[Constructable]
		public GargishLegsOfVirtuousEpiphany()
		{
			Hue = 2076;
		}

        public override void AddWeightProperty(ObjectPropertyList list)
        {
            base.AddWeightProperty(list);

            EpiphanyHelper.AddProperties(this, list);
        }

        public override bool OnEquip(Mobile from)
        {
            bool canEquip = base.OnEquip(from);

            if (canEquip)
            {
                foreach (var armor in from.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }

            return canEquip;
        }

        public override void OnRemoved(object parent)
        {
            base.OnRemoved(parent);

            if (parent is Mobile)
            {
                var m = (Mobile)parent;

                foreach (var armor in m.Items.Where(i => i is IEpiphanyArmor))
                {
                    armor.InvalidateProperties();
                }
            }
        }

        public GargishLegsOfVirtuousEpiphany(Serial serial)
            : base(serial)
		{
		}
		
		public override void Serialize(GenericWriter writer)
		{
			base.Serialize(writer);
			writer.Write(0);
		}
		
		public override void Deserialize(GenericReader reader)
		{
			base.Deserialize(reader);
			int version = reader.ReadInt();
		}
	}
}