package gtPlusPlus.everglades;

import static gregtech.api.enums.Mods.GTPlusPlusEverglades;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.config.Configuration;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
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.registry.GameRegistry;
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion;
import gregtech.api.enums.Mods;
import gtPlusPlus.api.objects.Logger;
import gtPlusPlus.core.lib.CORE;
import gtPlusPlus.core.lib.CORE.Everglades;
import gtPlusPlus.core.material.MaterialGenerator;
import gtPlusPlus.core.material.ORES;
import gtPlusPlus.everglades.biome.Biome_Everglades;
import gtPlusPlus.everglades.block.DarkWorldContentLoader;
import gtPlusPlus.everglades.dimension.Dimension_Everglades;
import gtPlusPlus.everglades.gen.gt.WorldGen_GT_Base;
import gtPlusPlus.everglades.gen.gt.WorldGen_Ores;
import gtPlusPlus.preloader.CORE_Preloader;
import gtPlusPlus.xmod.gregtech.HANDLER_GT;
import gtPlusPlus.xmod.gregtech.api.util.GTPP_Config;

@MCVersion(value = "1.7.10")
@Mod(
        modid = Mods.Names.G_T_PLUS_PLUS_EVERGLADES,
        name = Everglades.NAME,
        version = Everglades.VERSION,
        dependencies = "required-after:Forge; after:dreamcraft; after:IC2; required-after:gregtech; required-after:miscutils;")
public class GTplusplus_Everglades implements ActionListener {

    // Mod Instance
    @Mod.Instance(Mods.Names.G_T_PLUS_PLUS_EVERGLADES)
    public static GTplusplus_Everglades instance;

    // Dark World Handler
    protected static volatile Biome_Everglades Everglades_Biome;
    protected static volatile Dimension_Everglades Everglades_Dimension;
    public static int globalEvergladesPortalSpawnTimer = 0;

    // Pre-Init
    @Mod.EventHandler
    public void preInit(final FMLPreInitializationEvent event) {
        Logger.INFO("Loading " + GTPlusPlusEverglades.ID + " V" + Everglades.VERSION);

        // Setup
        setVars(event);

        setEvergladesBiome(new Biome_Everglades());
        Everglades_Dimension = new Dimension_Everglades();

        // Load Dark World
        getEvergladesBiome().instance = instance;
        Everglades_Dimension.instance = instance;
        getEvergladesBiome().preInit(event);

        // Load/Set Custom Ore Gen
        HANDLER_GT.sCustomWorldgenFile = new GTPP_Config(
                new Configuration(
                        new File(new File(event.getModConfigurationDirectory(), "GTplusplus"), "WorldGeneration.cfg")));
    }

    @EventHandler
    public void load(final FMLInitializationEvent e) {
        Logger.INFO("Begin resource allocation for " + GTPlusPlusEverglades.ID + " V" + Everglades.VERSION);

        // Load World and Biome
        GameRegistry.registerWorldGenerator(new WorldGen_GT_Base(), Short.MAX_VALUE);
        getEvergladesBiome().load();
        Everglades_Dimension.load();
    }

