package fi.dy.masa.enderutilities.event;

import java.util.List;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.event.RegistryEvent.MissingMappings.Mapping;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import fi.dy.masa.enderutilities.EnderUtilities;
import fi.dy.masa.enderutilities.reference.Reference;
import fi.dy.masa.enderutilities.util.datafixer.TileEntityID;

@Mod.EventBusSubscriber(modid = Reference.MOD_ID)
public class MissingMappingEventHandler
{
    @SubscribeEvent
    public static void onMissingMappingEventBlocks(RegistryEvent.MissingMappings<Block> event)
    {
        List<Mapping<Block>> list = event.getMappings();
        Map<String, String> renameMap = TileEntityID.getMap();

        for (Mapping<Block> mapping : list)
        {
            ResourceLocation oldLoc = mapping.key;
            String newName = renameMap.get(oldLoc.toString());

            if (newName != null)
            {
                Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(newName));

                if (block != null && block != Blocks.AIR)
                {
                    mapping.remap(block);
                    EnderUtilities.logger.info("Re-mapped block '{}' => '{}'", oldLoc, newName);
                }
            }
        }
    }

    @SubscribeEvent
    public static void onMissingMappingEventItems(RegistryEvent.MissingMappings<Item> event)
    {
        List<Mapping<Item>> list = event.getMappings();
        Map<String, String> renameMap = TileEntityID.getMap();

        for (Mapping<Item> mapping : list)
        {
            ResourceLocation oldLoc = mapping.key;
            String newName = renameMap.get(oldLoc.toString());

            if (newName != null)
            {
                Item item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(newName));

                if (item != null && item != Items.AIR)
                {
                    mapping.remap(item);
                    EnderUtilities.logger.info("Re-mapped item '{}' => '{}'", oldLoc, newName);
                }
            }
        }
    }
}