using ModernUO.Serialization;

namespace Server.Items
{
    [SerializationGenerator(0, false)]
    public abstract partial class BaseShoes : BaseClothing
    {
        public BaseShoes(int itemID, int hue = 0) : base(itemID, Layer.Shoes, hue)
        {
        }

        public override bool Scissor(Mobile from, Scissors scissors)
        {
            if (DefaultResource == CraftResource.None)
            {
                return base.Scissor(from, scissors);
            }

            from.SendLocalizedMessage(502440); // Scissors can not be used on that to produce anything.
            return false;
        }
    }

    [Flippable(0x2307, 0x2308)]
    [SerializationGenerator(0, false)]
    public partial class FurBoots : BaseShoes
    {
        [Constructible]
        public FurBoots(int hue = 0) : base(0x2307, hue)
        {
        }

        public override double DefaultWeight => 3.0;
    }

    [Flippable(0x170b, 0x170c)]
    [SerializationGenerator(0, false)]
    public partial class Boots : BaseShoes
    {
        [Constructible]
        public Boots(int hue = 0) : base(0x170B, hue)
        {
        }

        public override double DefaultWeight => 3.0;

        public override CraftResource DefaultResource => CraftResource.RegularLeather;
    }

    [Flippable]
    [SerializationGenerator(2, false)]
    public partial class ThighBoots : BaseShoes, IArcaneEquip
    {
        [Constructible]
        public ThighBoots(int hue = 0) : base(0x1711, hue)
        {
        }

        public override double DefaultWeight => 4.0;

        public override CraftResource DefaultResource => CraftResource.RegularLeather;

        [EncodedInt]
        [SerializableProperty(0)]
        [CommandProperty(AccessLevel.GameMaster)]
        public int CurArcaneCharges
        {
            get => _curArcaneCharges;
            set
            {
                _curArcaneCharges = value;
                InvalidateProperties();
                Update();
                this.MarkDirty();
            }
        }

        [EncodedInt]
        [SerializableProperty(1)]
        [CommandProperty(AccessLevel.GameMaster)]
        public int MaxArcaneCharges
        {
            get => _maxArcaneCharges;
            set
            {
                _maxArcaneCharges = value;
                InvalidateProperties();
                Update();
                this.MarkDirty();
            }
        }

        [CommandProperty(AccessLevel.GameMaster)]
        public bool IsArcane => _maxArcaneCharges > 0 && _curArcaneCharges >= 0;

        private void Deserialize(IGenericReader reader, int version)
        {
            if (reader.ReadBool())
            {
                _curArcaneCharges = reader.ReadInt();
                _maxArcaneCharges = reader.ReadInt();
            }
        }

        public override void OnSingleClick(Mobile from)
        {
            base.OnSingleClick(from);

            if (IsArcane)
            {
                LabelTo(from, 1061837, $"{_curArcaneCharges}\t{_maxArcaneCharges}");
            }
        }

        public void Update()
        {
            if (IsArcane)
            {
                ItemID = 0x26AF;
            }
            else if (ItemID == 0x26AF)
            {
                ItemID = 0x1711;
            }

            if (IsArcane && CurArcaneCharges == 0)
            {
                Hue = 0;
            }
        }

        public override void GetProperties(IPropertyList list)
        {
            base.GetProperties(list);

            if (IsArcane)
            {
                list.Add(1061837, $"{_curArcaneCharges}\t{_maxArcaneCharges}"); // arcane charges: ~1_val~ / ~2_val~
            }
        }

        public void Flip()
        {
            ItemID = ItemID switch
            {
                0x1711 => 0x1712,
                0x1712 => 0x1711,
                _      => ItemID
            };
        }
    }

    [Flippable(0x170f, 0x1710)]
    [SerializationGenerator(0, false)]
    public partial class Shoes : BaseShoes
    {
        [Constructible]
        public Shoes(int hue = 0) : base(0x170F, hue)
        {
        }

        public override double DefaultWeight => 2.0;

        public override CraftResource DefaultResource => CraftResource.RegularLeather;
    }

    [Flippable(0x170d, 0x170e)]
    [SerializationGenerator(0, false)]
    public partial class Sandals : BaseShoes
    {
        [Constructible]
        public Sandals(int hue = 0) : base(0x170D, hue)
        {
        }

        public override double DefaultWeight => 1.0;

        public override CraftResource DefaultResource => CraftResource.RegularLeather;

        public override bool Dye(Mobile from, DyeTub sender) => false;
    }

    [Flippable(0x2797, 0x27E2)]
    [SerializationGenerator(0, false)]
    public partial class NinjaTabi : BaseShoes
    {
        [Constructible]
        public NinjaTabi(int hue = 0) : base(0x2797, hue)
        {
        }

        public override double DefaultWeight => 2.0;
    }

    [Flippable(0x2796, 0x27E1)]
    [SerializationGenerator(0, false)]
    public partial class SamuraiTabi : BaseShoes
    {
        [Constructible]
        public SamuraiTabi(int hue = 0) : base(0x2796, hue)
        {
        }

        public override double DefaultWeight => 2.0;
    }

    [Flippable(0x2796, 0x27E1)]
    [SerializationGenerator(0, false)]
    public partial class Waraji : BaseShoes
    {
        [Constructible]
        public Waraji(int hue = 0) : base(0x2796, hue)
        {
        }

        public override double DefaultWeight => 2.0;
    }

    [Flippable(0x2FC4, 0x317A)]
    [SerializationGenerator(0)]
    public partial class ElvenBoots : BaseShoes
    {
        [Constructible]
        public ElvenBoots(int hue = 0) : base(0x2FC4, hue)
        {
        }

        public override double DefaultWeight => 2.0;

        public override CraftResource DefaultResource => CraftResource.RegularLeather;

        public override int RequiredRaces => Race.AllowElvesOnly;

        public override bool Dye(Mobile from, DyeTub sender) => false;
    }
}