    public static synchronized void GenerateOreMaterials() {
        MaterialGenerator.generateOreMaterial(ORES.CROCROITE);
        MaterialGenerator.generateOreMaterial(ORES.GEIKIELITE);
        MaterialGenerator.generateOreMaterial(ORES.NICHROMITE);
        MaterialGenerator.generateOreMaterial(ORES.TITANITE);
        MaterialGenerator.generateOreMaterial(ORES.ZIMBABWEITE);
        MaterialGenerator.generateOreMaterial(ORES.ZIRCONILITE);
        MaterialGenerator.generateOreMaterial(ORES.GADOLINITE_CE);
        MaterialGenerator.generateOreMaterial(ORES.GADOLINITE_Y);
        MaterialGenerator.generateOreMaterial(ORES.LEPERSONNITE);
        MaterialGenerator.generateOreMaterial(ORES.SAMARSKITE_Y);
        MaterialGenerator.generateOreMaterial(ORES.SAMARSKITE_YB);
        MaterialGenerator.generateOreMaterial(ORES.XENOTIME);
        MaterialGenerator.generateOreMaterial(ORES.YTTRIAITE);
        MaterialGenerator.generateOreMaterial(ORES.YTTRIALITE);
        MaterialGenerator.generateOreMaterial(ORES.YTTROCERITE);
        MaterialGenerator.generateOreMaterial(ORES.ZIRCON);
        MaterialGenerator.generateOreMaterial(ORES.POLYCRASE);
        MaterialGenerator.generateOreMaterial(ORES.ZIRCOPHYLLITE);
        MaterialGenerator.generateOreMaterial(ORES.ZIRKELITE);
        MaterialGenerator.generateOreMaterial(ORES.LANTHANITE_LA);
        MaterialGenerator.generateOreMaterial(ORES.LANTHANITE_CE);
        MaterialGenerator.generateOreMaterial(ORES.LANTHANITE_ND);
        MaterialGenerator.generateOreMaterial(ORES.AGARDITE_Y);
        MaterialGenerator.generateOreMaterial(ORES.AGARDITE_CD);
        MaterialGenerator.generateOreMaterial(ORES.AGARDITE_LA);
        MaterialGenerator.generateOreMaterial(ORES.AGARDITE_ND);
        MaterialGenerator.generateOreMaterial(ORES.HIBONITE);
        MaterialGenerator.generateOreMaterial(ORES.CERITE);
        MaterialGenerator.generateOreMaterial(ORES.FLUORCAPHITE);
        MaterialGenerator.generateOreMaterial(ORES.FLORENCITE);
        MaterialGenerator.generateOreMaterial(ORES.CRYOLITE);

        MaterialGenerator.generateOreMaterial(ORES.LAUTARITE);
        MaterialGenerator.generateOreMaterial(ORES.LAFOSSAITE);
        MaterialGenerator.generateOreMaterial(ORES.DEMICHELEITE_BR);
        MaterialGenerator.generateOreMaterial(ORES.COMANCHEITE);
        MaterialGenerator.generateOreMaterial(ORES.PERROUDITE);
        MaterialGenerator.generateOreMaterial(ORES.HONEAITE);
        MaterialGenerator.generateOreMaterial(ORES.ALBURNITE);
        MaterialGenerator.generateOreMaterial(ORES.MIESSIITE);
        MaterialGenerator.generateOreMaterial(ORES.KASHINITE);
        MaterialGenerator.generateOreMaterial(ORES.IRARSITE);
        MaterialGenerator.generateOreMaterial(ORES.GREENOCKITE);
        MaterialGenerator.generateOreMaterial(ORES.RADIOBARITE);
        MaterialGenerator.generateOreMaterial(ORES.DEEP_EARTH_REACTOR_FUEL_DEPOSIT);

    }

    protected synchronized void setVars(FMLPreInitializationEvent event) {
        // Init WorldGen config.
        HANDLER_GT.sCustomWorldgenFile = new GTPP_Config(
                new Configuration(
                        new File(new File(event.getModConfigurationDirectory(), "GTplusplus"), "WorldGeneration.cfg")));

        if (DimensionManager.isDimensionRegistered(Dimension_Everglades.DIMID)) {
            Dimension_Everglades.DIMID = DimensionManager.getNextFreeDimId();
        }

        /*
         * Set World Generation Values
         */
        WorldGen_Ores.generateValidOreVeins();
        WorldGen_GT_Base.oreveinPercentage = 64;
        WorldGen_GT_Base.oreveinAttempts = 16;
        WorldGen_GT_Base.oreveinMaxPlacementAttempts = 4;
        if (CORE_Preloader.DEBUG_MODE || CORE.DEVENV) {
            WorldGen_GT_Base.debugWorldGen = true;
        }
        DarkWorldContentLoader.run();
    }

    @EventHandler
    public void serverLoad(FMLServerStartingEvent event) {
        getEvergladesBiome().serverLoad(event);
    }

    /*
     * @Override public int getBurnTime(ItemStack fuel) { if (DarkWorld_Biome.addFuel(fuel) != 0) return
     * DarkWorld_Biome.addFuel(fuel); if (DarkWorld_Dimension.addFuel(fuel) != 0) return
     * DarkWorld_Dimension.addFuel(fuel); return 0; }
     */

    /*
     * @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator,
     * IChunkProvider chunkProvider) { chunkX = chunkX * 16; chunkZ = chunkZ * 16; if (world.provider.dimensionId ==
     * Dimension_DarkWorld.DIMID) { DarkWorld_Biome.generateSurface(world, random, chunkX, chunkZ); } //What does this
     * even do? if (world.provider.dimensionId == -1) { DarkWorld_Biome.generateNether(world, random, chunkX, chunkZ); }
     * if (world.provider.dimensionId == 0) { DarkWorld_Biome.generateSurface(world, random, chunkX, chunkZ); } }
     */

    @EventHandler
    public static void postInit(final FMLPostInitializationEvent e) {
        Logger.INFO("Finished loading Everglades plugin for GT++.");
    }

    public static synchronized Biome_Everglades getEvergladesBiome() {
        return Everglades_Biome;
    }

    public static synchronized void setEvergladesBiome(Biome_Everglades darkWorld_Biome) {
        Everglades_Biome = darkWorld_Biome;
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }
}