// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.builtin.buildertools.objimport;

import javax.annotation.Nullable;
import java.io.IOException;
import java.io.BufferedReader;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nonnull;
import java.nio.file.Path;

public final class MtlParser
{
    private MtlParser() {
    }
    
    @Nonnull
    public static Map<String, MtlMaterial> parse(@Nonnull final Path path) throws IOException {
        final Map<String, MtlMaterial> materials = new HashMap<String, MtlMaterial>();
        String currentMaterial = null;
        float[] currentKd = null;
        String currentMapKd = null;
        try (final BufferedReader reader = Files.newBufferedReader(path)) {
            String line;
            while ((line = reader.readLine()) != null) {
                line = line.trim();
                if (!line.isEmpty()) {
                    if (line.startsWith("#")) {
                        continue;
                    }
                    final String[] parts = line.split("\\s+", 2);
                    if (parts.length == 0) {
                        continue;
                    }
                    final String s = parts[0];
                    switch (s) {
                        case "newmtl": {
                            if (currentMaterial != null) {
                                materials.put(currentMaterial, new MtlMaterial(currentMaterial, currentKd, currentMapKd));
                            }
                            currentMaterial = ((parts.length > 1) ? parts[1].trim() : "");
                            currentKd = null;
                            currentMapKd = null;
                            continue;
                        }
                        case "Kd": {
                            if (parts.length > 1) {
                                currentKd = parseColor(parts[1]);
                                continue;
                            }
                            continue;
                        }
                        case "map_Kd": {
                            if (parts.length > 1) {
                                currentMapKd = parts[1].trim();
                                continue;
                            }
                            continue;
                        }
                    }
                }
            }
            if (currentMaterial != null) {
                materials.put(currentMaterial, new MtlMaterial(currentMaterial, currentKd, currentMapKd));
            }
        }
        return materials;
    }
    
    @Nullable
    private static float[] parseColor(final String colorStr) {
        final String[] parts = colorStr.trim().split("\\s+");
        if (parts.length < 3) {
            return null;
        }
        try {
            final float r = Float.parseFloat(parts[0]);
            final float g = Float.parseFloat(parts[1]);
            final float b = Float.parseFloat(parts[2]);
            return new float[] { r, g, b };
        }
        catch (final NumberFormatException e) {
            return null;
        }
    }
    
    record MtlMaterial(@Nonnull String name, @Nullable float[] diffuseColor, @Nullable String diffuseTexturePath) {
        @Nullable
        public int[] getDiffuseColorRGB() {
            if (this.diffuseColor == null) {
                return null;
            }
            return new int[] { Math.max(0, Math.min(255, Math.round(this.diffuseColor[0] * 255.0f))), Math.max(0, Math.min(255, Math.round(this.diffuseColor[1] * 255.0f))), Math.max(0, Math.min(255, Math.round(this.diffuseColor[2] * 255.0f))) };
        }
        
        @Nonnull
        public String name() {
            return this.name;
        }
        
        @Nullable
        public float[] diffuseColor() {
            return this.diffuseColor;
        }
        
        @Nullable
        public String diffuseTexturePath() {
            return this.diffuseTexturePath;
        }
    }
}
