import java.awt.Rectangle;
import java.util.Random;


public class Spider extends Enemy {

	/** The time since the last frame change took place */
	private long lastFrameChange;
	/** The frame duration in milliseconds, i.e. how long any given frame of animation lasts */
	private long frameDuration = 250;
	/** The current frame of animation being displayed */
	private int frameNumber;
	/** The animation frames */
	private Sprite[] framesRight = new Sprite[4];
	private Sprite[] framesLeft = new Sprite[4];
	double previusY, previusX;
	
	private boolean lastDir;
	private boolean waiting = false;
	
	Random r = new Random();
	
	boolean left = r.nextBoolean();
	private int timeTillWaitSwitch = 0;
	private int timeBetPosSwitch = 2000;
	private int lastBite = 0;
	private int timeToBite = 1000;
	
	Game game;
	
	public Spider(Game game, int x, int y) {
		super("sprites/spider/s1.png", game, x, y, -1, -1, -1, -1);
		
		this.game = game;
		
		framesRight[0] = sprite;
		framesRight[1] = ResourceFactory.get().getSprite("sprites/spider/s2.png");
		framesRight[2] = ResourceFactory.get().getSprite("sprites/spider/s3.png");
		framesRight[3] = ResourceFactory.get().getSprite("sprites/spider/s4.png");
		
		framesLeft[0] = ResourceFactory.get().getSprite("sprites/spider/s1.png");
		framesLeft[1] = ResourceFactory.get().getSprite("sprites/spider/s2.png");
		framesLeft[2] = ResourceFactory.get().getSprite("sprites/spider/s3.png");
		framesLeft[3] = ResourceFactory.get().getSprite("sprites/spider/s4.png");
		
		for (int i = 0; i < 4; i++)
			framesLeft[i].flip();
	}

	public void collidedWith(Entity other) {
		
		if (other instanceof Player) {
			if (lastBite  > timeToBite) {
				lastBite = 0;
				Player p = ((Player) other);
				if (!p.mindControlling) {
					p.hp -= 10;
					for (int i = 0; i < 5; i++)
						game.pm.createBloodParticle((int) p.x + 35, (int) p.y + 20, 5);
				}
			}
		}
		
		if (other instanceof PlayerMindControlling) {
			if (lastBite  > timeToBite) {
				lastBite = 0;
				Player p = (Player) game.player;
//				if (!p.mindControlling) {
				p.hp -= 10;
				for (int i = 0; i < 5; i++)
					game.pm.createBloodParticle((int) other.x + 35, (int) other.y + 20, 5);
//				}
			}
		}
		
		if (other instanceof EnemyBouncer) {
			this.left = ((EnemyBouncer) other).left;
		}
		
		if (other instanceof Block || other instanceof Piston) {
//			super.dy = 0;
			
//			super.x = previusX; // TODO FIX
//			super.y = previusY;
			// Friction
//			super.dx = super.dx * Game.FRICTION;
			
			if (!customSize) {
				me.setBounds((int) x,(int) y, sprite.getWidth(), sprite.getHeight());
			} else {
				me.setBounds(rect.x, rect.y, (int) rect.getWidth(), (int) rect.getHeight());
			}
			if (!other.customSize) {
				him.setBounds((int) other.x, (int) other.y, other.sprite.getWidth(), other.sprite.getHeight());
			} else {
				him.setBounds(other.rect.x, other.rect.y, (int) other.rect.getWidth(), (int) other.rect.getHeight());
			}
			Rectangle intersection = me.intersection(him);
			
//			System.out.println("intersion h: " + intersection.)
			
			if (intersection.getHeight() > intersection.getWidth()) { // horizontal collision
				if (intersection.x == him.x) { // collision from right
					super.x -= intersection.getWidth();
				} else { // collision from left
					super.x += intersection.getWidth();
				}
			} else { // vertical collision
				if (intersection.y == him.y) { // collision from below
					super.y -= intersection.getHeight();
				} else { // collision from above
					super.y += intersection.getHeight();
				}
			}
			
			super.dx = super.dx * Game.FRICTION;
			super.dy = super.dy * Game.FRICTION;
		}
	}
	
	public void move(long delta) {
		
		lastFrameChange += delta;
		lastBite += delta;
		timeTillWaitSwitch += delta;
		
		if (timeTillWaitSwitch > timeBetPosSwitch) {
			timeTillWaitSwitch = 0;
			
			if (!waiting) {
				if (r.nextInt(7) == 1) 
					waiting = true;
			} else {
				if (r.nextInt(2) == 1)
					waiting = false;
			}
		}
		
		// Move in a direction
		if (!waiting)
			if (left) {
				dx = -100;
			} else {
				dx = 100;
			}
		else
			// Waiting
			if (Util.distBetween(x, y, game.player.x, game.player.y) < 200) {
				waiting = false;
			}
		
		if (lastFrameChange > frameDuration) {
			if (dx > 20) {
				lastFrameChange = 0;
				// update the frame
				frameNumber++;
				if (frameNumber >= framesRight.length) {
					frameNumber = 0;
				}
				sprite = framesRight[frameNumber];
				lastDir = true;
			} else if (dx < -20) {
				lastFrameChange = 0;
				// update the frame
				frameNumber++;
				if (frameNumber >= framesLeft.length) {
					frameNumber = 0;
				}
				sprite = framesLeft[frameNumber];
				lastDir = false;
			} else {
				if (lastDir) {
					sprite = framesRight[0];
				} else {
					sprite = framesLeft[0];
				}
			}
		}
		
		super.dy += Game.GRAVITY;
		
		previusY = super.y;
		previusX = super.x;
		
		super.move(delta);
	}
}
