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

package com.hypixel.hytale.server.core.cosmetics;

import java.util.Arrays;
import org.bson.BsonArray;
import java.util.Iterator;
import org.bson.BsonValue;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import org.bson.BsonDocument;
import javax.annotation.Nonnull;
import java.util.Map;

public class PlayerSkinPart
{
    private final String id;
    private final String name;
    private String model;
    private String greyscaleTexture;
    private String gradientSet;
    private Map<String, PlayerSkinPartTexture> textures;
    private Map<String, Variant> variants;
    private boolean isDefaultAsset;
    private String[] tags;
    private HaircutType hairType;
    private boolean requiresGenericHaircut;
    @Nonnull
    private HeadAccessoryType headAccessoryType;
    
    protected PlayerSkinPart(@Nonnull final BsonDocument doc) {
        this.headAccessoryType = HeadAccessoryType.Simple;
        this.id = doc.getString("Id").getValue();
        this.name = doc.getString("Name").getValue();
        if (doc.containsKey("Model")) {
            this.model = doc.getString("Model").getValue();
        }
        if (doc.containsKey("GradientSet")) {
            this.gradientSet = doc.getString("GradientSet").getValue();
        }
        if (doc.containsKey("GreyscaleTexture")) {
            this.greyscaleTexture = doc.getString("GreyscaleTexture").getValue();
        }
        if (doc.containsKey("Variants")) {
            final BsonDocument mapping = doc.getDocument("Variants");
            this.variants = new Object2ObjectOpenHashMap<String, Variant>();
            for (final Map.Entry<String, BsonValue> set : mapping.entrySet()) {
                this.variants.put(set.getKey(), new Variant(set.getValue().asDocument()));
            }
        }
        else if (doc.containsKey("Textures")) {
            final BsonDocument mapping = doc.getDocument("Textures");
            this.textures = new Object2ObjectOpenHashMap<String, PlayerSkinPartTexture>();
            for (final Map.Entry<String, BsonValue> set : mapping.entrySet()) {
                this.textures.put(set.getKey(), new PlayerSkinPartTexture(set.getValue().asDocument()));
            }
        }
        if (doc.containsKey("IsDefaultAsset")) {
            this.isDefaultAsset = doc.getBoolean("IsDefaultAsset").getValue();
        }
        if (doc.containsKey("Tags")) {
            final BsonArray bsonArray = doc.getArray("Tags");
            this.tags = new String[bsonArray.size()];
            for (int i = 0; i < bsonArray.size(); ++i) {
                this.tags[i] = bsonArray.get(i).asString().getValue();
            }
        }
        if (doc.containsKey("HairType")) {
            this.hairType = HaircutType.valueOf(doc.getString("HairType").getValue());
        }
        if (doc.containsKey("RequiresGenericHaircut")) {
            this.requiresGenericHaircut = doc.getBoolean("RequiresGenericHaircut").getValue();
        }
        if (doc.containsKey("HeadAccessoryType")) {
            this.headAccessoryType = HeadAccessoryType.valueOf(doc.getString("HeadAccessoryType").getValue());
        }
    }
    
    public String getId() {
        return this.id;
    }
    
    public String getName() {
        return this.name;
    }
    
    public String getModel() {
        return this.model;
    }
    
    public Map<String, PlayerSkinPartTexture> getTextures() {
        return this.textures;
    }
    
    public Map<String, Variant> getVariants() {
        return this.variants;
    }
    
    public boolean isDefaultAsset() {
        return this.isDefaultAsset;
    }
    
    public String[] getTags() {
        return this.tags;
    }
    
    public HaircutType getHairType() {
        return this.hairType;
    }
    
    public boolean doesRequireGenericHaircut() {
        return this.requiresGenericHaircut;
    }
    
    @Nonnull
    public HeadAccessoryType getHeadAccessoryType() {
        return this.headAccessoryType;
    }
    
    public String getGreyscaleTexture() {
        return this.greyscaleTexture;
    }
    
    public String getGradientSet() {
        return this.gradientSet;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "PlayerSkinPart{id='" + this.id + "', name='" + this.name + "', model='" + this.model + "', greyscaleTexture='" + this.greyscaleTexture + "', gradientSet='" + this.gradientSet + "', textures=" + String.valueOf(this.textures) + ", variants=" + String.valueOf(this.variants) + ", isDefaultAsset=" + this.isDefaultAsset + ", tags=" + Arrays.toString(this.tags) + ", hairType=" + String.valueOf(this.hairType) + ", requiresGenericHaircut=" + this.requiresGenericHaircut + ", headAccessoryType=" + String.valueOf(this.headAccessoryType);
    }
    
    public static class Variant
    {
        private final String model;
        private String greyscaleTexture;
        private Map<String, PlayerSkinPartTexture> textures;
        
        protected Variant(@Nonnull final BsonDocument doc) {
            this.model = doc.getString("Model").getValue();
            if (doc.containsKey("GreyscaleTexture")) {
                this.greyscaleTexture = doc.getString("GreyscaleTexture").getValue();
            }
            if (doc.containsKey("Textures")) {
                final BsonDocument texturesDoc = doc.getDocument("Textures");
                this.textures = new Object2ObjectOpenHashMap<String, PlayerSkinPartTexture>();
                for (final Map.Entry<String, BsonValue> set : texturesDoc.entrySet()) {
                    this.textures.put(set.getKey(), new PlayerSkinPartTexture(set.getValue().asDocument()));
                }
            }
        }
        
        public String getModel() {
            return this.model;
        }
        
        public String getGreyscaleTexture() {
            return this.greyscaleTexture;
        }
        
        public Map<String, PlayerSkinPartTexture> getTextures() {
            return this.textures;
        }
        
        @Nonnull
        @Override
        public String toString() {
            return "CharacterPartVariant{model='" + this.model + "'greyscaleTexture='" + this.greyscaleTexture + "', textures=" + String.valueOf(this.textures);
        }
    }
    
    public enum HaircutType
    {
        Short, 
        Medium, 
        Long;
    }
    
    public enum HeadAccessoryType
    {
        Simple, 
        HalfCovering, 
        FullyCovering;
    }
}
