#version 330

// Input vertex attributes (from vertex shader)
in vec3 fragPosition;
in vec2 fragTexCoord;
//in vec4 fragColor;
in vec3 fragNormal;

// Input uniform values
uniform sampler2D texture0;
uniform vec4 colDiffuse;

// Output fragment color
out vec4 finalColor;

// NOTE: Add here your custom variables

#define     MAX_LIGHTS              4
#define     LIGHT_DIRECTIONAL       0
#define     LIGHT_POINT             1

struct Light {
    //int enabled;
    int type;
    vec3 position;
    vec3 target;
    vec4 color;
};

// Input lighting values
//uniform Light lights[MAX_LIGHTS];
uniform Light inlight;
uniform vec4 ambient;
uniform vec3 viewPos;

void main()
{
    // Texel color fetching from texture sampler
    vec4 texelColor = texture(texture0, fragTexCoord);
    vec3 lightDot = vec3(0.0);
    vec3 normal = normalize(fragNormal);
    vec3 viewD = normalize(viewPos - fragPosition);
    vec3 specular = vec3(0.0);

    // NOTE: Implement here your fragment shader code

    // for (int i = 0; i < MAX_LIGHTS; i++)
    // {
    //     if (lights[i].enabled == 1)
    //     {
    //         vec3 light = vec3(0.0);

    //         if (lights[i].type == LIGHT_DIRECTIONAL)
    //         {
    //             light = -normalize(lights[i].target - lights[i].position);
    //         }

    //         if (lights[i].type == LIGHT_POINT)
    //         {
    //             light = normalize(lights[i].position - fragPosition);
    //         }

    //         float NdotL = max(dot(normal, light), 0.0);
    //         lightDot += lights[i].color.rgb*NdotL;

    //         float specCo = 0.0;
    //         if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // 16 refers to shine
    //         specular += specCo;
    //     }
    // }


    //TODO
    //MY - begin
    vec3 light = vec3(0.0);

    // if (inlight.type == LIGHT_DIRECTIONAL)
    // {
    //     light = -normalize(inlight.target - inlight.position);
    // }

    // if (inlight.type == LIGHT_POINT)
    // {
    //     light = normalize(inlight.position - fragPosition);
    // }

    light = normalize(inlight.position - fragPosition);

    float NdotL = max(dot(normal, light), 0.0);
    lightDot += inlight.color.rgb*NdotL;

    float specCo = 0.0;
    if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // 16 refers to shine
    specular += specCo;
    //MY - end



    finalColor = (texelColor*((colDiffuse + vec4(specular, 1.0))*vec4(lightDot, 1.0)));
    finalColor += texelColor*(ambient/10.0)*colDiffuse;

    // Gamma correction
    finalColor = pow(finalColor, vec4(1.0/2.2));
}
