package org.dimdev.vanillafix.dynamicresources.mixins.client;

import gnu.trove.map.hash.TIntObjectHashMap;
import net.minecraft.client.renderer.ItemModelMesher;
import net.minecraft.client.renderer.block.model.IBakedModel;
import net.minecraft.client.renderer.block.model.ModelManager;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.ItemModelMesherForge;
import net.minecraftforge.registries.IRegistryDelegate;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;

import java.util.Map;

@Mixin(ItemModelMesherForge.class)
public class MixinItemModelMesherForge extends ItemModelMesher {
    @Shadow Map<IRegistryDelegate<Item>, TIntObjectHashMap<ModelResourceLocation>> locations;

    public MixinItemModelMesherForge(ModelManager modelManager) {
        super(modelManager);
    }

    /**
     * @reason Get the stored location for that item and meta, and get the model
     * from that location from the model manager.
     **/
    @Overwrite
    @Override
    protected IBakedModel getItemModel(Item item, int meta) {
        TIntObjectHashMap<ModelResourceLocation> map = locations.get(item.delegate);
        return map == null ? null : getModelManager().getModel(map.get(meta));
    }

    /**
     * @reason Don't get all models during init (with dynamic loading, that would
     * generate them all). Just store location instead.
     **/
    @Overwrite
    @Override
    public void register(Item item, int meta, ModelResourceLocation location) {
        IRegistryDelegate<Item> key = item.delegate;
        TIntObjectHashMap<ModelResourceLocation> locs = locations.get(key);
        if (locs == null) {
            locs = new TIntObjectHashMap<>();
            locations.put(key, locs);
        }
        locs.put(meta, location);
    }

    /**
     * @reason Disable cache rebuilding (with dynamic loading, that would generate
     * all models).
     **/
    @Overwrite
    @Override
    public void rebuildCache() {}
}