using System;
using Unity.Mathematics;

namespace GamecraftModdingAPI.Blocks
{
    public struct BlockColor
    {
        public BlockColors Color;
        public byte Darkness;

        public byte Index => Color == BlockColors.Default
            ? byte.MaxValue
            : (byte) (Darkness * 10 + Color);

        public BlockColor(byte index)
        {
            if (index == byte.MaxValue)
            {
                Color = BlockColors.Default;
                Darkness = 0;
            }
            else
            {
                if (index > 99)
                    throw new ArgumentOutOfRangeException(nameof(index), "Invalid color index. Must be 0-90 or 255.");
                Color = (BlockColors) (index % 10);
                Darkness = (byte) (index / 10);
            }
        }

        public BlockColor(BlockColors color, byte darkness)
        {
            if (darkness > 9)
                throw new ArgumentOutOfRangeException(nameof(darkness), "Darkness must be 0-9 where 0 is default.");
            Color = color;
            Darkness = darkness;
        }

        public float4 RGBA => Block.BlockEngine.ConvertBlockColor(Index);

        public override string ToString()
        {
            return $"{nameof(Color)}: {Color}, {nameof(Darkness)}: {Darkness}";
        }
    }

    /// <summary>
    /// Preset block colours
    /// </summary>
    public enum BlockColors
    {
        Default = byte.MaxValue,
        White = 0,
        Pink,
        Purple,
        Blue,
        Aqua,
        Green,
        Lime,
        Yellow,
        Orange,
        Red
    }
}