package net.minecraft.src;

import java.util.*;

public class mod_PCmachines extends BaseMod{

	public static List<Integer> roasterIgnoreBlockIDs;
	private static boolean dispenseBuckets = true, dispenseWheat = true, dispenseFood = false;
	
	private static final String pk_harvester = "id.block.harvester";
	private static final String pk_builder = "id.block.builder";
	private static final String pk_roaster = "id.block.roaster";
	private static final String pk_laser = "id.block.laser";
	private static final String pk_xpbank = "id.block.XP_bank";
	private static final String pk_optical = "id.block.optical";
	private static final String pk_imirror = "id.item.mirror";
	private static final String pk_iprism = "id.item.prism";
	private static final String pk_doNotSmelt = "list.roaster.ignored_blocks";
	private static final String pk_dispenseBuckets = "opt.dispenser.throw_buckets";
	private static final String pk_dispenseWheat = "opt.dispenser.throw_wheat";
	private static final String pk_dispenseFood = "opt.dispenser.throw_all_food";

	/**
	 * Configuration file
	 */
	public static PCMP conf = new PCMP("/config/PC_MACHINES.properties","PowerCraft machines plugin - setup file\n");

	/**
	 * Get images directory (ending with slash)
	 * @return the directory
	 */
	public static String getImgDir() {
		return "/PowerCraft/machines/";
	}


	/**
	 * Get terrain file path (png)
	 * @return the file path
	 */
	public static String getTerrainFile() {
		return getImgDir() + "tiles.png";
	}

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


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

	static {

		conf.put(pk_harvester, 221, PCMPType.BLOCK);
		conf.put(pk_builder, 222, PCMPType.BLOCK);
		conf.put(pk_roaster, 228, PCMPType.BLOCK);
		conf.put(pk_laser, 230, PCMPType.BLOCK);
		conf.put(pk_xpbank, 231, PCMPType.BLOCK);
		conf.put(pk_optical, 234, PCMPType.BLOCK);
		conf.put(pk_imirror, 19005, PCMPType.ITEM);
		conf.put(pk_iprism, 19006, PCMPType.ITEM);
		conf.put(pk_doNotSmelt, "1", PCMPType.STRING);
		
		conf.put(pk_dispenseBuckets, true, PCMPType.BOOL);
		conf.put(pk_dispenseWheat, true, PCMPType.BOOL);
		conf.put(pk_dispenseFood, false, PCMPType.BOOL);

		conf.apply();

		roasterIgnoreBlockIDs = PCco_Utils.parseIntList(conf.getString(pk_doNotSmelt));
		
		dispenseBuckets = conf.getBool(pk_dispenseBuckets);
		dispenseWheat = conf.getBool(pk_dispenseWheat);
		dispenseFood = conf.getBool(pk_dispenseFood);
	}


	public mod_PCmachines() {
	}

	// laser renderer is only for the inventory item
	public static int rendererLaser = 0;
	public static int rendererXPBank = 0;


