/*
 * spotless:off
 * KubaTech - Gregtech Addon
 * Copyright (C) 2022 - 2024  kuba6000
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library. If not, see <https://www.gnu.org/licenses/>.
 * spotless:on
 */

package kubatech;

import static kubatech.api.enums.ItemList.LegendaryRedTea;

import java.util.List;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
import cpw.mods.fml.common.event.FMLMissingMappingsEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerAboutToStartEvent;
import cpw.mods.fml.common.event.FMLServerStartedEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import cpw.mods.fml.common.event.FMLServerStoppedEvent;
import cpw.mods.fml.common.event.FMLServerStoppingEvent;
import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import kubatech.api.enums.ItemList;
import kubatech.loaders.BlockLoader;
import kubatech.network.CustomTileEntityPacket;
import kubatech.network.LoadConfigPacket;

@SuppressWarnings("unused")
@Mod(
    modid = Tags.MODID,
    version = Tags.VERSION,
    name = Tags.MODNAME,
    acceptedMinecraftVersions = "[1.7.10]",
    dependencies = "required-after: gregtech; " + "required-after: gtnhmixins@[2.0.1,); "
        + "required-after: modularui; "
        + "after: mobsinfo; "
        + "after: EnderIO; "
        + "after: AWWayofTime; "
        + "after: ExtraUtilities; "
        + "after: InfernalMobs; "
        + "after: Thaumcraft; "
        + "after: MineTweaker3; "
        + "after: miscutils; "
        + "after: harvestcraft; "
        + "after: Forestry; "
        + "after: DraconicEvolution; "
        + "after: Avaritia; "
        + "after: dreamcraft; ")
public class kubatech {

    @Mod.Instance(Tags.MODID)
    public static kubatech instance;
    public static final SimpleNetworkWrapper NETWORK = new SimpleNetworkWrapper(Tags.MODID);
    public static final CreativeTabs KT = new CreativeTabs(Tags.MODID) {

        private ItemStack iconItemStack = null;

        @Override
        public ItemStack getIconItemStack() {
            if (iconItemStack == null) iconItemStack = LegendaryRedTea.get(1);
            return iconItemStack;
        }

        @Override
        public Item getTabIconItem() {
            return null;
        }

        @Override
        public String getTranslatedTabLabel() {
            return Tags.MODNAME;
        }

        @SuppressWarnings({ "unchecked", "rawtypes" })
        @Override
        public void displayAllReleventItems(List p_78018_1_) {
            super.displayAllReleventItems(p_78018_1_);
            if (ItemList.ExtremeEntityCrusher.hasBeenSet()) p_78018_1_.add(ItemList.ExtremeEntityCrusher.get(1));
            if (ItemList.ExtremeIndustrialApiary.hasBeenSet()) p_78018_1_.add(ItemList.ExtremeIndustrialApiary.get(1));
            if (ItemList.ExtremeIndustrialGreenhouse.hasBeenSet())
                p_78018_1_.add(ItemList.ExtremeIndustrialGreenhouse.get(1));
            if (ItemList.DraconicEvolutionFusionCrafter.hasBeenSet())
                p_78018_1_.add(ItemList.DraconicEvolutionFusionCrafter.get(1));
        }
    };

    static {
        NETWORK.registerMessage(new LoadConfigPacket.Handler(), LoadConfigPacket.class, 0, Side.CLIENT);
        NETWORK.registerMessage(new CustomTileEntityPacket.Handler(), CustomTileEntityPacket.class, 1, Side.CLIENT);
    }

    private static final Logger LOG = LogManager.getLogger(Tags.MODID);

    @SidedProxy(clientSide = Tags.MODID + ".ClientProxy", serverSide = Tags.MODID + ".CommonProxy")
    public static CommonProxy proxy;

    @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        proxy.preInit(event);
    }

    @Mod.EventHandler
    public void init(FMLInitializationEvent event) {
        proxy.init(event);
    }

    @Mod.EventHandler
    public void postInit(FMLPostInitializationEvent event) {
        proxy.postInit(event);
    }

    @Mod.EventHandler
    public void serverAboutToStart(FMLServerAboutToStartEvent event) {
        proxy.serverAboutToStart(event);
    }

    @Mod.EventHandler
    public void serverStarting(FMLServerStartingEvent event) {
        proxy.serverStarting(event);
    }

    @Mod.EventHandler
    public void serverStarted(FMLServerStartedEvent event) {
        proxy.serverStarted(event);
    }

    @Mod.EventHandler
    public void serverStopping(FMLServerStoppingEvent event) {
        proxy.serverStopping(event);
    }

    @Mod.EventHandler
    public void serverStopped(FMLServerStoppedEvent event) {
        proxy.serverStopped(event);
    }

    @Mod.EventHandler
    public void loadComplete(FMLLoadCompleteEvent event) {
        proxy.loadComplete(event);
    }

    @Mod.EventHandler
    public void missingMappings(FMLMissingMappingsEvent event) {
        for (FMLMissingMappingsEvent.MissingMapping missingMapping : event.getAll()) {
            if (missingMapping.name.equals("EMT:EMT_GTBLOCK_CASEING")) {
                if (missingMapping.type == GameRegistry.Type.BLOCK) missingMapping.remap(BlockLoader.defcCasingBlock);
                else missingMapping.remap(Item.getItemFromBlock(BlockLoader.defcCasingBlock));
            }
        }
    }

    public static void debug(String message) {
        LOG.debug(message);
    }

    public static void info(String message) {
        LOG.info(message);
    }

    public static void warn(String message) {
        LOG.warn(message);
    }

    public static void error(String message) {
        LOG.error(message);
    }
}