package org.redfrog404.mobycraft.main;

import java.io.File;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemModelMesher;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
import net.minecraftforge.fml.common.registry.EntityRegistry;
import net.minecraftforge.fml.common.registry.GameRegistry;

import org.redfrog404.mobycraft.commands.common.MainCommand;
import org.redfrog404.mobycraft.dimension.DimensionRegistry;
import org.redfrog404.mobycraft.entity.EntityChaosMonkey;
import org.redfrog404.mobycraft.entity.EntityMoby;
import org.redfrog404.mobycraft.entity.RenderChaosMonkey;
import org.redfrog404.mobycraft.entity.RenderMoby;
import org.redfrog404.mobycraft.structure.GenericBlock;
import org.redfrog404.mobycraft.structure.GenericItem;

import com.google.inject.Guice;
import com.google.inject.Injector;

@Mod(modid = Mobycraft.MODID, version = Mobycraft.VERSION)
public final class Mobycraft {
	public static final String MODID = "moby";
	public static final String VERSION = "1.0-beta";

	public static Configuration config;

	public static Block docker_block;
	public static Item container_wand;
	public static Item container_essence;
	private static Injector injector;

	ItemModelMesher mesher;

	private static MainCommand commands;

	@EventHandler
	public void registerDockerCommands(FMLServerStartingEvent event) {
		event.registerServerCommand(commands);
	}

	@EventHandler
	public void init(FMLInitializationEvent event) {
		injector = Guice.createInjector(new MobycraftModule());

		// Helps render item textures
		mesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher();

		docker_block = new GenericBlock("docker_block", Material.iron, 5.0F,
				10.0F, "pickaxe", 1, Block.soundTypeMetal);
		registerBlock(docker_block, "docker_block");

		container_wand = new GenericItem("container_wand",
				CreativeTabs.tabTools).setMaxStackSize(1);
		registerItem(container_wand, "container_wand");

		container_essence = new GenericItem("container_essence",
				CreativeTabs.tabMaterials);
		registerItem(container_essence, "container_essence");

		RenderManager render = Minecraft.getMinecraft().getRenderManager();

		registerModEntity(EntityMoby.class, new RenderMoby(), "moby",
				EntityRegistry.findGlobalUniqueEntityId(), 0x24B8EB, 0x008BB8);
		registerModEntity(EntityChaosMonkey.class, new RenderChaosMonkey(),
				"chaos_monkey", EntityRegistry.findGlobalUniqueEntityId(),
				0x8E6400, 0xEAFF00);

		DimensionRegistry.mainRegistry();

		commands = injector.getInstance(MainCommand.class);
		commands.loadConfig();

		MinecraftForge.EVENT_BUS.register(commands);
		FMLCommonHandler.instance().bus().register(commands);

		GameRegistry.addRecipe(new ItemStack(container_wand), " ei", "ese",
				"se ", 'e', container_essence, 'i', Items.iron_ingot, 's',
				Items.stick);
	}

	@EventHandler
	public void preInit(FMLPreInitializationEvent event) {
		File configFile = new File(event.getModConfigurationDirectory()
				.toString() + "/mobycraft/mobycraft.txt");

		config = new Configuration(configFile);
		config.load();
		config.getString(
				"docker-cert-path",
				"files",
				"File path",
				"The directory path of your Docker certificate (set using /docker path <path>); only used if DOCKER_CERT_PATH environment variable is not set");
		config.getString(
				"docker-host",
				"files",
				"Docker host IP",
				"The IP of your Docker host (set using /docker host <host>); only used if DOCKER_HOST environment variable is not set");
		config.getString(
				"start-pos",
				"container-building",
				"0, 0, 0",
				"The position - x, y, z - to start building containers at (set using /docker start_pos)");
		config.getString(
				"poll-rate",
				"container-building",
				"2",
				"The rate in seconds at which the containers will update (set using /docker poll_rate <rate in seconds>)");
		config.save();
	}

	private void registerItem(Item item, String name) {
		GameRegistry.registerItem(item, name);
		mesher.register(item, 0, new ModelResourceLocation("moby:" + name,
				"inventory"));
	}

	private void registerBlock(Block block, String name) {
		GameRegistry.registerBlock(block, name);
		mesher.register(Item.getItemFromBlock(block), 0,
				new ModelResourceLocation("moby:" + name, "inventory"));
	}

	public void registerModEntity(Class entityClass, Render render,
			String entityName, int entityId, int foregroundColor,
			int backgroundColor) {
		EntityRegistry.registerGlobalEntityID(entityClass, entityName,
				entityId, foregroundColor, backgroundColor);
		EntityRegistry.registerModEntity(entityClass, entityName, entityId,
				this, 80, 1, false);
		RenderingRegistry.registerEntityRenderingHandler(entityClass, render);
	}

	public static MainCommand getMainCommand() {
		return commands;
	}

	public static Injector getInjector() {
		return injector;
	}
}