namespace Server.Items
{
    public class EarringBoxSet : RedVelvetGiftBox
    {
        [Constructible]
        public EarringBoxSet()
        {
            DropItem(new EarringsOfProtection(AosElementAttribute.Physical));
            DropItem(new EarringsOfProtection(AosElementAttribute.Fire));
            DropItem(new EarringsOfProtection(AosElementAttribute.Cold));
            DropItem(new EarringsOfProtection(AosElementAttribute.Poison));
            DropItem(new EarringsOfProtection(AosElementAttribute.Energy));
        }

        public EarringBoxSet(Serial serial)
            : base(serial)
        {
        }

        public override void Serialize(IGenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write(0); // version
        }

        public override void Deserialize(IGenericReader reader)
        {
            base.Deserialize(reader);

            var version = reader.ReadInt();
        }
    }

    public class EarringsOfProtection : BaseJewel
    {
        private AosElementAttribute m_Attribute;

        [Constructible]
        public EarringsOfProtection() : this(RandomType())
        {
        }

        [Constructible]
        public EarringsOfProtection(AosElementAttribute element)
            : base(0x1087, Layer.Earrings)
        {
            Resistances[element] = 2;

            m_Attribute = element;
            LootType = LootType.Blessed;
        }

        public EarringsOfProtection(Serial serial)
            : base(serial)
        {
        }

        [CommandProperty(AccessLevel.GameMaster)]
        public virtual AosElementAttribute Attribute => m_Attribute;

        public override int LabelNumber => GetItemData(m_Attribute, true);

        public override int Hue => GetItemData(m_Attribute, false);

        public override void Serialize(IGenericWriter writer)
        {
            base.Serialize(writer);

            writer.Write(0); // version
            writer.Write((int)m_Attribute);
        }

        public override void Deserialize(IGenericReader reader)
        {
            base.Deserialize(reader);

            var version = reader.ReadInt();
            m_Attribute = (AosElementAttribute)reader.ReadInt();
        }

        public static AosElementAttribute RandomType() => GetTypes(Utility.Random(5));

        public static AosElementAttribute GetTypes(int value)
        {
            return value switch
            {
                0 => AosElementAttribute.Physical,
                1 => AosElementAttribute.Fire,
                2 => AosElementAttribute.Cold,
                3 => AosElementAttribute.Poison,
                _ => AosElementAttribute.Energy
            };
        }

        public static int GetItemData(AosElementAttribute element, bool label)
        {
            return element switch
            {
                AosElementAttribute.Physical => label ? 1071091 : 0,     // Earring of Protection (Physical)  1071091
                AosElementAttribute.Fire     => label ? 1071092 : 0x4ec, // Earring of Protection (Fire)      1071092
                AosElementAttribute.Cold     => label ? 1071093 : 0x4f2, // Earring of Protection (Cold)      1071093
                AosElementAttribute.Poison   => label ? 1071094 : 0x4f8, // Earring of Protection (Poison)    1071094
                AosElementAttribute.Energy   => label ? 1071095 : 0x4fe, // Earring of Protection (Energy)    1071095
                _                            => -1
            };
        }
    }
}
