/*******************************************************************************
 * Copyright (c) 2014 Tombenpotter.
 * All rights reserved. 
 *
 * This program and the accompanying materials are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/gpl.html
 *
 * This class was made by Tombenpotter and is distributed as a part of the Electro-Magic Tools mod.
 * Electro-Magic Tools is a derivative work on Thaumcraft 4 (c) Azanor 2012.
 * http://www.minecraftforum.net/topic/1585216-
 ******************************************************************************/

package tombenpotter.emt;

import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import cpw.mods.fml.common.network.NetworkRegistry;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.common.MinecraftForge;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import tombenpotter.emt.common.commands.CommandOutputs;
import tombenpotter.emt.common.modules.ModuleRegistry;
import tombenpotter.emt.common.modules.base.entities.BaseEntityRegistry;
import tombenpotter.emt.common.util.*;
import tombenpotter.emt.proxies.CommonProxy;

import static tombenpotter.emt.common.util.TextHelper.localize;

@Mod(modid = ModInformation.modid, name = ModInformation.name, version = ModInformation.version, guiFactory = ModInformation.guiFactory, dependencies = ModInformation.depend)
public class ElectroMagicTools {


    @SidedProxy(clientSide = ModInformation.clientProxy, serverSide = ModInformation.commonProxy)
    public static CommonProxy proxy;

    public static CreativeTabs tabEMT = new CreativeTabEMT(ModInformation.modid + ".creativeTab");
    public static Logger logger = LogManager.getLogger(ModInformation.name);

    @Instance(ModInformation.modid)
    public static ElectroMagicTools instance;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        ElectroMagicTools.logger.info(localize("console.EMT.preInit.begin"));

        ConfigHandler.init(event.getSuggestedConfigurationFile());
        FMLCommonHandler.instance().bus().register(new EventHandlerEMT());
	    ModuleRegistry.registerModules();
        EssentiasOutputs.addPrimalOutputs();
        EssentiasOutputs.addOutputs();

        ElectroMagicTools.logger.info(localize("console.EMT.preInit.end"));
    }

    @EventHandler
    public void load(FMLInitializationEvent event) {
        ElectroMagicTools.logger.info(localize("console.EMT.init.begin"));

        ElectroMagicTools.logger.info(localize("console.EMT.init.loadProxies"));
        proxy.load();
        ElectroMagicTools.logger.info(localize("console.EMT.init.mobDrops"));
        MinecraftForge.EVENT_BUS.register(new EntityEventHandler());
        ElectroMagicTools.logger.info(localize("console.EMT.init.loot"));
        DungeonChestGenerator.generateLoot();

        ElectroMagicTools.logger.info(localize("console.EMT.init.entities"));
        BaseEntityRegistry.registerEMTEntities();
        ElectroMagicTools.logger.info(localize("console.EMT.init.guiHandler"));
        NetworkRegistry.INSTANCE.registerGuiHandler(this, proxy);

        ElectroMagicTools.logger.info(localize("console.EMT.init.end"));
    }

    @EventHandler
    public void postInit(FMLPostInitializationEvent event) {
        ElectroMagicTools.logger.info(localize("console.EMT.postInit.begin"));

	    ModuleRegistry.registerLateModules();
        RegistryHandler.registerIc2PostRegistrys();

        ElectroMagicTools.logger.info(localize("console.EMT.postInit.end"));
    }

    @EventHandler
    public void onFMLServerStart(FMLServerStartingEvent event) {
        event.registerServerCommand(new CommandOutputs());
    }
}