	@Override
	public void load() {
		// preload
		ModLoader.getMinecraftInstance().renderEngine.getTexture(getTerrainFile());
		ModLoader.getMinecraftInstance().renderEngine.getTexture(getImgDir() + "mirror.png");
		ModLoader.getMinecraftInstance().renderEngine.getTexture(getImgDir() + "laser.png");

		rendererLaser = ModLoader.getUniqueBlockModelID(this, true);
		rendererXPBank = ModLoader.getUniqueBlockModelID(this, true);

		// these are for particle effects mostly
		harvester.blockIndexInTexture = 109;
		builder.blockIndexInTexture = 109;
		laser.blockIndexInTexture = 16;
		roaster.blockIndexInTexture = 62;
		optical.blockIndexInTexture = 64;
		xpbank.blockIndexInTexture = 37;

		ModLoader.registerTileEntity(net.minecraft.src.PCma_TileEntityBuilder.class, "FCBlockPlacer");
		ModLoader.registerTileEntity(net.minecraft.src.PCma_TileEntityRoaster.class, "FCRoaster");
		ModLoader.registerTileEntity(net.minecraft.src.PCma_TileEntityLaser.class, "PCLaser", new PCma_TileEntityLaserRenderer());
		ModLoader.registerTileEntity(net.minecraft.src.PCma_TileEntityXPBank.class, "PCXPBank");
		ModLoader.registerTileEntity(net.minecraft.src.PCma_TileEntityOptical.class, "PCLaserMirror", new PCma_TileEntityOpticalRenderer());

		ModLoader.registerBlock(harvester);
		ModLoader.registerBlock(builder);
		ModLoader.registerBlock(roaster);
		ModLoader.registerBlock(laser);
		ModLoader.registerBlock(xpbank);
		ModLoader.registerBlock(optical);

		ModLoader.addName(harvester, "Block Harvester");
		ModLoader.addName(builder, "Block Dispenser");
		ModLoader.addName(roaster, "Roaster");
		ModLoader.addName(laser, "Laser");
		ModLoader.addName(xpbank, "Experience Storage");
		ModLoader.addName(optical, "laseropticalblock");
		ModLoader.addName(mirrorPlacer, "Mirror");
		ModLoader.addName(prismPlacer, "Prism");

		prismPlacer.setIconIndex(ModLoader.addOverride("/gui/items.png", getImgDir() + "prismicon.png"));

		ModLoader.addRecipe(
				new ItemStack(builder, 1),
				new Object[] { "G", "D",
					Character.valueOf('G'), Item.ingotGold, Character.valueOf('D'), Block.dispenser });

		ModLoader.addRecipe(
				new ItemStack(harvester, 1),
				new Object[] { "P", "D",
					Character.valueOf('P'), Item.pickaxeSteel, Character.valueOf('D'), Block.dispenser });

		ModLoader.addRecipe(
				new ItemStack(roaster, 1),
				new Object[] { "III", "IFI", "III",
					Character.valueOf('I'), Item.ingotIron, Character.valueOf('F'), Item.flintAndSteel });

		ModLoader.addRecipe(
				new ItemStack(laser, 1),
				new Object[] { " WD", " S ", "SSS",
					Character.valueOf('S'), Block.stone, Character.valueOf('W'), new ItemStack(Block.planks, 1, -1), Character.valueOf('D'), Item.diamond });

		ModLoader.addRecipe(
				new ItemStack(laser, 1),
				new Object[] { " WD", " S ", "SSS",
					Character.valueOf('S'), Block.cobblestone, Character.valueOf('W'), new ItemStack(Block.planks, 1, -1), Character.valueOf('D'), Item.diamond });

		ModLoader.addRecipe(new ItemStack(xpbank, 1),
				new Object[] { "ODO", "OGO", "O O",
					Character.valueOf('O'), Block.obsidian, Character.valueOf('D'), Block.blockDiamond, Character.valueOf('G'), Item.ghastTear });

		ModLoader.addRecipe(
				new ItemStack(mirrorPlacer, 2),
				new Object[] { "GI", " I",	Character.valueOf('G'), Block.thinGlass, Character.valueOf('I'), Item.ingotIron });


		ModLoader.addRecipe(
				new ItemStack(prismPlacer, 1),
				new Object[] { "GG", "GG", Character.valueOf('G'), Block.glass });

		// TMI
		PCco_Utils.TMI_hideId(optical.blockID);

		PCma_CropHelper.ping();
	}

	// registering blocks and items

	/** block harvester machine */
	public static Block harvester = new PCma_BlockHarvester(conf.getInt(pk_harvester)).setHardness(0.7F).setResistance(10.0F).setBlockName("PCmaHarvester")
			.setStepSound(Block.soundStoneFootstep);

	/** block placing machine */
	public static Block builder = new PCma_BlockBuilder(conf.getInt(pk_builder)).setHardness(0.7F).setResistance(10.0F).setBlockName("PCmaDispenser")
			.setStepSound(Block.soundStoneFootstep);

	/** instant furnace */
	public static Block roaster = new PCma_BlockRoaster(conf.getInt(pk_roaster)).setHardness(0.7F).setResistance(10.0F).setBlockName("PCmaRoaster")
			.setStepSound(Block.soundStoneFootstep);

	/** laser device, tileentity subtypes */
	public static PCma_BlockLaser laser = (PCma_BlockLaser) (new PCma_BlockLaser(conf.getInt(pk_laser))).setHardness(0.7F).setResistance(10.0F).setBlockName("PCmaLaserBlock")
			.setStepSound(Block.soundStoneFootstep);

	/** mirror or prism, tileentity subtypes */
	public static Block optical = new PCma_BlockOptical(conf.getInt(pk_optical)).setHardness(1.0F).setResistance(4.0F).setBlockName("PCmaLaserMirror")
			.setStepSound(Block.soundStoneFootstep);

	/** XP storage block */
	public static PCma_BlockXPBank xpbank = (PCma_BlockXPBank) (new PCma_BlockXPBank(conf.getInt(pk_xpbank))).setHardness(6.0F).setResistance(100.0F).setBlockName("PCmaXPBank")
			.setLightValue(0.5F).setStepSound(Block.soundStoneFootstep);

	/** item for placing mirrors */
	public static Item mirrorPlacer = new PCma_ItemMirrorPlacer(conf.getInt(pk_imirror)).setIconCoord(10, 2).setItemName("PCmaLaserMirrorPlacer");

	/** item for placing prisms */
	public static Item prismPlacer = new PCma_ItemPrismPlacer(conf.getInt(pk_iprism)).setIconCoord(11, 6).setItemName("PCmaLaserPrismPlacer");


