package gtPlusPlus.australia;

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 gtPlusPlus.api.objects.Logger;
import gtPlusPlus.australia.biome.type.Biome_AustralianDesert_Ex;
import gtPlusPlus.australia.biome.type.Biome_AustralianForest;
import gtPlusPlus.australia.biome.type.Biome_AustralianOcean;
import gtPlusPlus.australia.biome.type.Biome_AustralianOutback;
import gtPlusPlus.australia.biome.type.Biome_AustralianPlains;
import gtPlusPlus.australia.block.AustraliaContentLoader;
import gtPlusPlus.australia.dimension.Dimension_Australia;
import gtPlusPlus.australia.gen.gt.WorldGen_Australia_Ores;
import gtPlusPlus.australia.gen.gt.WorldGen_GT_Australia_Base;
import gtPlusPlus.australia.gen.map.structure.StructureManager;
import gtPlusPlus.australia.world.AustraliaWorldGenerator;
import gtPlusPlus.core.lib.CORE;
import gtPlusPlus.core.lib.CORE.Australia;
import gtPlusPlus.preloader.CORE_Preloader;
import gtPlusPlus.xmod.gregtech.api.util.GTPP_Config;
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;

@MCVersion(value = "1.7.10")
@Mod(
        modid = Australia.MODID,
        name = Australia.NAME,
        version = Australia.VERSION,
        dependencies =
                "required-after:Forge; after:dreamcraft; after:IC2; after:ihl; required-after:gregtech; required-after:miscutils;")
public class GTplusplus_Australia implements ActionListener {

    // Mod Instance
    @Mod.Instance(Australia.MODID)
    public static GTplusplus_Australia instance;

    public static GTPP_Config sCustomWorldgenFile = null;

    // Dark World Handler
    // protected static volatile Biome_AustralianDesert Australian_Desert_Biome_1;
    // protected static volatile Biome_AustralianDesert2 Australian_Desert_Biome_2;

    public static volatile Biome_AustralianDesert_Ex Australian_Desert_Biome_3;
    public static volatile Biome_AustralianForest Australian_Forest_Biome;
    public static volatile Biome_AustralianOcean Australian_Ocean_Biome;
    public static volatile Biome_AustralianOutback Australian_Outback_Biome;
    public static volatile Biome_AustralianPlains Australian_Plains_Biome;

    public static volatile Dimension_Australia Australia_Dimension;
    public static AustraliaWorldGenerator Australia_World_Generator;
    public static int globalAustraliaPortalSpawnTimer = 0;

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

        // Setup
        setVars(event);

        Australia_Dimension = new Dimension_Australia();
        Australia_Dimension.instance = instance;

        // Australian_Desert_Biome_1 = (new Biome_AustralianDesert());
        // Australian_Desert_Biome_2 = (new Biome_AustralianDesert2());
        // Australian_Desert_Biome_1.instance = instance;
        // Australian_Desert_Biome_2.instance = instance;
        // Australian_Desert_Biome_1.preInit(event);
        // Australian_Desert_Biome_2.preInit(event);

        Australian_Desert_Biome_3 = (Biome_AustralianDesert_Ex.biome);
        Australian_Forest_Biome = (Biome_AustralianForest.biome);
        Australian_Ocean_Biome = (Biome_AustralianOcean.biome);
        Australian_Outback_Biome = (Biome_AustralianOutback.biome);
        Australian_Plains_Biome = Biome_AustralianPlains.biome;

        // Load Villages
        StructureManager.registerVillageComponents();

        setupWorldGenerator();

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

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

        // Load World and Biome
        GameRegistry.registerWorldGenerator(new WorldGen_GT_Australia_Base(), Short.MAX_VALUE);

        // Australian_Desert_Biome_1.load();
        // Australian_Desert_Biome_2.load();
        Australian_Desert_Biome_3.load();
        Australian_Forest_Biome.load();
        Australian_Ocean_Biome.load();
        Australian_Outback_Biome.load();
        Australian_Plains_Biome.load();

        Australia_Dimension.load();
    }

    public static synchronized void GenerateOreMaterials() {}

    protected synchronized void setVars(FMLPreInitializationEvent event) {

        sCustomWorldgenFile = new GTPP_Config(new Configuration(
                new File(new File(event.getModConfigurationDirectory(), "GTplusplus"), "Australia.cfg")));

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

        /*
         * Set World Generation Values
         */
        WorldGen_Australia_Ores.generateValidOreVeins();
        WorldGen_GT_Australia_Base.oreveinPercentage = 16;
        WorldGen_GT_Australia_Base.oreveinAttempts = 16;
        WorldGen_GT_Australia_Base.oreveinMaxPlacementAttempts = 2;
        if (CORE_Preloader.DEBUG_MODE || CORE.DEVENV) {
            WorldGen_GT_Australia_Base.debugWorldGen = true;
        }
        AustraliaContentLoader.run();
    }

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

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

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

    }

    private void setupWorldGenerator() {
        Logger.INFO("Registering World Generator for Australia.");
        Australia_World_Generator = new AustraliaWorldGenerator();
        GameRegistry.registerWorldGenerator(Australia_World_Generator, 0);
    }
}