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

/* DRAWBUFFERS:673 */

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

#define BOAT_LEAK_FIX

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

uniform float wetnessCustom;
uniform vec4 entityColor;

uniform float bloomThreshold;
uniform float bloomStrength;
uniform float frameTimeCounter;

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

in vec2 lightmap;

in vec3 flatNormal;

flat in int materialIDs;

#include "/lib/Surface/ManualTBN.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 ENTITY_STATUS_COLOR
        albedo.rgb = mix(albedo.rgb, entityColor.rgb, entityColor.a);
    #endif

    if (materialIDs == 12) albedo = vec4(0.6, 0.5, 1.0, 1.0);

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

    mat3 tbnMatrix = manualTBN(viewPos.xyz, texcoord);

    if (albedo.a < 0.1
    #ifdef BOAT_LEAK_FIX
        && materialIDs != 14
    #endif
    ) { discard; return; }

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

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

    // ─────────────── Металлические предметы и броня в руках других игроков ───────────────
    // Примітка: entityId - 10000 = materialIDs, тому 15010 -> 5010
    bool isIron      = (materialIDs == 5010);
    bool isCopper    = (materialIDs == 5011);
    bool isGold      = (materialIDs == 5012);
    bool isDiamond   = (materialIDs == 5013);
    bool isNetherite = (materialIDs == 5014);
    bool isChainmail = (materialIDs == 5015);
    
    bool isMetal = isIron || isCopper || isGold || isDiamond || isNetherite || isChainmail;

    if (isMetal) {
        float smoothness, metalness, fresnelStrength;
        vec3 metalTint = vec3(1.0);
        vec3 fresnelColor = vec3(0.15, 0.18, 0.25);
        float fresnelPower = 2.5;

        // === НАЛАШТУВАННЯ ДЛЯ КОЖНОГО МЕТАЛУ ===
        if (isIron) {
            // Залізо - матове сіре відображення
            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 (isCopper) {
            // Мідь - тепле оранжево-червоне відображення
            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 (isGold) {
            // Золото - яскраве жовте відображення
            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 (isDiamond) {
            // Алмаз - дуже яскраве біло-блакитне відображення
            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 (isNetherite) {
            // Незерит - темне фіолетово-сіре відображення
            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;
            
        } else if (isChainmail) {
            // Кольчуга - середнє сіре відображення
            smoothness = 0.60;
            metalness = 0.90;
            fresnelStrength = 0.85;
            metalTint = vec3(0.82, 0.85, 0.90);
            fresnelColor = vec3(0.10, 0.12, 0.18);
            fresnelPower = 3.2;
        }

        // Застосовуємо 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 NoV = clamp(dot(tbnMatrix[2], viewDir), 0.0, 1.0);
        float fresnel = pow(1.0 - NoV, fresnelPower);

        // Додаємо відблиск
        albedo.rgb += fresnel * fresnelColor * fresnelStrength;
        
        // Додаємо легкий спекулярний блиск на краях
        float edgeHighlight = pow(1.0 - NoV, 4.0);
        albedo.rgb += edgeHighlight * vec3(0.08, 0.10, 0.15) * smoothness;
    }
    // ──────────────────────────────────────────────────────────────


    // ─────────────── Свечение глаз мобов ───────────────
    bool isEnderman = (materialIDs == 10040);
    bool isZombie   = (materialIDs == 10043);
    bool isDrowned  = (materialIDs == 10042);

    if (isEnderman || isZombie || isDrowned) {
        // Делаем базовый цвет почти чёрным (кроме глаз)
        albedo.rgb *= 0.06;

        vec3 glowColor = vec3(0.0);

        if (isEnderman) {
            glowColor = vec3(0.9, 0.4, 1.0);     // насыщенный фиолетовый
        }
        else if (isZombie) {
            glowColor = vec3(0.9, 0.95, 1.0);    // почти белый, слегка голубоватый
        }
        else if (isDrowned) {
            glowColor = vec3(0.45, 0.9, 1.0);    // яркий голубой/бирюзовый
        }

        // Самый простой способ — пульсирующее свечение
        float pulse = 0.82 + sin(frameTimeCounter * 2.8) * 0.18;

        // Можно усилить свечение в темноте
        float darknessBoost = 1.0 - lightmap.y * 1.4;
        darknessBoost = clamp(darknessBoost, 0.0, 1.0);

        vec3 finalGlow = glowColor * (pulse + darknessBoost * 0.7);

        emissiveOut += finalGlow * 1.8;  // ← основное свечение идёт в emissive
        albedo.rgb += finalGlow * 0.35;  // небольшой вклад в обычный цвет (чтобы глаза не были чисто emissive)
    }
    // ───────────────────────────────────────────────────


    #if defined IS_OVERWORLD
        if (wetnessCustom > 1e-2 && materialIDs != 12 && !isMetal) {  // металлы обычно не мокнут так сильно
            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

            specularData.r = mix(specularData.r, 0.95, wetFact * 0.7);
            specularData.g = max(specularData.g, 0.04 * wetFact);

            vec3 wetAlbedo = ColorSaturation(albedo.rgb, 0.70) * 0.82;
            albedo.rgb = mix(albedo.rgb, wetAlbedo, wetFact);
        }
    #endif

    // Остальные куски кода без изменений
    #if TEXTURE_FORMAT == 0 && defined MC_SPECULAR_MAP
        if (materialIDs == 13) {
            specularData.rg = vec2(1.0, 0.04); 
            #if SUBSERFACE_SCATTERING_MODE == 1
                specularData.b = max(0.65, specularData.b);
            #elif SUBSERFACE_SCATTERING_MODE == 0
                specularData.b = 0.65;
            #endif
        }
    #elif SUBSERFACE_SCATTERING_MODE < 2
        specularData.a = 0.0;
        if (materialIDs == 13) specularData = vec4(1.0, 0.04, 0.0, 0.65); 
    #endif

    normalData = materialIDs == 819925 ? flatNormal : normalize(tbnMatrix * normalData);

    albedoData = albedo;

    colortex7Out.xy = lightmap + (bayer4(gl_FragCoord.xy) - 0.5) * rcp(255.0);
    colortex7Out.z = float(materialIDs + 0.1) * rcp(255.0);

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

    vec3 excess = max(albedo.rgb - vec3(bloomThreshold), vec3(0.0));
    vec3 emissive = excess * bloomStrength;

    if (materialIDs == 101) {
        float pulse = 1.0 + sin(frameTimeCounter * 60.0) * 0.25;
        emissive *= pulse;
    }

    emissiveOut = max(emissiveOut, emissive);  // суммируем с глазами, если они есть
}