using System;
using System.ComponentModel;

namespace PKHeX.Core
{
    public sealed class Poffin4
    {
        public const int SIZE = 8;
        public readonly byte[] Data;

        public Poffin4(byte[] data) => Data = data;
        public Poffin4(byte[] data, int offset) : this(data.AsSpan(offset, SIZE).ToArray())
        {
        }

        private const string Stats = nameof(Stats);

        public PoffinFlavor4 Type{ get => (PoffinFlavor4)Data[0]; set => Data[0] = (byte)value; }

        [Category(Stats), Description("Cool Stat Boost")]
        public byte BoostSpicy  { get => Data[1]; set => Data[1] = value; }

        [Category(Stats), Description("Beauty Stat Boost")]
        public byte BoostDry    { get => Data[2]; set => Data[2] = value; }

        [Category(Stats), Description("Cute Stat Boost")]
        public byte BoostSweet  { get => Data[3]; set => Data[3] = value; }

        [Category(Stats), Description("Smart/Clever Stat Boost")]
        public byte BoostBitter { get => Data[4]; set => Data[4] = value; }

        [Category(Stats), Description("Tough Stat Boost")]
        public byte BoostSour   { get => Data[5]; set => Data[5] = value; }

        [Category(Stats), Description("Sheen Stat Boost")]
        public byte Smoothness  { get => Data[6]; set => Data[6] = value; }
        // public byte Unused   { get => Data[7]; set => Data[7] = value; }

        public bool IsManyStat => Type >= PoffinFlavor4.Rich;
        public PoffinFlavor4 StatPrimary => IsManyStat ? PoffinFlavor4.None : (PoffinFlavor4)(((byte) Type / 5) * 6);
        public PoffinFlavor4 StatSecondary => IsManyStat ? PoffinFlavor4.None : (PoffinFlavor4)(((byte)Type % 5) * 6);

        public void SetAll(byte value = 255, PoffinFlavor4 type = PoffinFlavor4.Rich)
        {
            Type = type;
            BoostSpicy = BoostDry = BoostSweet = BoostBitter = BoostSour = Smoothness = value;
        }

        public void SetStat(int stat, byte value)
        {
            if ((uint) stat > 5)
                throw new ArgumentOutOfRangeException(nameof(stat));
            Data[1 + stat] = value;
        }

        public byte GetStat(int stat)
        {
            if ((uint)stat > 5)
                throw new ArgumentOutOfRangeException(nameof(stat));
            return Data[1 + stat];
        }

        public void Delete() => SetAll(0, PoffinFlavor4.None);
    }
}
