package net.minecraft.src;

import java.io.File;
import java.util.ArrayList;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

import net.minecraft.client.Minecraft;

/**
 * PowerCraft's module.
 * 
 * @author MightyPork
 * @copy (c) 2012
 */
public abstract class PC_Module extends BaseMod {

	public static Minecraft mc;

	public static final ArrayList<String> modules = new ArrayList<String>();


	/**
	 * Global PowerCraft's logger.
	 */
	public static final Logger logger = Logger.getLogger("PowerCraft");

	public PC_Module() {
		modules.add(getModuleName());
	}

	static {
		ModLoader.getMinecraftInstance();
		try {
			FileHandler handler = new FileHandler(new File(Minecraft.getMinecraftDir(), "PowerCraft.log").getPath());
			handler.setFormatter(new PC_LogFormatter());			
			logger.addHandler(handler);
		} catch (Exception e) {
			e.printStackTrace();
		}
		logger.setLevel(Level.ALL);
		logger.info("PowerCraft logger initialized.");
	}

	@Override
	public String getVersion() {
		return mod_PCcore.VERSION;
	}

	@Override
	public final void load() {
		if (mc == null) {
			mc = ModLoader.getMinecraftInstance();
		}

		logger.fine("Loading module " + getModuleName());
		preInit();

		logger.finer("Registering tile entities.");
		registerTileEntities();

		logger.finer("Registering block model renderers.");
		registerBlockRenderers();

		logger.finer("Registering blocks.");
		registerBlocks();

		logger.finer("Adding texture overrides.");
		registerTextures();

		logger.finer("Preloading textures.");
		preloadTextures();

		logger.finer("Adding localizations.");
		addNames();

		logger.finer("Adding recipes");
		addRecipes();

		logger.fine("Module loaded.");
		logger.fine("\n");
		postInit();
	}


	@Override
	public String getPriorities() {
		return "after:mod_PCcore";
	}

	/**
	 * Do something before the initialization begins
	 */
	public abstract void preInit();

	/**
	 * Register tile entities
	 */
	public abstract void registerEntities();

	/**
	 * Register tile entities
	 */
	public abstract void registerTileEntities();

	/**
	 * Register block model renderers
	 */
	public abstract void registerBlockRenderers();

	/**
	 * Register blocks, replace ItemBlocks
	 */
	public abstract void registerBlocks();

	/**
	 * Register item and block textures, add overrides.
	 */
	public abstract void registerTextures();

	/**
	 * Preload textures.<br>
	 * Important for entities and blocks.
	 */
	public abstract void preloadTextures();

	/**
	 * Add names and localizations.
	 */
	public abstract void addNames();

	/**
	 * Add recipes
	 */
	public abstract void addRecipes();

	/**
	 * Do something when all is initialized.
	 */
	public abstract void postInit();

	/**
	 * Get unique module name. Example: MOBILE
	 * 
	 * @return the name
	 */
	public abstract String getModuleName();



}