	/**
	 * Dispense some items as thrown objects rather than EntityItem.
	 */
	@Override
	public boolean dispenseEntity(World world, double d, double d1, double d2, int i1, int j1, ItemStack itemstack) {
		
		if (dispenseBuckets && itemstack.itemID == Item.bucketEmpty.shiftedIndex) {
			PCma_EntityThrownBucket entity = new PCma_EntityThrownBucket(world, d, d1, d2);
			entity.setThrowableHeading(i1, 0.1D, j1, 1.1F, 6F);
			world.spawnEntityInWorld(entity);
			world.playAuxSFX(1002, (int) Math.round(d), (int) Math.round(d1), (int) Math.round(d2), 0);
			return true;
		}
		
		if (dispenseWheat && itemstack.itemID == Item.wheat.shiftedIndex) {
			PCma_EntityThrownFood entity = new PCma_EntityThrownFood(world, d, d1, d2, itemstack.getItem());
			entity.setThrowableHeading(i1, 0.1D, j1, 1.1F, 6F);
			world.spawnEntityInWorld(entity);
			world.playAuxSFX(1002, (int) Math.round(d), (int) Math.round(d1), (int) Math.round(d2), 0);
			return true;
		}

		if (dispenseFood && (itemstack.getItem() instanceof ItemFood || itemstack.getItem() == Item.bone || itemstack.getItem() != Item.fishRaw)) {
			PCma_EntityThrownFood entity = new PCma_EntityThrownFood(world, d, d1, d2, itemstack.getItem());
			entity.setThrowableHeading(i1, 0.1D, j1, 1.1F, 6F);
			world.spawnEntityInWorld(entity);
			world.playAuxSFX(1002, (int) Math.round(d), (int) Math.round(d1), (int) Math.round(d2), 0);
			return true;
		}

		return false;
	}


	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public void addRenderer(Map map) {
		map.put(PCma_EntityThrownBucket.class, new PCma_RenderThrownItem());
		map.put(PCma_EntityThrownFood.class, new PCma_RenderThrownItem());
	}


	@Override
	public boolean renderWorldBlock(RenderBlocks renderblocks, IBlockAccess iblockaccess, int i, int j, int k, Block block, int renderType) {

		if (renderType == rendererXPBank) {

			boolean gf = RenderBlocks.cfgGrassFix;
			RenderBlocks.cfgGrassFix = false;

			// XP bank inner thingy
			xpbank.rendering = true;
			mod_PCcore.instance.renderWorldBlock(renderblocks, iblockaccess, i, j, k, block, mod_PCcore.swapTerrainRenderer);
			xpbank.rendering = false;
			block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			// obsidian body
			Block.obsidian.setBlockBounds(0.0F, 0.3F, 0.0F, 1.0F, 0.7F, 1.0F);
			renderblocks.renderStandardBlock(Block.obsidian, i, j, k);

			// legs
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.0F, 0.15F, 0.3F, 0.15F);
			renderblocks.renderStandardBlock(Block.obsidian, i, j, k);
			Block.obsidian.setBlockBounds(0.85F, 0.0F, 0.0F, 1.0F, 0.3F, 0.15F);
			renderblocks.renderStandardBlock(Block.obsidian, i, j, k);
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.85F, 0.15F, 0.3F, 1.0F);
			renderblocks.renderStandardBlock(Block.obsidian, i, j, k);
			Block.obsidian.setBlockBounds(0.85F, 0.0F, 0.85F, 1.0F, 0.3F, 1.0F);
			renderblocks.renderStandardBlock(Block.obsidian, i, j, k);

			// reset
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			RenderBlocks.cfgGrassFix = gf;

			return true;
		}

		return false;
	}


	@Override
	public void renderInvBlock(RenderBlocks renderblocks, Block block, int i, int rtype) {
		/**
		 * Laser is rendered like this in inventory, but block is rendered by
		 * SpecialTileEntityRnderer
		 */
		if (rtype == rendererLaser) {
			mod_PCcore.instance.renderInvBlock(renderblocks, block, i, mod_PCcore.swapTerrainRenderer);
			block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			// cobble body
			Block.cobblestone.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.2F, 1.0F);
			PCco_Renderer.renderInvBox(renderblocks, Block.cobblestone, 0);
			Block.cobblestone.setBlockBounds(0.4F, 0.2F, 0.4F, 0.6F, 0.3F, 0.6F);
			PCco_Renderer.renderInvBox(renderblocks, Block.cobblestone, 0);
			// reset
			Block.cobblestone.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			return;
		}

		if (rtype == rendererXPBank) {
			mod_PCcore.instance.renderInvBlock(renderblocks, block, i, mod_PCcore.swapTerrainRenderer);
			block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			// obsidian body
			Block.obsidian.setBlockBounds(0.0F, 0.3F, 0.0F, 1.0F, 0.8F, 1.0F);
			PCco_Renderer.renderInvBox(renderblocks, Block.obsidian, 0);

			// legs
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.0F, 0.2F, 0.3F, 0.2F);
			PCco_Renderer.renderInvBox(renderblocks, Block.obsidian, 0);
			Block.obsidian.setBlockBounds(0.8F, 0.0F, 0.0F, 1.0F, 0.3F, 0.2F);
			PCco_Renderer.renderInvBox(renderblocks, Block.obsidian, 0);
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.8F, 0.2F, 0.3F, 1.0F);
			PCco_Renderer.renderInvBox(renderblocks, Block.obsidian, 0);
			Block.obsidian.setBlockBounds(0.8F, 0.0F, 0.8F, 1.0F, 0.3F, 1.0F);
			PCco_Renderer.renderInvBox(renderblocks, Block.obsidian, 0);

			// reset
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			return;
		}
	}

}
