package gtPlusPlus.xmod.gregtech.common.blocks.textures;

import gregtech.api.enums.Textures;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gtPlusPlus.xmod.gregtech.common.blocks.GregtechMetaCasingBlocks;
import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.CustomIcon;
import gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.processing.GregtechMetaTileEntity_IndustrialCentrifuge;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;

public class TexturesCentrifugeMultiblock {

	private static CustomIcon GT8_1_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE1");
	private static CustomIcon GT8_1 = new CustomIcon("iconsets/LARGECENTRIFUGE1");
	private static CustomIcon GT8_2_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE2");
	private static CustomIcon GT8_2 = new CustomIcon("iconsets/LARGECENTRIFUGE2");
	private static CustomIcon GT8_3_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE3");
	private static CustomIcon GT8_3 = new CustomIcon("iconsets/LARGECENTRIFUGE3");
	private static CustomIcon GT8_4_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE4");
	private static CustomIcon GT8_4 = new CustomIcon("iconsets/LARGECENTRIFUGE4");
	private static CustomIcon GT8_5_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE5");
	private static CustomIcon GT8_5 = new CustomIcon("iconsets/LARGECENTRIFUGE5");
	private static CustomIcon GT8_6_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE6");
	private static CustomIcon GT8_6 = new CustomIcon("iconsets/LARGECENTRIFUGE6");
	private static CustomIcon GT8_7_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE7");
	private static CustomIcon GT8_7 = new CustomIcon("iconsets/LARGECENTRIFUGE7");
	private static CustomIcon GT8_8_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE8");
	private static CustomIcon GT8_8 = new CustomIcon("iconsets/LARGECENTRIFUGE8");
	private static CustomIcon GT8_9_Active = new CustomIcon("iconsets/LARGECENTRIFUGE_ACTIVE9");
	private static CustomIcon GT8_9 = new CustomIcon("iconsets/LARGECENTRIFUGE9");

	private static CustomIcon frontFace_0 = (GT8_1);
	private static CustomIcon frontFaceActive_0 = (GT8_1_Active);
	private static CustomIcon frontFace_1 = (GT8_2);
	private static CustomIcon frontFaceActive_1 = (GT8_2_Active);
	private static CustomIcon frontFace_2 = (GT8_3);
	private static CustomIcon frontFaceActive_2 = (GT8_3_Active);
	private static CustomIcon frontFace_3 = (GT8_4);
	private static CustomIcon frontFaceActive_3 = (GT8_4_Active);
	private static CustomIcon frontFace_4 = (GT8_5);
	private static CustomIcon frontFaceActive_4 = (GT8_5_Active);
	private static CustomIcon frontFace_5 = (GT8_6);
	private static CustomIcon frontFaceActive_5 = (GT8_6_Active);
	private static CustomIcon frontFace_6 = (GT8_7);
	private static CustomIcon frontFaceActive_6 = (GT8_7_Active);
	private static CustomIcon frontFace_7 = (GT8_8);
	private static CustomIcon frontFaceActive_7 = (GT8_8_Active);
	private static CustomIcon frontFace_8 = (GT8_9);
	private static CustomIcon frontFaceActive_8 = (GT8_9_Active);

	CustomIcon[] CENTRIFUGE = new CustomIcon[]{
			frontFace_0,
			frontFace_1,
			frontFace_2,
			frontFace_3,
			frontFace_4,
			frontFace_5,
			frontFace_6,
			frontFace_7,
			frontFace_8
	};

	CustomIcon[] CENTRIFUGE_ACTIVE = new CustomIcon[]{
			frontFaceActive_0,
			frontFaceActive_1,
			frontFaceActive_2,
			frontFaceActive_3,
			frontFaceActive_4,
			frontFaceActive_5,
			frontFaceActive_6,
			frontFaceActive_7,
			frontFaceActive_8
	};

	public IIcon handleCasingsGT(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord, final int aSide, final GregtechMetaCasingBlocks thisBlock) {
		return this.handleCasingsGT58(aWorld, xCoord, yCoord, zCoord, aSide, thisBlock);
	}

