import java.awt.*;
import java.awt.image.ImageObserver;

public class Sprite {
	public static final int REST  = 0;
	public static final int LEFT  = 1;
	public static final int RIGHT = 2;
	public static final int UP    = 3;
	public static final int DOWN  = 4;

	private Image image = null;
	private int width = -1, height = -1;
	private int x = 0, y = 0;	
	private int state = REST;
	private int tx = 0, ty = 0;	
	protected Level level = null;

	public Sprite( Image image ) {
		this( image, 0, 0 );
	}	

	public Sprite( Image image, int x, int y ) {
		this.image = image;
		this.x = x;
		this.y = y;
	}

	protected int getState() {
		return state;
	}

	public void setPosition( int x, int y ) {
		this.x = x;
		this.y = y;
		this.tx = x;
		this.ty = y;
	}

	public void reset() {
		state = REST;
		setPosition( x, y );
	}

	public void goLeft() {
		if ( state == REST ) {
			tx = x - Level.ELEMENT_SIZE;
			if ( level.isSpace( tx, y ) )
				state = LEFT;
		}
	}

	public void goRight() {
		if ( state == REST ) {
			tx = x + Level.ELEMENT_SIZE;
			if ( level.isSpace( tx, y ) )
				state = RIGHT;
		}
	}

	public void goUp() {
		if ( state == REST ) {
			ty = y - Level.ELEMENT_SIZE;
			if ( level.isSpace( x, ty ) )
				state = UP;
		}
	}

	public void goDown() {
		if ( state == REST ) {
			ty = y + Level.ELEMENT_SIZE;
			if ( level.isSpace( x, ty ) )
				state = DOWN;
		}
	}

	private int speed = 2;

	public void tick( Level level ) {
		this.level = level;
		switch( state ) {

			case LEFT:
			if ( x == tx ) state = REST;
			else 		  x-=speed;
			break;

			case RIGHT:
			if ( x == tx ) state = REST;
			else 		  x+=speed;
			break;

			case UP:
			if ( y == ty ) state = REST;
			else 		  y-=speed;
			break;

			case DOWN:
			if ( y == ty ) state = REST;
			else 		  y+=speed;
			break;
		}
	}

	public int getX() {
		return x;
	}	

	public int getY() {
		return y;
	}

	private boolean boundsTest( Sprite sprite ) {
		int s = Level.ELEMENT_SIZE;
		return  x <= sprite.x && sprite.x < (x + s)
			&&  y <= sprite.y && sprite.y < (y + s);
	}

	public boolean isColliding( Sprite sprite ) {
		return boundsTest( sprite ) || sprite.boundsTest( this );	
	}

	public boolean onTop( Sprite sprite ) {
		return x == sprite.x && y == sprite.y;
	}

	public void paint( Graphics g, ImageObserver o ) {
		if ( width == -1 || height == -1 ) {
			width  = image.getWidth( o );
			height = image.getHeight( o );
		}
		g.drawImage( image, x, y + Level.ELEMENT_SIZE - height, o );
	}
}