import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Shit extends Obj implements java.io.Serializable {
	static final long serialVersionUID = 2L;
	
	// public variables
	public static final int SHIT_NORMAL = 0;
	public static final int SHIT_CRASHED = 1;
	public static final int SHIT_SHADOW = 2;
	public static final int NUM_OF_SHIT_STATE = 3;

	private static final int SHITLIMIT[] = {100*24*2, 100*24*4, 100*24*8};
	private Body.AgeState ageState;
	private int falldownDamage = 0;
	private int amount = 0;
	
	private static final int[] shitSize = {10, 20, 30};
	private static Image[][] images = new Image[NUM_OF_SHIT_STATE][3];
	
	public static void loadImages (ClassLoader loader) throws IOException {
		final String path = "images/";

		images[SHIT_NORMAL][Body.adultIndex] = ImageIO.read(loader.getResourceAsStream(path+"unun.png"));
		images[SHIT_CRASHED][Body.adultIndex] = ImageIO.read(loader.getResourceAsStream(path+"unun2.png"));
		images[SHIT_SHADOW][Body.adultIndex] = ImageIO.read(loader.getResourceAsStream(path+"unun-shadow.png"));
		
		for (int i=0; i < NUM_OF_SHIT_STATE; i++) {
			images[i][Body.adultIndex] = images[i][Body.adultIndex].getScaledInstance(shitSize[2], shitSize[2], Image.SCALE_AREA_AVERAGING);
			images[i][Body.childIndex] = images[i][Body.adultIndex].getScaledInstance(shitSize[1], shitSize[1], Image.SCALE_AREA_AVERAGING);
			images[i][Body.babyIndex] = images[i][Body.adultIndex].getScaledInstance(shitSize[0], shitSize[0], Image.SCALE_AREA_AVERAGING);
		}
	}
	
	public Image getImage() {
		return (images[getShitState()][ageState.ordinal()]);
	}
	
	public Image getShadowImage() {
		return (images[SHIT_SHADOW][ageState.ordinal()]);
	}
	
	public int getSize() {
		return shitSize[ageState.ordinal()];
	}

	public Shit (int initX, int initY, int initZ, Body.AgeState initAgeState) {
		objType = Type.SHIT;
		x = initX;
		y = initY;
		z = initZ;
		ageState = initAgeState;
		switch (initAgeState) {
		case BABY:
			amount = 100;
			break;
		case CHILD:
			amount = 100*2;
			break;
		case ADULT:
			amount = 100*4;
			break;
		}
		removed = false;
	}

	public Body.AgeState getAgeState() { return ageState; }

	public int getShitState() {
		if (age >= SHITLIMIT[ageState.ordinal()]/4) {
			return 1;
		}
		return 0;
	}

	public void eatShit(int eatAmount) {
		amount -= eatAmount;
		if (amount < 0) {
			amount = 0;
			removed = true;
		}
	}

	public void crushShit() {
		age += SHITLIMIT[ageState.ordinal()]/2;
	}
	
	public void strikeByDecoping() {
		int blowLevel[] = {-6, -5, -4};
		vz = blowLevel[ageState.ordinal()];
		vy = blowLevel[ageState.ordinal()]*2;
	}

	public Event clockTick()
	{
		if (removed == false) {
			//age += TICK;
			if (age >= SHITLIMIT[ageState.ordinal()]) {
				removed = true;
			}
			if (!grabbed) {
				if (vy != 0) {
					y += vy;
					if (y < 0) {
						y = 0;
						vy = 0;
					}
					else if (y > Terrarium.MAX_Y) {
						y = Terrarium.MAX_Y;
						vy = 0;
					}
				}
				if (z != 0 || vz != 0) {
					vz += 1;
					z -= vz;
					falldownDamage += vz;
					if (z <= 0) {
						if (falldownDamage > 10) {
							crushShit();
						}
						z = 0;
						vz = 0;
						vy = 0;
						falldownDamage = 0;
					}
				}
			}
			return Event.DONOTHING;
		}
		return Event.REMOVED;
	}
}
