package gtclassic.common.item;

import java.awt.Color;
import java.util.LinkedHashMap;
import java.util.Map;

import gtclassic.GTMod;
import gtclassic.api.interfaces.IGTDebuggableTile;
import gtclassic.api.interfaces.IGTMultiTileStatus;
import gtclassic.api.tile.GTTileBaseMachine;
import gtclassic.api.world.GTBedrockOreHandler;
import ic2.api.classic.item.IEUReader;
import ic2.api.classic.tile.machine.IEUStorage;
import ic2.api.classic.tile.machine.IProgressMachine;
import ic2.api.energy.EnergyNet;
import ic2.api.energy.tile.IEnergySink;
import ic2.api.energy.tile.IEnergySource;
import ic2.api.item.ElectricItem;
import ic2.api.reactor.IReactor;
import ic2.api.tile.IEnergyStorage;
import ic2.core.IC2;
import ic2.core.block.crop.TileEntityCrop;
import ic2.core.block.personal.base.misc.IPersonalBlock;
import ic2.core.item.base.ItemBatteryBase;
import ic2.core.platform.registry.Ic2Sounds;
import ic2.core.platform.textures.Ic2Icons;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class GTItemCreativeScanner extends ItemBatteryBase implements IEUReader {

	public static final String POS = "pos";
	public static final String BLOCK = "block";

	public GTItemCreativeScanner() {
		super(0);
		this.setRightClick();
		setRegistryName("debug_scanner");
		setUnlocalizedName(GTMod.MODID + ".debug_scanner");
		setCreativeTab(GTMod.creativeTabGT);
		this.maxCharge = Integer.MAX_VALUE;
		this.transferLimit = Integer.MAX_VALUE;
		this.tier = 1;
		this.provider = true;
	}

	@Override
	public int getRGBDurabilityForDisplay(ItemStack stack) {
		return Color.CYAN.hashCode();
	}

	@Override
	public int getItemStackLimit(ItemStack stack) {
		return 1;
	}

	@Override
	public boolean isDamaged(ItemStack stack) {
		return true;
	}

	@Override
	public boolean showDurabilityBar(ItemStack stack) {
		return false;
	}

	@Override
	public boolean wantsToPlay(ItemStack stack) {
		return true;
	}

	@Override
	public ResourceLocation createSound(ItemStack stack) {
		return Ic2Sounds.batteryUse;
	}

	@Override
	public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items) {
		if (this.isInCreativeTab(tab)) {
			ItemStack full = new ItemStack(this, 1, 0);
			ElectricItem.manager.charge(full, 2.147483647E9D, Integer.MAX_VALUE, true, false);
			items.add(full);
		}
	}

	@Override
	@SideOnly(Side.CLIENT)
	public TextureAtlasSprite getTexture(ItemStack item) {
		return Ic2Icons.getTextures(GTMod.MODID + "_items")[31];
	}

	@Override
	public EnumRarity getRarity(ItemStack thisItem) {
		return EnumRarity.UNCOMMON;
	}

	@Override
	public EnumActionResult onItemUseFirst(EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX,
			float hitY, float hitZ, EnumHand hand) {
		return scanBlock(player, world, pos, side, hand);
	}

	@Override
	public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
		return ActionResult.newResult(EnumActionResult.FAIL, playerIn.getHeldItem(handIn));
	}

	@Override
	public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int slot, boolean selected) {
		if (ElectricItem.manager.getCharge(stack) < ElectricItem.manager.getMaxCharge(stack)) {
			ElectricItem.manager.charge(stack, 2.147483647E9D, Integer.MAX_VALUE, true, false);
		}
	}

	@Override
	public boolean isEUReader(ItemStack var1) {
		return true;
	}

	/*
	 * The logic for both the creative and survival scanners.
	 */
	@SuppressWarnings("deprecation")
	public static EnumActionResult scanBlock(EntityPlayer player, World world, BlockPos pos, EnumFacing side,
			EnumHand hand) {
		if (IC2.platform.isRendering()) {
			IC2.audioManager.playOnce(player, Ic2Sounds.scannerUse);
			return EnumActionResult.SUCCESS;
		}
		TileEntity tileEntity = world.getTileEntity(pos);
		IBlockState state = world.getBlockState(pos);
		Block block = state.getBlock();
		IC2.platform.messagePlayer(player, "-----X: " + pos.getX() + " Y: " + pos.getY() + " Z: " + pos.getZ()
				+ " -----");
		IC2.platform.messagePlayer(player, "" + state.getBlock().getLocalizedName());
		if (tileEntity == null) {
			IC2.platform.messagePlayer(player, "Hardness: " + state.getBlock().getBlockHardness(state, world, pos));
			IC2.platform.messagePlayer(player, "Blast Resistance: "
					+ state.getBlock().getExplosionResistance(null) * 5.0F);
		}
		if (tileEntity instanceof IReactor) {
			IReactor te5 = (IReactor) tileEntity;
			IC2.platform.messagePlayer(player, "Reactor Heat: " + te5.getHeat());
			IC2.platform.messagePlayer(player, "Max Heat: " + te5.getMaxHeat());
			IC2.platform.messagePlayer(player, "HEM: " + te5.getHeatEffectModifier());
			IC2.platform.messagePlayer(player, "Output: " + te5.getReactorEnergyOutput() + " EU");
		}
		if (tileEntity instanceof IPersonalBlock) {
			IPersonalBlock te6 = (IPersonalBlock) tileEntity;
			IC2.platform.messagePlayer(player, "Can Access: " + te6.canAccess(player.getUniqueID()));
		}
		if (tileEntity instanceof TileEntityCrop) {
			TileEntityCrop te7 = (TileEntityCrop) tileEntity;
			IC2.platform.messagePlayer(player, "Crop: " + te7.getCrop().getId());
			IC2.platform.messagePlayer(player, "Size: " + te7.getCurrentSize());
			IC2.platform.messagePlayer(player, "Growth: " + te7.getStatGrowth());
			IC2.platform.messagePlayer(player, "Gain: " + te7.getStatGain());
			IC2.platform.messagePlayer(player, "Resistance: " + te7.getStatResistance());
			IC2.platform.messagePlayer(player, "Nutrients: " + te7.getTerrainNutrients());
			IC2.platform.messagePlayer(player, "Water: " + te7.getTerrainHumidity());
			IC2.platform.messagePlayer(player, "Growth Points: " + te7.getGrowthPoints());
		}
		if (tileEntity instanceof IEnergySink) {
			IEnergySink euSink = (IEnergySink) tileEntity;
			IC2.platform.messagePlayer(player, "Input Tier: " + euSink.getSinkTier());
			IC2.platform.messagePlayer(player, "Input Max: " + EnergyNet.instance.getPowerFromTier(euSink.getSinkTier())
					+ " EU");
		}
		if (tileEntity instanceof GTTileBaseMachine) {
			GTTileBaseMachine machine = (GTTileBaseMachine) tileEntity;
			IC2.platform.messagePlayer(player, "Usage: " + (double) machine.defaultEnergyConsume + " EU Per Tick");
		}
		if (tileEntity instanceof IEUStorage) {
			IEUStorage euStorage = (IEUStorage) tileEntity;
			IC2.platform.messagePlayer(player, "Stored: " + euStorage.getStoredEU() + " EU");
			IC2.platform.messagePlayer(player, "Storage Max: " + euStorage.getMaxEU() + " EU");
		}
		if (tileEntity instanceof IEnergyStorage) {
			IEnergyStorage te4 = (IEnergyStorage) tileEntity;
			IC2.platform.messagePlayer(player, "Output Tier: "
					+ EnergyNet.instance.getTierFromPower(te4.getOutputEnergyUnitsPerTick()));
			IC2.platform.messagePlayer(player, "Output: " + te4.getOutputEnergyUnitsPerTick() + " EU");
		}
		if (tileEntity instanceof IEnergySource) {
			IEnergySource euSource = (IEnergySource) tileEntity;
			IC2.platform.messagePlayer(player, "Output Source Tier: " + euSource.getSourceTier());
			IC2.platform.messagePlayer(player, "Output Source Max: "
					+ EnergyNet.instance.getPowerFromTier(euSource.getSourceTier()) + " EU");
			IC2.platform.messagePlayer(player, "Output Source Actual: " + euSource.getOfferedEnergy() + " EU");
		}
		if (tileEntity instanceof IProgressMachine) {
			IProgressMachine progress = (IProgressMachine) tileEntity;
			IC2.platform.messagePlayer(player, "Progress: "
					+ +(Math.round((progress.getProgress() / progress.getMaxProgress()) * 100)) + "%");
		}
		if (GTBedrockOreHandler.isBedrockOre(block)) {
			ItemStack resource = GTBedrockOreHandler.getResource(block);
			String amount = resource.getCount() > 1 ? " x " + resource.getCount() : "";
			IC2.platform.messagePlayer(player, "Contains: " + GTBedrockOreHandler.getResource(block).getDisplayName()
					+ amount);
		}
		if (tileEntity instanceof IGTMultiTileStatus) {
			IGTMultiTileStatus multi = (IGTMultiTileStatus) tileEntity;
			IC2.platform.messagePlayer(player, "Correct Strucuture: " + multi.getStructureValid());
		}
		if (tileEntity instanceof IGTDebuggableTile) {
			LinkedHashMap<String, Boolean> data = new LinkedHashMap<>();
			IGTDebuggableTile debug = (IGTDebuggableTile) tileEntity;
			debug.getData(data);
			for (Map.Entry<String, Boolean> entry : data.entrySet()) {
				IC2.platform.messagePlayer(player, entry.getKey());
			}
		}
		return EnumActionResult.SUCCESS;
	}
}