package com.jaquadro.minecraft.gardencommon.integration.mods;

import com.jaquadro.minecraft.gardencommon.integration.IntegrationModule;
import com.jaquadro.minecraft.gardencore.api.*;
import com.jaquadro.minecraft.gardencore.api.plant.*;
import com.jaquadro.minecraft.gardencore.block.BlockGarden;
import com.jaquadro.minecraft.gardencore.block.tile.TileEntityGarden;
import com.jaquadro.minecraft.gardencore.client.renderer.plant.DoublePlantRenderer;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class Botania extends IntegrationModule
{
    public static final String MOD_ID = "Botania";

    private static Block flower1;
    private static Block flower2;

    @Override
    public String getModID () {
        return MOD_ID;
    }

    @Override
    public void init () throws Throwable {
        flower1 = GameRegistry.findBlock(MOD_ID, "doubleFlower1");
        flower2 = GameRegistry.findBlock(MOD_ID, "doubleFlower2");

        PlantRegistry plantReg = PlantRegistry.instance();

        IPlantRenderer doubleFlowerRender = new DoubleFlowerRenderer();
        plantReg.registerPlantRenderer(MOD_ID, "flower", PlantRegistry.CROSSED_SQUARES_RENDERER);
        plantReg.registerPlantRenderer(MOD_ID, "shinyFlower", PlantRegistry.CROSSED_SQUARES_RENDERER);
        plantReg.registerPlantRenderer(MOD_ID, "doubleFlower1", doubleFlowerRender);
        plantReg.registerPlantRenderer(MOD_ID, "doubleFlower2", doubleFlowerRender);

        IPlantInfo doubleFlowerInfo = new DoubleFlowerPlantInfo();
        plantReg.registerPlantInfo(MOD_ID, "doubleFlower1", doubleFlowerInfo);
        plantReg.registerPlantInfo(MOD_ID, "doubleFlower2", doubleFlowerInfo);

        GardenCoreAPI.instance().registerBonemealHandler(new BonemealHandler());

        for (int i : new int[] { 2, 3, 6, 9, 15 }) {
            plantReg.registerPlantInfo(MOD_ID, "flower", i, new SimplePlantInfo(PlantType.GROUND, PlantSize.SMALL));
            plantReg.registerPlantInfo(MOD_ID, "shinyFlower", i, new SimplePlantInfo(PlantType.GROUND, PlantSize.SMALL));
        }
        for (int i : new int[] { 4 }) {
            plantReg.registerPlantInfo(MOD_ID, "flower", i, new SimplePlantInfo(PlantType.GROUND, PlantSize.LARGE));
            plantReg.registerPlantInfo(MOD_ID, "shinyFlower", i, new SimplePlantInfo(PlantType.GROUND, PlantSize.LARGE));
        }

        plantReg.registerPlantInfo(MOD_ID, "specialFlower", new SimplePlantInfo(PlantType.INVALID, PlantSize.MEDIUM));
    }

    @Override
    public void postInit () throws Throwable {

    }

    private static class BonemealHandler implements IBonemealHandler
    {
        @Override
        public boolean applyBonemeal (World world, int x, int y, int z, BlockGarden hostBlock, int slot) {
            TileEntityGarden te = hostBlock.getTileEntity(world, x, y, z);

            Block block = hostBlock.getPlantBlockFromSlot(world, x, y, z, slot);
            int meta = hostBlock.getPlantMetaFromSlot(world, x, y, z, slot);

            Block flower = GameRegistry.findBlock(MOD_ID, "flower");

            if (block == flower) {
                ItemStack upgrade = ((meta & 0x8) == 0) ? new ItemStack(flower1, 1, meta) : new ItemStack(flower2, 1, meta & 0x7);
                if (hostBlock.isPlantValidForSlot(world, x, y, z, slot, PlantItem.getForItem(upgrade))) {
                    te.setInventorySlotContents(slot, upgrade);
                    return true;
                }
            }

            return false;
        }
    }

    private static class DoubleFlowerPlantInfo extends DefaultPlantInfo
    {
        @Override
        public int getPlantHeight (Block block, int meta) {
            if (block == flower1 || block == flower2)
                return  2;

            return 1;
        }

        @Override
        public int getPlantSectionMeta (Block block, int meta, int section) {
            if (block == flower1 || block == flower2) {
                switch (section) {
                    case 2: return meta & 0x7;
                    case 1: return meta | 0x8;
                }
            }

            return meta;
        }
    }

    private static class DoubleFlowerRenderer extends DoublePlantRenderer
    {
        @Override
        public IIcon getIcon (Block block, IBlockAccess blockAccess, int meta) {
            return block.getIcon(0, meta);
        }
    }
}