package gtPlusPlus.xmod.gregtech.loaders;

import gregtech.api.GregTech_API;
import gregtech.api.enums.ItemList;
import gregtech.api.util.GT_Recipe;
import gtPlusPlus.core.material.Material;
import gtPlusPlus.core.util.Utils;
import net.minecraft.item.ItemStack;

public class RecipeGen_Extruder implements Runnable{

	final Material toGenerate;

	public RecipeGen_Extruder(final Material M){
		this.toGenerate = M;
	}

	@Override
	public void run() {
		generateRecipes(this.toGenerate);
	}

	public static void generateRecipes(final Material material){

		final int tVoltageMultiplier = material.getMeltingPointK() >= 2800 ? 60 : 15;
		final ItemStack itemIngot = material.getIngot(1);
		final ItemStack plate_Single = material.getPlate(1);
		final ItemStack itemGear = material.getGear(1);

		final ItemStack shape_Plate = ItemList.Shape_Extruder_Plate.get(0);
		final ItemStack shape_Ring = ItemList.Shape_Extruder_Ring.get(0);
		final ItemStack shape_Gear = ItemList.Shape_Extruder_Gear.get(0);
		final ItemStack shape_Rod = ItemList.Shape_Extruder_Rod.get(0);
		final ItemStack shape_Bolt = ItemList.Shape_Extruder_Bolt.get(0);
		final ItemStack shape_Block = ItemList.Shape_Extruder_Block.get(0);
		final ItemStack shape_Ingot = ItemList.Shape_Extruder_Ingot.get(0);

		Utils.LOG_WARNING("Generating Extruder recipes for "+material.getLocalizedName());

		//Ingot Recipe
		if (addExtruderRecipe(
				material.getBlock(1),
				shape_Ingot,
				material.getIngot(9),
				(int) Math.max(material.getMass() * 2L * 1, 1),
				4 * material.vVoltageMultiplier)){
			Utils.LOG_WARNING("Extruder Ingot Recipe: "+material.getLocalizedName()+" - Success");
		}
		else {
			Utils.LOG_WARNING("Extruder Ingot Recipe: "+material.getLocalizedName()+" - Failed");
		}

		//Block Recipe
		if (addExtruderRecipe(
				material.getIngot(9),
				shape_Block,
				material.getBlock(1),
				(int) Math.max(material.getMass() * 2L * 1, 1),
				8 * material.vVoltageMultiplier)){
			Utils.LOG_WARNING("Extruder Block Recipe: "+material.getLocalizedName()+" - Success");
		}
		else {
			Utils.LOG_WARNING("Extruder Block Recipe: "+material.getLocalizedName()+" - Failed");
		}

		//Plate Recipe
		if (addExtruderRecipe(
				itemIngot,
				shape_Plate,
				plate_Single,
				10, 4 * tVoltageMultiplier)){
			Utils.LOG_WARNING("Extruder Plate Recipe: "+material.getLocalizedName()+" - Success");
		}
		else {
			Utils.LOG_WARNING("Extruder Plate Recipe: "+material.getLocalizedName()+" - Failed");
		}

		//Ring Recipe
		if (!material.isRadioactive){
			if (addExtruderRecipe(
					itemIngot,
					shape_Ring,
					material.getRing(4),
					(int) Math.max(material.getMass() * 2L * 1, 1),
					6 * material.vVoltageMultiplier)){
				Utils.LOG_WARNING("Extruder Ring Recipe: "+material.getLocalizedName()+" - Success");
			}
			else {
				Utils.LOG_WARNING("Extruder Ring Recipe: "+material.getLocalizedName()+" - Failed");
			}
		}


		//Gear Recipe
		if (!material.isRadioactive){
			if (addExtruderRecipe(
					material.getIngot(4),
					shape_Gear,
					itemGear,
					(int) Math.max(material.getMass() * 5L, 1),
					8 * material.vVoltageMultiplier)){
				Utils.LOG_WARNING("Extruder Gear Recipe: "+material.getLocalizedName()+" - Success");
			}
			else {
				Utils.LOG_WARNING("Extruder Gear Recipe: "+material.getLocalizedName()+" - Failed");
			}
		}


		//Rod Recipe
		if (addExtruderRecipe(
				itemIngot,
				shape_Rod,
				material.getRod(2),
				(int) Math.max(material.getMass() * 2L * 1, 1),
				6 * material.vVoltageMultiplier)){
			Utils.LOG_WARNING("Extruder Rod Recipe: "+material.getLocalizedName()+" - Success");
		}
		else {
			Utils.LOG_WARNING("Extruder Rod Recipe: "+material.getLocalizedName()+" - Failed");
		}


		//Bolt Recipe
		if (!material.isRadioactive){
			if (addExtruderRecipe(
					itemIngot,
					shape_Bolt,
					material.getBolt(8),
					(int) Math.max(material.getMass() * 2L * 1, 1),
					6 * material.vVoltageMultiplier)){
				Utils.LOG_WARNING("Extruder Bolt Recipe: "+material.getLocalizedName()+" - Success");
			}
			else {
				Utils.LOG_WARNING("Extruder Bolt Recipe: "+material.getLocalizedName()+" - Failed");
			}
		}

	}


	public static boolean addExtruderRecipe(final ItemStack aInput, final ItemStack aShape, final ItemStack aOutput, int aDuration, final int aEUt) {
		if ((aInput == null) || (aShape == null) || (aOutput == null)) {
			return false;
		}
		if ((aDuration = GregTech_API.sRecipeFile.get("extruder", aOutput, aDuration)) <= 0) {
			return false;
		}
		GT_Recipe.GT_Recipe_Map.sExtruderRecipes.addRecipe(true, new ItemStack[]{aInput, aShape}, new ItemStack[]{aOutput}, null, null, null, aDuration, aEUt, 0);
		return true;
	}



}