namespace Raylib_cs
{
    //----------------------------------------------------------------------------------
    // Types and Structures Definition
    //----------------------------------------------------------------------------------
    public struct Light
    {
        public bool enabled;
        public LightType type;
        public Vector3 position;
        public Vector3 target;
        public Color color;
        public int enabledLoc;
        public int typeLoc;
        public int posLoc;
        public int targetLoc;
        public int colorLoc;
    }

    // Light type
    public enum LightType
    {
        LIGHT_DIRECTIONAL,
        LIGHT_POINT
    }

    public static class Rlights
    {
        //----------------------------------------------------------------------------------
        // Global Variables Definition
        //----------------------------------------------------------------------------------
        public const int MAX_LIGHTS = 4;
        public static int lightsCount = 0;    // Current amount of created lights
        public const float LIGHT_DISTANCE = 3.5f;
        public const float LIGHT_HEIGHT = 1.0f;

        //----------------------------------------------------------------------------------
        // Module Functions Definition
        //----------------------------------------------------------------------------------

        public static Light CreateLight(LightType type, Vector3 pos, Vector3 targ, Color color, Shader shader)
        {
            Light light = new Light();

            if (lightsCount < MAX_LIGHTS)
            {
                light.enabled = true;
                light.type = type;
                light.position = pos;
                light.target = targ;
                light.color = color;

                string enabledName = $"lights[{lightsCount}].enabled\0";
                string typeName = $"lights[{lightsCount}].type\0";
                string posName = $"lights[{lightsCount}].position\0";
                string targetName = $"lights[{lightsCount}].target\0";
                string colorName = $"lights[{lightsCount}].color\0";

                light.enabledLoc = Raylib.GetShaderLocation(shader, enabledName);
                light.typeLoc = Raylib.GetShaderLocation(shader, typeName);
                light.posLoc = Raylib.GetShaderLocation(shader, posName);
                light.targetLoc = Raylib.GetShaderLocation(shader, targetName);
                light.colorLoc = Raylib.GetShaderLocation(shader, colorName);

                UpdateLightValues(shader, light);
                lightsCount++;
            }
            return light;
        }

        public static void UpdateLightValues(Shader shader, Light light)
        {
            // Send to shader light enabled state and type
            /*Raylib.SetShaderValue(shader, light.enabledLoc, new int[] { light.enabled ? 1 : 0 }, ShaderUniformDataType.UNIFORM_INT);
            Raylib.SetShaderValue(shader, light.typeLoc, new int[] { (int)light.type }, ShaderUniformDataType.UNIFORM_INT);

            // Send to shader light position values
            float[] position = { light.position.x, light.position.y, light.position.z };
            Raylib.SetShaderValue(shader, light.posLoc, ref position, ShaderUniformDataType.UNIFORM_VEC3);

            // Send to shader light target position values
            float[] target = { light.target.x, light.target.y, light.target.z };
            Raylib.SetShaderValue(shader, light.targetLoc, ref target, ShaderUniformDataType.UNIFORM_VEC3);

            // Send to shader light color values
            float[] color = { light.color.r / 255, light.color.g / 255,
                              light.color.b / 255, light.color.a / 255 };
            Raylib.SetShaderValue(shader, light.colorLoc, ref color, ShaderUniformDataType.UNIFORM_VEC4);*/
        }
    }
}