package entity;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.io.IOException;

import javax.imageio.ImageIO;

import main.CollisionHandler;
import main.GamePanel;
import main.KeyHandler;

public class Player extends Entity {
	
	GamePanel gp;
	KeyHandler keyH;
	CollisionHandler colH;
	
	public int screenX;
	public int screenY;
	public int speed2;
	
	public Player(GamePanel gp, KeyHandler keyH, CollisionHandler colH) {
		this.gp = gp;
		this.keyH = keyH;
		this.colH = colH;
		speed2=0;
		this.posX = 1 * gp.tileSize;
		this.posY = 0 * gp.tileSize;
		
		this.speed = 4;
		this.size = gp.tileSize;
		
		this.screenX = (gp.screenWidth - size) / 2;
		this.screenY = (gp.screenHeight - size) / 2;
		
		solidArea = new Rectangle(10, 14, 28, 28);
		
		
		// Call our new method when we create our player
		loadImages();
	}
	
	// New Method - This will handle loading in our images
	private void loadImages() {
		int spriteWidth = 23;
		int spriteHeight = 32;
		
		try {
			spriteSheet = ImageIO.read(getClass().getResourceAsStream("/sprites/modern6.png"));
		
			down1 = spriteSheet.getSubimage(0, 0, spriteWidth, spriteHeight);
			down2 = spriteSheet.getSubimage(spriteWidth * 1, 0, spriteWidth, spriteHeight);
			down3 = spriteSheet.getSubimage(spriteWidth * 2, 0, spriteWidth, spriteHeight);
			
			left1 = spriteSheet.getSubimage(spriteWidth * 0	, spriteHeight * 1	, spriteWidth, spriteHeight);
			left2 = spriteSheet.getSubimage(spriteWidth * 1	, spriteHeight * 1	, spriteWidth, spriteHeight);
			left3 = spriteSheet.getSubimage(spriteWidth * 2	, spriteHeight * 1	, spriteWidth, spriteHeight);
			
			right1 = spriteSheet.getSubimage(0, spriteHeight * 2, spriteWidth, spriteHeight);
			right2 = spriteSheet.getSubimage(spriteWidth * 1, spriteHeight * 2, spriteWidth, spriteHeight);
			right3 = spriteSheet.getSubimage(spriteWidth * 2, spriteHeight * 2, spriteWidth, spriteHeight);
			
			up1 = spriteSheet.getSubimage(0, spriteHeight * 3, spriteWidth, spriteHeight);
			up2 = spriteSheet.getSubimage(spriteWidth * 1, spriteHeight * 3, spriteWidth, spriteHeight);
			up3 = spriteSheet.getSubimage(spriteWidth * 2, spriteHeight * 3, spriteWidth, spriteHeight);
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void update() {
		
		boolean walking = false;
		
		if(keyH.leftP == true) {
			direction = "left";
			walking = true;
		}
		
		if(keyH.rightP == true) {
			direction = "right";
			walking = true;
		}
		if(keyH.upP == true) {
			direction = "up";
			walking = true;
		}
		if(keyH.downP == true) {
			direction = "down";
			walking = true;
		}
		
		boolean collidingWithEnemy = false;
		
		for(int i = 0; i < gp.entities.size(); i++) {
			if(colH.playerEnemyCollision(this, gp.entities.get(i))) {
				collidingWithEnemy = true;
			}
			
			if(collidingWithEnemy) {
				gp.entities.get(i).moveEnemy();
				gp.sound.setFile(0);
				gp.sound.play();
				collidingWithEnemy = false;
			}
		}
		
		
		collisionOn = false;
		colH.checkTile(this);
		
		int futureX = posX;
		int futureY = posY;

		if(!collisionOn && walking) {
			if(direction == "left") {
				futureX -= speed;
			}
			if(direction == "right") {
				futureX += speed;
			}
			if(direction == "up") {
				futureY -= speed*3-speed2/2;
			}
			if(direction == "down") {
				futureY += speed+speed2;
			}
		}
		
		direction = "down";
		colH.checkTile(this);
		if(!walking && !collisionOn) {
		futureY += 0.1*(1+speed2);
		speed2 +=1;
		}
		if(collisionOn&&!walking){futureY -= 1;speed2=0;}
		direction = "down";
		colH.checkTile(this);
		if(walking && !collisionOn) {
		futureY += 0.1*(1+speed2);
		speed2 +=1;
		}
		if(collisionOn&&walking){futureY -= 1;speed2=0;}
		posX = futureX;
		posY = futureY;
		
		
		
		if(walking) {
			spriteCounter++;
		}
		
	    if (spriteCounter > 8) {
	        if (spriteIncreasing) {
	            spriteNum++;
	            if(spriteNum == 3) {
	            	spriteIncreasing = false;
	            }
	        }
	        else {
	        	spriteNum--;
	            if(spriteNum == 1) {
	            	spriteIncreasing = true;
	            }
	        }
	        spriteCounter = 0;
	    }
	    
	}
	
	public void draw(Graphics2D g2) {
		
		currentImage = selectImage(direction, spriteNum);
		
		g2.drawImage(currentImage, screenX, screenY, size, size, null);
	}

}
