layout(location = 0) out vec4 albedoData;
layout(location = 1) out vec3 colortex7Out;
layout(location = 2) out vec4 colortex3Out;

/* DRAWBUFFERS:673 */

#include "/lib/Head/Common.inc"

uniform sampler2D tex;
#ifdef MC_NORMAL_MAP
    uniform sampler2D normals;
#endif
#ifdef MC_SPECULAR_MAP
    uniform sampler2D specular;
#endif

uniform float wetnessCustom;

in vec4 tint;
in vec2 texcoord;
in vec4 viewPos;

in vec2 lightmap;

flat in mat3 tbnMatrix;
flat in int itemId;

#include "/lib/Surface/IntegratedPBR.glsl"

float bayer2 (vec2 a) { a = 0.5 * floor(a); return fract(1.5 * fract(a.y) + a.x); }
#define bayer4(a) (bayer2(0.5 * (a)) * 0.25 + bayer2(a))

void main() {	
	vec4 albedo = texture(tex, texcoord) * tint;

	#ifdef WHITE_WORLD
		albedo.rgb = vec3(1.0);
	#endif

	if (albedo.a < 0.1) { discard; return; }

	#ifdef MC_SPECULAR_MAP
		vec4 specularData = texture(specular, texcoord);
	#else
		vec4 specularData = vec4(0.0);
	#endif

	// === APPLY INTEGRATED PBR FOR ITEMS ===
	applyIntegratedPBR(specularData, albedo.rgb, uint(itemId), albedo.rgb);

    #ifdef MC_NORMAL_MAP
        vec3 normalData = texture(normals, texcoord).rgb;
        DecodeNormalTex(normalData);
    #else
        vec3 normalData = vec3(0.0, 0.0, 1.0);
    #endif

	// === ВИЗНАЧЕННЯ ТИПІВ МЕТАЛЕВИХ ПРЕДМЕТІВ ===
	bool isIronItem     = (itemId == 15010); // Залізо
	bool isCopperItem   = (itemId == 15011); // Мідь
	bool isGoldItem     = (itemId == 15012); // Золото
	bool isDiamondItem  = (itemId == 15013); // Алмаз
	bool isNetheriteItem = (itemId == 15014); // Незерит
	
	bool isMetalItem = isIronItem || isCopperItem || isGoldItem || isDiamondItem || isNetheriteItem;

	if (isMetalItem) {
		float smoothness;
		float metalness;
		float fresnelStrength;
		vec3 metalTint = vec3(1.0);
		vec3 fresnelColor = vec3(0.15, 0.18, 0.25);
		float fresnelPower = 2.5;
		
		// === НАЛАШТУВАННЯ ДЛЯ КОЖНОГО МЕТАЛУ ===
		if (isIronItem) {
			// Залізо - матове сіре відображення
			smoothness = 0.72;
			metalness = 0.95;
			fresnelStrength = 0.95;
			metalTint = vec3(0.88, 0.92, 1.0);
			fresnelColor = vec3(0.12, 0.15, 0.22);
			fresnelPower = 2.8;
			
		} else if (isCopperItem) {
			// Мідь - тепле оранжево-червоне відображення
			smoothness = 0.45;
			metalness = 0.88;
			fresnelStrength = 0.40;
			metalTint = vec3(1.15, 0.75, 0.55);
			fresnelColor = vec3(0.25, 0.12, 0.08);
			fresnelPower = 3.0;
			
		} else if (isGoldItem) {
			// Золото - яскраве жовте відображення
			smoothness = 0.88;
			metalness = 0.98;
			fresnelStrength = 1.25;
			metalTint = vec3(1.35, 1.05, 0.45);
			fresnelColor = vec3(0.35, 0.25, 0.08);
			fresnelPower = 2.2;
			
		} else if (isDiamondItem) {
			// Алмаз - дуже яскраве біло-блакитне відображення
			smoothness = 0.95;
			metalness = 0.65;
			fresnelStrength = 1.80;
			metalTint = vec3(0.85, 0.95, 1.25);
			fresnelColor = vec3(0.35, 0.42, 0.65);
			fresnelPower = 1.8;
			
		} else if (isNetheriteItem) {
			// Незерит - темне фіолетово-сіре відображення
			smoothness = 0.80;
			metalness = 0.96;
			fresnelStrength = 1.10;
			metalTint = vec3(0.65, 0.58, 0.75);
			fresnelColor = vec3(0.18, 0.12, 0.25);
			fresnelPower = 2.6;
		}

		// Застосовуємо PBR параметри
		specularData.r = smoothness;
		specularData.g = metalness;
		specularData.b = 0.0;
		specularData.a = 0.0;
		
		// Застосовуємо металевий відтінок
		albedo.rgb = mix(albedo.rgb, albedo.rgb * metalTint, 0.50);
		albedo.rgb = pow(albedo.rgb, vec3(0.90));
		
		// Fresnel ефект для металевого відблиску
		vec3 viewDir = normalize(viewPos.xyz);
		float fresnel = pow(1.0 - abs(dot(tbnMatrix[2], viewDir)), fresnelPower);
		albedo.rgb += fresnel * fresnelColor * fresnelStrength;
		
		// Додаємо легкий спекулярний блиск на краях
		float edgeHighlight = pow(1.0 - abs(dot(tbnMatrix[2], viewDir)), 4.0);
		albedo.rgb += edgeHighlight * vec3(0.08, 0.10, 0.15) * smoothness;
	}

	#if defined IS_OVERWORLD
		if (wetnessCustom > 1e-2) {
			float wetFact = wetnessCustom;
			wetFact *= remap(0.5, 0.9, tbnMatrix[2].y);
			wetFact *= saturate(lightmap.y * 10.0 - 9.0);

			#ifdef MC_NORMAL_MAP
				normalData = mix(normalData.xyz, vec3(0.0, 0.0, 1.0), wetFact);
			#endif

			#ifdef FORCE_WET_EFFECT
				if (!isMetalItem) {
					specularData.r = mix(specularData.r, 1.0, wetFact);
					specularData.g = max(specularData.b, 0.04 * wetFact);
				}
			#endif

			vec3 wetAlbedo = ColorSaturation(albedo.rgb, 0.75) * 0.85;
			#ifdef POROSITY
				float porosity = specularData.b > 64.5 / 255.0 ? 0.0 : remap(specularData.b, 0.0, 64.0 / 255.0) * 0.7;
				wetAlbedo *= oneMinus(porosity) / oneMinus(porosity * wetAlbedo);
			#endif
			if (!isMetalItem) {
				albedo.rgb = mix(albedo.rgb, wetAlbedo, wetFact);
			}
		}
	#endif

	normalData = normalize(tbnMatrix * normalData);

	albedoData = albedo;

	colortex7Out.xy = lightmap + (bayer4(gl_FragCoord.xy) - 0.5) * rcp(255.0);
	colortex7Out.z = 4.1 / 255.0;

	colortex3Out.xy = EncodeNormal(normalData);
	colortex3Out.z = PackUnorm2x8(specularData.rg);
	colortex3Out.w = PackUnorm2x8(specularData.ba);
}