using System;
using System.IO;
namespace UnityEditor.U2D.Aseprite
{
    /// 
    /// Flags for layer options.
    /// 
    [Flags]
    public enum LayerFlags
    {
        /// Flag set if the layer is visible
        Visible = 1,
        /// Editable - not in use flag
        Editable = 2,
        /// LockMovement - not in use flag
        LockMovement = 4,
        /// Background - not in use flag
        Background = 8,
        /// PreferLinkedCels - not in use flag
        PreferLinkedCels = 16,
        /// DisplayAsCollapsed - not in use flag
        DisplayAsCollapsed = 32,
        /// ReferenceLayer - not in use flag
        ReferenceLayer = 64
    }
    /// 
    /// Layer types.
    /// 
    public enum LayerTypes
    {
        /// Normal layer
        Normal = 0,
        /// Group layer
        Group = 1,
        /// Tilemap layer
        Tilemap = 2
    }
    /// 
    /// Layer blend modes.
    /// 
    public enum BlendModes
    {
        /// Normal blend mode
        Normal = 0,
        /// Multiply blend mode
        Multiply = 1,
        /// Screen blend mode
        Screen = 2,
        /// Overlay blend mode
        Overlay = 3,
        /// Darken blend mode
        Darken = 4,
        /// Lighten blend mode
        Lighten = 5,
        /// ColorDodge blend mode
        ColorDodge = 6,
        /// ColorBurn blend mode
        ColorBurn = 7,
        /// HardLight blend mode
        HardLight = 8,
        /// SoftLight blend mode
        SoftLight = 9,
        /// Difference blend mode
        Difference = 10,
        /// Exclusion blend mode
        Exclusion = 11,
        /// Hue blend mode
        Hue = 12,
        /// Saturation blend mode
        Saturation = 13,
        /// Color blend mode
        Color = 14,
        /// Luminosity blend mode
        Luminosity = 15,
        /// Addition blend mode
        Addition = 16,
        /// Subtract blend mode
        Subtract = 17,
        /// Divide blend mode
        Divide = 18
    }
    /// 
    /// Parsed representation of an Aseprite Layer chunk.
    /// 
    public class LayerChunk : BaseChunk
    {
        /// 
        public override ChunkTypes chunkType => ChunkTypes.Layer;
        /// 
        /// Layer UUID (Only available if the user has enabled UUID for layers in Aseprite).
        /// 
        internal UUID uuid { get; private set; }
        /// 
        /// Layer option flags.
        /// 
        public LayerFlags flags { get; private set; }
        /// 
        /// Type of layer.
        /// 
        public LayerTypes layerType { get; private set; }
        /// 
        /// The child level is used to show the relationship of this layer with the last one read.
        /// 
        public ushort childLevel { get; private set; }
        /// 
        /// Layer blend mode.
        /// 
        public BlendModes blendMode { get; private set; }
        /// Layer opacity (0 = transparent, 255 = opaque).
        public byte opacity { get; private set; }
        /// 
        /// Layer name.
        /// 
        public string name { get; private set; }
        /// 
        /// Tileset index (Only available for Tilemap layers).
        /// 
        public uint tileSetIndex { get; private set; }
        bool m_HasUuid;
        internal LayerChunk(uint chunkSize, bool hasUuid) : base(chunkSize)
        {
            m_HasUuid = hasUuid;
        }
        /// 
        /// Read and store the chunk data.
        /// 
        /// The active binary reader of the file.
        protected override void InternalRead(BinaryReader reader)
        {
            flags = (LayerFlags)reader.ReadUInt16();
            layerType = (LayerTypes)reader.ReadUInt16();
            childLevel = reader.ReadUInt16();
            var defaultLayerWidth = reader.ReadUInt16();
            var defaultLayerHeight = reader.ReadUInt16();
            blendMode = (BlendModes)reader.ReadUInt16();
            opacity = reader.ReadByte();
            // Not in use bytes
            for (var i = 0; i < 3; ++i)
                reader.ReadByte();
            name = AsepriteUtilities.ReadString(reader);
            if (layerType == LayerTypes.Tilemap)
                tileSetIndex = reader.ReadUInt32();
            if (m_HasUuid)
            {
                var value0 = reader.ReadUInt32();
                var value1 = reader.ReadUInt32();
                var value2 = reader.ReadUInt32();
                var value3 = reader.ReadUInt32();
                uuid = new UUID(value0, value1, value2, value3);
            }
        }
    }
}