using System;
using RecrownedGTK.Graphics.UI.SkinSystem.Definitions;
using OpenTK.Graphics;
using RecrownedGTK.Types;

namespace RecrownedGTK.Data
{
    /// <summary>
    /// Data transfer object for game skins.
    /// </summary>
    public class SkinData
    {
        /// <summary>
        /// Holds metadata.
        /// </summary>
        public class Metadata
        {
            /// <summary>
            /// Author name.
            /// </summary>
            public string author;

            /// <summary>
            /// Description of skin.
            /// </summary>
            public string description;

            /// <summary>
            /// Name of skin.
            /// </summary>
            public string skinName;
        }

        /// <summary>
        /// The metadata for the skin file.
        /// </summary>
        public Metadata metadata;

        /// <summary>
        /// The name of the atlas with extension.
        /// </summary>
        public string nameOfTextureAtlas;

        /// <summary>
        /// Name of the region or file designating the cursor. If there is an extension, will check for file first then texture atlas. Otherwise, will just check region.
        /// </summary>
        public string cursorTextureName;

        /// <summary>
        /// The color data containing the name of the color, and red, green, and blue values for the color.
        /// </summary>
        public ColorData[] colors;

        /// <summary>
        /// The skin definitions containing a name for the definition, and the definition itself.
        /// </summary>
        public DefinitionData[] definitions;

        /// <summary>
        /// Color data for data transfer.
        /// </summary>
        public struct ColorData
        {
            /// <summary>
            /// Name of color to be referenced by.
            /// </summary>
            public string name;

            /// <summary>
            /// RGBA data of this color.
            /// </summary>
            public byte r, g, b, a;

            /// <summary>
            /// Sets values for data.
            /// </summary>
            /// <param name="name">the name to be referenced by.</param>
            /// <param name="color">The color value <paramref name="name"/> represents.</param>
            public ColorData(string name, Color4 color)
            {
                this.name = name;
                r = color.GetRedAsByte();
                g = color.GetGreenAsByte();
                b = color.GetBlueAsByte();
                a = color.GetAlphaAsByte();
            }
        }

        /// <summary>
        /// Definition data for data transfer.
        /// </summary>
        public struct DefinitionData
        {
            /// <summary>
            /// Name of definition to be referenced by.
            /// </summary>
            public string name;
            /// <summary>
            /// The skin definition data.
            /// </summary>
            public SkinDefinitionData skin;

            /// <summary>
            /// Sets values for data.
            /// </summary>
            /// <param name="name">The name to be referenced by.</param>
            /// <param name="skinDefinitionData">The skin data.</param>
            public DefinitionData(string name, SkinDefinitionData skinDefinitionData)
            {
                this.name = name;
                skin = skinDefinitionData;
            }
        }
    }
}