using System;
using System.Runtime.InteropServices;

namespace Raylib_cs
{
    /// <summary>
    /// Material map index
    /// </summary>
    public enum MaterialMapIndex
    {
        /// <summary>
        /// NOTE: Same as MATERIAL_MAP_DIFFUSE
        /// </summary>
        MATERIAL_MAP_ALBEDO = 0,

        /// <summary>
        /// NOTE: Same as MATERIAL_MAP_SPECULAR
        /// </summary>
        MATERIAL_MAP_METALNESS,

        MATERIAL_MAP_NORMAL,
        MATERIAL_MAP_ROUGHNESS,
        MATERIAL_MAP_OCCLUSION,
        MATERIAL_MAP_EMISSION,
        MATERIAL_MAP_HEIGHT,

        /// <summary>
        /// NOTE: Uses GL_TEXTURE_CUBE_MAP
        /// </summary>
        MATERIAL_MAP_CUBEMAP,

        /// <summary>
        /// NOTE: Uses GL_TEXTURE_CUBE_MAP
        /// </summary>
        MATERIAL_MAP_IRRADIANCE,

        /// <summary>
        /// NOTE: Uses GL_TEXTURE_CUBE_MAP
        /// </summary>
        MATERIAL_MAP_PREFILTER,

        MATERIAL_MAP_BRDF,

        MATERIAL_MAP_DIFFUSE = MATERIAL_MAP_ALBEDO,
        MATERIAL_MAP_SPECULAR = MATERIAL_MAP_METALNESS,
    }

    /// <summary>
    /// Material texture map
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public partial struct MaterialMap
    {
        /// <summary>
        /// Material map texture
        /// </summary>
        public Texture2D texture;

        /// <summary>
        /// Material map color
        /// </summary>
        public Color color;

        /// <summary>
        /// Material map value
        /// </summary>
        public float value;
    }

    /// <summary>
    /// Material type (generic)
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public unsafe partial struct Material
    {
        /// <summary>
        /// Material shader
        /// </summary>
        public Shader shader;

        //TODO: convert
        /// <summary>
        /// Material maps
        /// </summary>
        public MaterialMap* maps;

        /// <summary>
        /// Material generic parameters (if required)
        /// </summary>
        public fixed float param[4];
    }
}