#version 330 core

in vec3 normal;
in vec3 fragmentPosition;
in vec2 textureCoordinate;

flat in mat3 TBN;

uniform float shininess;

uniform vec4 ambientLight;
uniform vec3 lightPosition;
uniform vec4 lightColor;

uniform sampler2D day;
uniform sampler2D night;
uniform sampler2D clouds;
uniform sampler2D ocean;
uniform sampler2D normalMap;


float emissionStrength = 0.0;


void main() {
		// for regular-textures
		vec4 color = vec4(texture(day, textureCoordinate).rgb, 1.0);

		float nightBrightness = texture(night, textureCoordinate).r;
		vec4 nightColor = vec4(nightBrightness, nightBrightness * 0.7, nightBrightness * 0.5, 1.0);
		float shininessMultiplier = texture(ocean, textureCoordinate).r;

		vec4 cloudColor = texture(clouds, textureCoordinate).rgba;

		vec3 norm = normalize(normal);

		vec3 lightDir = normalize(lightPosition - fragmentPosition);
		vec3 eyeDir = (-normalize(fragmentPosition));

		float diff = max(dot(norm, lightDir), 0.0);

		vec3 halfway = (lightDir + eyeDir) / length(lightDir + eyeDir);
		float specular = pow(max(dot(halfway, norm), 0.0), shininess) * shininessMultiplier;


		gl_FragColor =
			// EMISSION
			color * emissionStrength +

			// // AMBIENT
			ambientLight * color +

			// DIFFUSION
			mix(nightColor * (vec4(1,1,1,1) - cloudColor) + (cloudColor * ambientLight), color + cloudColor, diff) +

			// SPECULAR
			specular * lightColor * color;
}