using System;
using Server.Network;

namespace Server.Items
{
    public abstract class BaseMagicFish : Item
    {
        public virtual int Bonus { get { return 0; } }
        public virtual StatType Type { get { return StatType.Str; } }

        public override double DefaultWeight
        {
            get { return 1.0; }
        }

        public BaseMagicFish(int hue) : base(0xDD6)
        {
            Hue = hue;
        }

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

        public virtual bool Apply(Mobile from)
        {
            bool applied = Spells.SpellHelper.AddStatOffset(from, Type, Bonus, TimeSpan.FromMinutes(1.0));

            if (!applied)
                from.SendLocalizedMessage(502173); // You are already under a similar effect.

            return applied;
        }

        public override void OnDoubleClick(Mobile from)
        {
            if (!IsChildOf(from.Backpack))
            {
                from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
            }
            else if (Apply(from))
            {
                from.FixedEffect(0x375A, 10, 15);
                from.PlaySound(0x1E7);
                from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 501774); // You swallow the fish whole!
                Delete();
            }
        }

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

            writer.Write(0); // version
        }

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

            int version = reader.ReadInt();
        }
    }

    public class PrizedFish : BaseMagicFish
    {
        public override int Bonus { get { return 5; } }
        public override StatType Type { get { return StatType.Int; } }

        public override int LabelNumber { get { return 1041073; } } // prized fish

        [Constructable]
        public PrizedFish() : base(51)
        {
        }

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

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

            writer.Write(0); // version
        }

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

            int version = reader.ReadInt();

            if (Hue == 151)
                Hue = 51;
        }
    }

    public class WondrousFish : BaseMagicFish
    {
        public override int Bonus { get { return 5; } }
        public override StatType Type { get { return StatType.Dex; } }

        public override int LabelNumber { get { return 1041074; } } // wondrous fish

        [Constructable]
        public WondrousFish() : base(86)
        {
        }

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

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

            writer.Write(0); // version
        }

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

            int version = reader.ReadInt();

            if (Hue == 286)
                Hue = 86;
        }
    }

    public class TrulyRareFish : BaseMagicFish
    {
        public override int Bonus { get { return 5; } }
        public override StatType Type { get { return StatType.Str; } }

        public override int LabelNumber { get { return 1041075; } } // truly rare fish

        [Constructable]
        public TrulyRareFish() : base(76)
        {
        }

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

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

            writer.Write(0); // version
        }

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

            int version = reader.ReadInt();

            if (Hue == 376)
                Hue = 76;
        }
    }

    public class PeculiarFish : BaseMagicFish
    {
        public override int LabelNumber { get { return 1041076; } } // highly peculiar fish

        [Constructable]
        public PeculiarFish() : base(66)
        {
        }

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

        public override bool Apply(Mobile from)
        {
            from.Stam += 10;
            return true;
        }

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

            writer.Write(0); // version
        }

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

            int version = reader.ReadInt();

            if (Hue == 266)
                Hue = 66;
        }
    }
}