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

package com.hypixel.hytale.server.core.modules.item;

import com.hypixel.hytale.server.core.asset.type.item.config.Item;
import java.util.Iterator;
import com.hypixel.hytale.server.core.asset.type.item.config.container.ItemDropContainer;
import java.util.Random;
import com.hypixel.hytale.logger.HytaleLogger;
import java.util.Objects;
import com.hypixel.hytale.server.core.asset.type.item.config.ItemDrop;
import java.util.concurrent.ThreadLocalRandom;
import com.hypixel.hytale.server.core.asset.type.item.config.ItemDropList;
import java.util.Collections;
import com.hypixel.hytale.server.core.inventory.ItemStack;
import javax.annotation.Nullable;
import com.hypixel.hytale.server.core.asset.type.item.config.ItemCategory;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import java.util.List;
import com.hypixel.hytale.server.core.inventory.container.EmptyItemContainer;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.server.core.inventory.container.SimpleItemContainer;
import com.hypixel.hytale.codec.lookup.Priority;
import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
import com.hypixel.hytale.server.core.command.system.AbstractCommand;
import com.hypixel.hytale.server.core.modules.item.commands.SpawnItemCommand;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
import com.hypixel.hytale.common.plugin.PluginManifest;
import com.hypixel.hytale.server.core.plugin.JavaPlugin;

public class ItemModule extends JavaPlugin
{
    public static final PluginManifest MANIFEST;
    private static ItemModule instance;
    
    public static ItemModule get() {
        return ItemModule.instance;
    }
    
    public ItemModule(@Nonnull final JavaPluginInit init) {
        super(init);
        ItemModule.instance = this;
    }
    
    @Override
    protected void setup() {
        this.getCommandRegistry().registerCommand(new SpawnItemCommand());
        ItemContainer.CODEC.register(Priority.DEFAULT, "Simple", SimpleItemContainer.class, SimpleItemContainer.CODEC);
        ItemContainer.CODEC.register("Empty", EmptyItemContainer.class, EmptyItemContainer.CODEC);
    }
    
    @Nonnull
    public List<String> getFlatItemCategoryList() {
        final List<String> ids = new ObjectArrayList<String>();
        final ItemCategory[] array;
        final ItemCategory[] itemCategories = array = ItemCategory.getAssetMap().getAssetMap().values().toArray(ItemCategory[]::new);
        for (int length = array.length, i = 0; i < length; ++i) {
            final ItemCategory category = array[i];
            final ItemCategory[] children = category.getChildren();
            if (children != null) {
                this.flattenCategories(category.getId(), children, ids);
            }
        }
        return ids;
    }
    
    private void flattenCategories(final String parent, @Nonnull final ItemCategory[] itemCategories, @Nonnull final List<String> categoryIds) {
        for (int length = itemCategories.length, i = 0; i < length; ++i) {
            final ItemCategory category = itemCategories[i];
            final String id = parent + category.getId();
            categoryIds.add(id);
            final ItemCategory[] children = category.getChildren();
            if (children != null) {
                this.flattenCategories(id, children, categoryIds);
            }
        }
    }
    
    @Nonnull
    public List<ItemStack> getRandomItemDrops(@Nullable final String dropListId) {
        if (this.isDisabled()) {
            return Collections.emptyList();
        }
        if (dropListId == null) {
            return Collections.emptyList();
        }
        final ItemDropList itemDropList = ItemDropList.getAssetMap().getAsset(dropListId);
        if (itemDropList == null || itemDropList.getContainer() == null) {
            return Collections.emptyList();
        }
        final List<ItemStack> generatedItemDrops = new ObjectArrayList<ItemStack>();
        final ThreadLocalRandom random = ThreadLocalRandom.current();
        final List<ItemDrop> configuredItemDrops = new ObjectArrayList<ItemDrop>();
        final ItemDropContainer container = itemDropList.getContainer();
        final List<ItemDrop> drops = configuredItemDrops;
        final ThreadLocalRandom obj = random;
        Objects.requireNonNull(obj);
        container.populateDrops(drops, obj::nextDouble, dropListId);
        for (final ItemDrop drop : configuredItemDrops) {
            if (drop == null || drop.getItemId() == null) {
                this.getLogger().atWarning().log("ItemModule::getRandomItemDrops - Tried to create ItemDrop for non-existent item in drop list id '%s'", dropListId);
            }
            else {
                final int amount = drop.getRandomQuantity(random);
                if (amount <= 0) {
                    continue;
                }
                generatedItemDrops.add(new ItemStack(drop.getItemId(), amount, drop.getMetadata()));
            }
        }
        return generatedItemDrops;
    }
    
    public static boolean exists(final String key) {
        return "Empty".equals(key) || "Unknown".equals(key) || Item.getAssetMap().getAsset(key) != null;
    }
    
    static {
        MANIFEST = PluginManifest.corePlugin(ItemModule.class).build();
    }
}
