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

package com.hypixel.hytale.server.core.asset.common;

import com.hypixel.hytale.codec.schema.config.StringSchema;
import com.hypixel.hytale.codec.schema.config.Schema;
import com.hypixel.hytale.codec.schema.SchemaContext;
import com.hypixel.hytale.common.util.PatternUtil;
import java.util.Arrays;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.validation.ValidationResults;
import javax.annotation.Nullable;
import com.hypixel.hytale.codec.validation.validator.ArrayValidator;
import com.hypixel.hytale.codec.validation.Validator;

public class CommonAssetValidator implements Validator<String>
{
    public static final CommonAssetValidator TEXTURE_ITEM;
    public static final CommonAssetValidator TEXTURE_CHARACTER;
    public static final CommonAssetValidator TEXTURE_CHARACTER_ATTACHMENT;
    public static final CommonAssetValidator TEXTURE_TRAIL;
    public static final CommonAssetValidator TEXTURE_SKY;
    public static final CommonAssetValidator TEXTURE_PARTICLES;
    public static final CommonAssetValidator TEXTURE_ITEM_QUALITY;
    public static final CommonAssetValidator ICON_RESOURCE;
    public static final CommonAssetValidator ICON_ITEM;
    public static final CommonAssetValidator ICON_ITEM_CATEGORIES;
    public static final CommonAssetValidator ICON_CRAFTING;
    public static final CommonAssetValidator ICON_ENTITY_STAT;
    public static final CommonAssetValidator ICON_MODEL;
    public static final CommonAssetValidator UI_RETICLE_PART;
    public static final ArrayValidator<String> UI_RETICLE_PARTS_ARRAY;
    public static final CommonAssetValidator UI_SCREEN_EFFECT;
    public static final CommonAssetValidator UI_CRAFTING_DIAGRAM;
    public static final CommonAssetValidator MODEL_ITEM;
    public static final CommonAssetValidator MODEL_CHARACTER;
    public static final CommonAssetValidator MODEL_CHARACTER_ATTACHMENT;
    public static final CommonAssetValidator PREFAB_LIST;
    public static final CommonAssetValidator BLOCK_LIST;
    public static final CommonAssetValidator ANIMATION_ITEM_CHARACTER;
    public static final CommonAssetValidator ANIMATION_ITEM_BLOCK;
    public static final CommonAssetValidator ANIMATION_CHARACTER;
    public static final CommonAssetValidator MUSIC;
    public static final CommonAssetValidator SOUNDS;
    @Nullable
    private final String[] requiredRoots;
    @Nullable
    private final String requiredExtension;
    private final boolean isUIAsset;
    
    public CommonAssetValidator(final String requiredExtension, final boolean isUIAsset, @Nullable final String... requiredRoots) {
        if (requiredRoots != null) {
            for (int i = 0; i < requiredRoots.length; ++i) {
                final String req = requiredRoots[i];
                if (!req.endsWith("/")) {
                    requiredRoots[i] = req;
                }
            }
        }
        this.requiredRoots = requiredRoots;
        this.requiredExtension = requiredExtension;
        this.isUIAsset = isUIAsset;
    }
    
    public CommonAssetValidator(final String requiredExtension, final String... requiredRoots) {
        this(requiredExtension, false, requiredRoots);
    }
    
    public CommonAssetValidator() {
        this.requiredRoots = null;
        this.requiredExtension = null;
        this.isUIAsset = true;
    }
    
    @Override
    public void accept(@Nullable String asset, @Nonnull final ValidationResults results) {
        if (asset == null) {
            return;
        }
        if (this.requiredRoots != null) {
            boolean valid = false;
            for (final String root : this.requiredRoots) {
                if (asset.startsWith(root)) {
                    valid = true;
                    break;
                }
            }
            if (!valid) {
                results.fail("Common Asset '" + asset + "' must be within the root: " + Arrays.toString(this.requiredRoots));
            }
        }
        if (this.requiredExtension != null && !asset.endsWith(this.requiredExtension)) {
            results.fail("Common Asset '" + asset + "' must have the extension " + this.requiredExtension);
        }
        asset = PatternUtil.replaceBackslashWithForwardSlash(asset);
        if (!CommonAssetRegistry.hasCommonAsset(asset)) {
            if (this.isUIAsset && asset.endsWith(".png")) {
                final String scaled2XVersionFilename = asset.substring(0, asset.lastIndexOf(".png")) + "@2x.png";
                if (!CommonAssetRegistry.hasCommonAsset(scaled2XVersionFilename)) {
                    results.fail("Common Asset '" + asset + "' doesn't exist!");
                }
            }
            else {
                results.fail("Common Asset '" + asset + "' doesn't exist!");
            }
        }
    }
    
