package codechicken.lib.render;

import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.resources.model.IBakedModel;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;

import java.util.LinkedList;
import java.util.List;

public class ModelRegistryHelper
{
    private static List<Pair<ModelResourceLocation, IBakedModel>> registerModels = new LinkedList<Pair<ModelResourceLocation, IBakedModel>>();

    static {
        MinecraftForge.EVENT_BUS.register(new ModelRegistryHelper());
    }

    public static void register(ModelResourceLocation location, IBakedModel model) {
        registerModels.add(new ImmutablePair<ModelResourceLocation, IBakedModel>(location, model));
    }

    public static void registerItemModel(Item item, ResourceLocation location) {
        registerItemModel(item, 0, location);
    }

    public static void registerItemModel(Item item, int meta, ResourceLocation location) {
        Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, meta, new ModelResourceLocation(location, "inventory"));
    }

    public static void registerItemMesher(Item item, ItemMeshDefinition mesher) {
        Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, mesher);
    }

    public static void registerItemRenderer(Item item, IItemRenderer renderer, ResourceLocation location) {
        final ModelResourceLocation modelLoc = new ModelResourceLocation(location, "inventory");
        register(modelLoc, renderer);
        registerItemMesher(item, new ItemMeshDefinition() {
            @Override
            public ModelResourceLocation getModelLocation(ItemStack stack) {
                return modelLoc;
            }
        });
    }

    @SubscribeEvent
    public void onModelBake(ModelBakeEvent event) {
        for(Pair<ModelResourceLocation, IBakedModel> pair : registerModels)
            event.modelRegistry.putObject(pair.getKey(), pair.getValue());
    }
}