	private static int isCentrifugeControllerWithSide(IBlockAccess aWorld, int aX, int aY, int aZ, int aSide) {
		TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ);
		if (!(tTileEntity instanceof IGregTechTileEntity)) return 0;
		IGregTechTileEntity tTile = (IGregTechTileEntity) tTileEntity;
		if (tTile.getMetaTileEntity() instanceof GregtechMetaTileEntity_IndustrialCentrifuge && tTile.getFrontFacing() == aSide)
			return tTile.isActive() ? 1 : 2;
		return 0;
	}

	public IIcon handleCasingsGT58(final IBlockAccess aWorld, final int xCoord, final int yCoord, final int zCoord, final int aSide, final GregtechMetaCasingBlocks thisBlock) {
		final int tMeta = aWorld.getBlockMetadata(xCoord, yCoord, zCoord);
		if (tMeta != 0) {
			return CasingTextureHandler.getIcon(aSide, tMeta);
		}
		int tInvertLeftRightMod = aSide % 2 * 2 - 1;
		switch (aSide / 2) {
			case 0:
				for (int i = -1; i < 2; i++) {
					for (int j = -1; j < 2; j++) {
						if (i == 0 && j == 0)
							continue;
						if (isCentrifugeControllerWithSide(aWorld, xCoord + j, yCoord, zCoord + i, aSide) != 0) {
							IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld.getTileEntity(xCoord + j, yCoord, zCoord + i)).getMetaTileEntity();
							return getIconByIndex(tMetaTileEntity, 4 - i * 3 - j);
						}
					}
				}
				break;
			case 1:
				for (int i = -1; i < 2; i++) {
					for (int j = -1; j < 2; j++) {
						if (i == 0 && j == 0)
							continue;
						if (isCentrifugeControllerWithSide(aWorld, xCoord + j, yCoord + i, zCoord, aSide) != 0) {
							IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld.getTileEntity(xCoord + j, yCoord + i, zCoord)).getMetaTileEntity();
							return getIconByIndex(tMetaTileEntity, 4 + i * 3 - j * tInvertLeftRightMod);
						}
					}
				}
				break;
			case 2:
				for (int i = -1; i < 2; i++) {
					for (int j = -1; j < 2; j++) {
						if (i == 0 && j == 0)
							continue;
						if (isCentrifugeControllerWithSide(aWorld, xCoord, yCoord + i, zCoord + j, aSide) != 0) {
							IMetaTileEntity tMetaTileEntity = ((IGregTechTileEntity) aWorld.getTileEntity(xCoord, yCoord + i, zCoord + j)).getMetaTileEntity();
							return getIconByIndex(tMetaTileEntity, 4 + i * 3 + j * tInvertLeftRightMod);
						}
					}
				}
				break;
		}
		return TexturesGtBlock.Casing_Material_Centrifuge.getIcon();
	}
	
	public boolean isCentrifugeRunning(IMetaTileEntity aTile) {
		if (aTile == null) {
			return false;
		}
		else {
			return aTile.getBaseMetaTileEntity().isActive();
		}
		
		
	}
	
	public boolean isUsingAnimatedTexture(IMetaTileEntity aMetaTileEntity) {
			if (aMetaTileEntity != null) {
				if (aMetaTileEntity instanceof GregtechMetaTileEntity_IndustrialCentrifuge) {
					return ((GregtechMetaTileEntity_IndustrialCentrifuge) aMetaTileEntity).usingAnimations();
				}
			}		
		return false;
	}

	public IIcon getIconByIndex(IMetaTileEntity aMetaTileEntity, int aIndex) {
		if (isUsingAnimatedTexture(aMetaTileEntity)) {
			if (isCentrifugeRunning(aMetaTileEntity)) {
				return this.CENTRIFUGE_ACTIVE[aIndex].getIcon();				
			}
		}
		return this.CENTRIFUGE[aIndex].getIcon();
	}
	
}