    @Override
    public void updateSchema(final SchemaContext context, @Nonnull final Schema target) {
        ((StringSchema)target).setHytaleCommonAsset(new StringSchema.CommonAsset(this.requiredExtension, this.isUIAsset, this.requiredRoots));
    }
    
    static {
        TEXTURE_ITEM = new CommonAssetValidator("png", new String[] { "Blocks", "BlockTextures", "Items", "NPC", "Resources", "VFX" });
        TEXTURE_CHARACTER = new CommonAssetValidator("png", new String[] { "Characters", "NPC", "Items", "VFX" });
        TEXTURE_CHARACTER_ATTACHMENT = new CommonAssetValidator("png", new String[] { "Characters", "NPC", "Items", "Cosmetics", "Items", "NPC", "Resources" });
        TEXTURE_TRAIL = new CommonAssetValidator("png", new String[] { "Trails" });
        TEXTURE_SKY = new CommonAssetValidator("png", new String[] { "Sky" });
        TEXTURE_PARTICLES = new CommonAssetValidator("png", new String[] { "Particles" });
        TEXTURE_ITEM_QUALITY = new CommonAssetValidator("png", true, new String[] { "UI/ItemQualities" });
        ICON_RESOURCE = new CommonAssetValidator("png", new String[] { "Icons/ResourceTypes" });
        ICON_ITEM = new CommonAssetValidator("png", new String[] { "Icons/ItemsGenerated", "Icons/Items" });
        ICON_ITEM_CATEGORIES = new CommonAssetValidator("png", new String[] { "Icons/ItemCategories" });
        ICON_CRAFTING = new CommonAssetValidator("png", new String[] { "Icons/CraftingCategories" });
        ICON_ENTITY_STAT = new CommonAssetValidator("png", new String[] { "Icons/EntityStats" });
        ICON_MODEL = new CommonAssetValidator("png", new String[] { "Icons/ModelsGenerated", "Icons/Models" });
        UI_RETICLE_PART = new CommonAssetValidator("png", new String[] { "UI/Reticles" });
        UI_RETICLE_PARTS_ARRAY = new ArrayValidator<String>(CommonAssetValidator.UI_RETICLE_PART);
        UI_SCREEN_EFFECT = new CommonAssetValidator("png", new String[] { "ScreenEffects" });
        UI_CRAFTING_DIAGRAM = new CommonAssetValidator("svg", new String[] { "CraftingDiagrams" });
        MODEL_ITEM = new CommonAssetValidator("blockymodel", new String[] { "Blocks", "Items", "Resources", "NPC", "VFX", "Consumable" });
        MODEL_CHARACTER = new CommonAssetValidator("blockymodel", new String[] { "Characters", "NPC", "Items", "VFX" });
        MODEL_CHARACTER_ATTACHMENT = new CommonAssetValidator("blockymodel", new String[] { "Characters", "NPC", "Items", "Cosmetics", "Items", "NPC", "Resources" });
        PREFAB_LIST = new CommonAssetValidator("json", new String[] { "PrefabList" });
        BLOCK_LIST = new CommonAssetValidator("json", new String[] { "BlockTypeList" });
        ANIMATION_ITEM_CHARACTER = new CommonAssetValidator("blockyanim", new String[] { "Characters", "NPC" });
        ANIMATION_ITEM_BLOCK = new CommonAssetValidator("blockyanim", new String[] { "Blocks", "Items", "Resources", "NPC", "VFX", "Consumable" });
        ANIMATION_CHARACTER = new CommonAssetValidator("blockyanim", new String[] { "Characters", "NPC", "Equipment", "VFX", "Items" });
        MUSIC = new CommonAssetValidator("ogg", new String[] { "Music" });
        SOUNDS = new CommonAssetValidator("ogg", new String[] { "Sounds" });
    }
}
