package com.jaquadro.minecraft.gardencore;

import com.jaquadro.minecraft.gardencore.api.GardenCoreAPI;
import com.jaquadro.minecraft.gardencore.core.*;
import com.jaquadro.minecraft.gardencore.core.handlers.ForgeEventHandler;
import com.jaquadro.minecraft.gardencore.core.handlers.GuiHandler;
import com.jaquadro.minecraft.gardencore.core.handlers.VanillaBonemealHandler;
import com.jaquadro.minecraft.gardencore.config.ConfigManager;
import cpw.mods.fml.common.*;
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.network.NetworkRegistry;
import net.minecraftforge.common.MinecraftForge;

import java.io.File;

@Mod(modid = GardenCore.MOD_ID, name = GardenCore.MOD_NAME, version = GardenCore.MOD_VERSION)
public class GardenCore
{
    public static final String MOD_ID = "GardenCore";
    public static final String MOD_NAME = "Garden Core";
    public static final String MOD_VERSION = "@VERSION@";
    static final String SOURCE_PATH = "com.jaquadro.minecraft.gardencore.";

    public static final ModIntegration integration = new ModIntegration();
    public static final ModBlocks blocks = new ModBlocks();
    public static final ModItems items = new ModItems();
    public static final ModRecipes recipes = new ModRecipes();

    public static ConfigManager config;

    @Mod.Instance(MOD_ID)
    public static GardenCore instance;

    @SidedProxy(clientSide = SOURCE_PATH + "core.ClientProxy", serverSide = SOURCE_PATH + "core.ServerProxy")
    public static CommonProxy proxy;

    @Mod.EventHandler
    public void preInit (FMLPreInitializationEvent event) {
        config = new ConfigManager(new File(event.getModConfigurationDirectory(), "GardenStuff/" + MOD_ID + ".cfg"));

        blocks.init();
        items.init();
    }

    @Mod.EventHandler
    public void init (FMLInitializationEvent event) {
        proxy.registerRenderers();
        NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiHandler());

        MinecraftForge.EVENT_BUS.register(new ForgeEventHandler());

        integration.init();
        GardenCoreAPI.instance().registerBonemealHandler(new VanillaBonemealHandler());
    }

    @Mod.EventHandler
    public void postInit (FMLPostInitializationEvent event) {
        proxy.postInit();
        integration.postInit();
        recipes.init();

        /*try {
            List<ModContainer> loadedMods = Loader.instance().getActiveModList();
            for (ModContainer mod : loadedMods) {
                String baseAssetPath = "assets/" + mod.getModId() + "/textures/blocks/";
                Pattern assetPattern = Pattern.compile("assets/.+/textures/blocks/.+\\.png");
                JarFile modJar;

                try {
                    modJar = new JarFile(mod.getSource());
                }
                catch (IOException e) {
                     continue;
                }

                Enumeration<JarEntry> modJarEntries = modJar.entries();
                while (modJarEntries.hasMoreElements()) {
                    JarEntry element = modJarEntries.nextElement();
                    if (element.isDirectory() || !assetPattern.matcher(element.getName()).matches())
                        continue;

                    BufferedImage image = ImageIO.read(modJar.getInputStream(element));
                    if (image.getWidth() != image.getHeight())
                        continue;

                    int xStart = 0;
                    int xStop = image.getWidth();
                    int yStart = 0;
                    int yStop = image.getHeight();

                    SearchYStart:
                    for (; yStart < yStop; yStart++, yStart++) {
                        for (int x = xStart; x < xStop; x++) {
                            if (((image.getRGB(x, yStart) >> 24) & 0xFF) != 0)
                                break SearchYStart;
                        }
                    }

                    SearchYStop:
                    for (; yStop > yStart; yStop--) {
                        for (int x = xStart; x < xStop; x++) {
                            if (((image.getRGB(x, yStop - 1) >> 24) & 0xFF) != 0)
                                break SearchYStop;
                        }
                    }

                    SearchXStart:
                    for (; xStart < xStop; xStart++) {
                        for (int y = yStart; y < yStop; y++) {
                            if (((image.getRGB(xStart, y) >> 24) & 0xFF) != 0)
                                break SearchXStart;
                        }
                    }

                    SearchXStop:
                    for (; xStop > xStart; xStop--) {
                        for (int y = yStart; y < yStop; y++) {
                            if (((image.getRGB(xStop - 1, y) >> 24) & 0xFF) != 0)
                                break SearchXStop;
                        }
                    }

                    FMLLog.info("%s area: %d,%d; %dx%d", element.getName(), xStart, yStart, xStop - xStart, yStop - yStart);
                }

            }
        }
        catch (IOException e) {
            FMLLog.severe("Error processing jars: %s", e.getMessage());
        }*/
    }
}