import java.awt.Rectangle;

public class Player extends Entity {

	Game game;
	double previusY, previusX;
	
	/** The animation frames */
	private Sprite[] framesRight = new Sprite[4];
	private Sprite[] framesLeft = new Sprite[4];
	private Sprite[] framesSpiderRight = new Sprite[4];
	private Sprite[] framesSpiderLeft = new Sprite[4];
	private Sprite[] framesSpiderAttackRight = new Sprite[4];
	private Sprite[] framesSpiderAttackLeft = new Sprite[4];
	private Sprite[] framesMindControl = new Sprite[3];
	
	/** The time since the last frame change took place */
	public 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;
	
	public int hp = 30;
	
	/** false - left **/
	private boolean lastDir = false; 
	
	public boolean mindControlling = false;
	public boolean justMindControlled = false;
	public boolean initiatingMindControl = false;
	public boolean initiatingExplode = false;
	public boolean attacking = false;
	
	/** If this intersects with a block, you can jump **/
	public Rectangle jumpSquare = new Rectangle();
	
	public Player(Game game, int x, int y) {
		super("sprites/player/p1.png", x, y, -1, 0, 50, 150, true); // 20, 0, 50, 150
		this.game = game;
		
		framesRight[0] = sprite;
		framesRight[1] = ResourceFactory.get().getSprite("sprites/player/p2.png");
		framesRight[2] = ResourceFactory.get().getSprite("sprites/player/p3.png");
		framesRight[3] = ResourceFactory.get().getSprite("sprites/player/p4.png");
		
		framesLeft[0] = ResourceFactory.get().getSprite("sprites/player/p1.png");
		framesLeft[1] = ResourceFactory.get().getSprite("sprites/player/p2.png");
		framesLeft[2] = ResourceFactory.get().getSprite("sprites/player/p3.png");
		framesLeft[3] = ResourceFactory.get().getSprite("sprites/player/p4.png");

		framesSpiderRight[0] = ResourceFactory.get().getSprite("sprites/spider/s1.png");
		framesSpiderRight[1] = ResourceFactory.get().getSprite("sprites/spider/s2.png");
		framesSpiderRight[2] = ResourceFactory.get().getSprite("sprites/spider/s3.png");
		framesSpiderRight[3] = ResourceFactory.get().getSprite("sprites/spider/s4.png");
		
		framesSpiderLeft[0] = ResourceFactory.get().getSprite("sprites/spider/s1.png");
		framesSpiderLeft[1] = ResourceFactory.get().getSprite("sprites/spider/s2.png");
		framesSpiderLeft[2] = ResourceFactory.get().getSprite("sprites/spider/s3.png");
		framesSpiderLeft[3] = ResourceFactory.get().getSprite("sprites/spider/s4.png");
		
		framesSpiderAttackRight[0] = ResourceFactory.get().getSprite("sprites/spider/a1.png");
		framesSpiderAttackRight[1] = ResourceFactory.get().getSprite("sprites/spider/a2.png");
		framesSpiderAttackRight[2] = ResourceFactory.get().getSprite("sprites/spider/a3.png");
		framesSpiderAttackRight[3] = ResourceFactory.get().getSprite("sprites/spider/a4.png");
		
		framesSpiderAttackLeft[0] = ResourceFactory.get().getSprite("sprites/spider/a1.png");
		framesSpiderAttackLeft[1] = ResourceFactory.get().getSprite("sprites/spider/a2.png");
		framesSpiderAttackLeft[2] = ResourceFactory.get().getSprite("sprites/spider/a3.png");
		framesSpiderAttackLeft[3] = ResourceFactory.get().getSprite("sprites/spider/a4.png");
		
		framesMindControl[0] = ResourceFactory.get().getSprite("sprites/player/m1.png");
		framesMindControl[1] = ResourceFactory.get().getSprite("sprites/player/m2.png");
		framesMindControl[2] = ResourceFactory.get().getSprite("sprites/player/m3.png");
		
		// Flip the left ones
		for (int i = 0; i < 4; i++) {
			framesSpiderLeft[i].flip();
			framesLeft[i].flip();
			framesSpiderAttackLeft[i].flip();
		}
		
	}

	public void collidedWith(Entity other) {
		
		if (other instanceof Block || other instanceof Piston) {
//			super.dy = 0;
			
			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;
			
		} else if (other instanceof ScreenChanger) {
			int dir = game.currentScreen - ((ScreenChanger) other).screen;
			// 1 - left, -1 - right
			if ((dir >= 1 && dx < -1) || (dir <= -1 && dx > 1)) {
				game.loadScreen(((ScreenChanger) other).screen, 
						((ScreenChanger) other).playerX, ((ScreenChanger) other).playerY);
			}
		}
	}
	
	public void move(long delta) {
		
		lastFrameChange += delta;
		
		if (hp <= 0) {
			game.notifyDeath();
		}
		
		if (mindControlling) { // ENEMY FORM
			
			if (justMindControlled) {
//				System.out.println("Just mind Controlled.");
				justMindControlled = false;
				
				Entity nearestEnemy = game.findNearestEnemy(super.x, super.y);
				// Remove enemy
				if (nearestEnemy != null) {
					// Save pos of enemy
					double enemyX = nearestEnemy.x, enemyY = nearestEnemy.y;
					game.entities.remove(nearestEnemy);
					// Save pos of player
					double playerX = super.x;
					double playerY = super.y;
					// Move player into enemy position
					super.x = enemyX;
					super.y = enemyY;
					// Create PlayerShell in players old position
					game.shellPlayer.x = playerX;
					game.shellPlayer.y = playerY;
					game.entities.add(game.shellPlayer);
					lastFrameChange = 99999; // Make sure we switch to the next frame
				}
			}
			
			if (lastFrameChange > frameDuration) {
				if (dx > 20) {
					lastFrameChange = 0;
					// update the frame
					frameNumber++;
					if (frameNumber >= framesSpiderRight.length) {
						frameNumber = 0;
					}
					sprite = framesSpiderRight[frameNumber];
					lastDir = true;
				} else if (dx < -20) {
					lastFrameChange = 0;
					// update the frame
					frameNumber++;
					if (frameNumber >= framesSpiderLeft.length) {
						frameNumber = 0;
					}
					sprite = framesSpiderLeft[frameNumber];
					lastDir = false;
				} else if (attacking) {
					if (lastDir) {
						lastFrameChange = 0;
						// update the frame
						frameNumber++;
						if (frameNumber >= framesSpiderAttackRight.length) {
							frameNumber = 0;
						}
						sprite = framesSpiderAttackRight[frameNumber];
					} else {
						lastFrameChange = 0;
						// update the frame
						frameNumber++;
						if (frameNumber >= framesSpiderAttackLeft.length) {
							frameNumber = 0;
						}
						sprite = framesSpiderAttackLeft[frameNumber];
					}
				} else {
					if (lastDir) {
						sprite = framesSpiderRight[0];
					} else {
						sprite = framesSpiderLeft[0];
					}
				}
			}
			
		} else if (initiatingMindControl) {
			
//			System.out.println("Player - initMindControl");
			
			if (lastFrameChange > frameDuration) {
				lastFrameChange = 0;
				// update the frame
				frameNumber++;
				if (frameNumber >= framesMindControl.length) {
					frameNumber = 0;
				}
				sprite = framesMindControl[frameNumber];
			}
			
		} else { // HUMAN FORM
			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 * delta * 0.1;
		
		previusY = super.y;
		previusX = super.x;
		
		super.move(delta);
		
		jumpSquare.setBounds((int) super.x, (int) super.y + 150, 50, 5);
	}
}
