package main;

import ea.ActionFigur;
import ea.Rechteck;
import ea.Taste;
import ea.Ticker;

public class Player extends ActionFigur implements Ticker {

	private Main main;
	private static PlayerSheetLoader loader = new PlayerSheetLoader();
	private boolean side;

	private float velX, velY;
	private int oldPosX, oldPosY;
	private float accelleration = 0.15f;
	private float friction = 0.2f;
	private Rechteck hitBox = new Rechteck(0, 0, 0, 0);

	public Player(Main main) {
		super(loader.getPlayer(0), "idle_left");
		this.main = main;

		neuerZustand(loader.getPlayer(1), "idle_right");
		neuerZustand(loader.getPlayer(2), "walk_left");
		neuerZustand(loader.getPlayer(3), "walk_right");
		neuerZustand(loader.getPlayer(4), "strike_left");
		neuerZustand(loader.getPlayer(5), "strike_right");
		neuerZustand(loader.getPlayer(6), "swipe_left");
		neuerZustand(loader.getPlayer(7), "swipe_right");
		neuerZustand(loader.getPlayer(8), "die");

		loader.getPlayer(0).animationsGeschwindigkeitSetzen(200);
		loader.getPlayer(1).animationsGeschwindigkeitSetzen(200);
		loader.getPlayer(2).animationsGeschwindigkeitSetzen(50);
		loader.getPlayer(3).animationsGeschwindigkeitSetzen(50);

		positionSetzen(Tile.getSize() * 2, Tile.getSize() * 2);
	}

	@Override
	public void tick() {

		if (!((aktuellesVerhalten() == "strike_left" || aktuellesVerhalten() == "strike_right")
				&& aktuelleFigur().aktuellesBild() < aktuelleFigur().animation().length - 1)) {

			if (main.tasteGedrueckt(Taste.W)) {
				velY -= World.SCALE * accelleration;
			}
			if (main.tasteGedrueckt(Taste.S)) {
				velY += World.SCALE * accelleration;
			}
			if (main.tasteGedrueckt(Taste.A)) {
				velX -= World.SCALE * accelleration;
				side = false;
			}
			if (main.tasteGedrueckt(Taste.D)) {
				velX += World.SCALE * accelleration;
				side = true;
			}

			setX(getX() + velX);
			setY(getY() + velY);
			velX *= (1f - friction);
			velY *= (1f - friction);
			if (velX < 0.2f && velX > -0.2f) {
				velX = 0f;
			}
			if (velY < 0.2f && velY > -0.2f) {
				velY = 0f;
			}

			hitBox.positionSetzen(positionX() + 103, positionY() + 35);
			hitBox.breiteSetzen(50);
			hitBox.hoeheSetzen(80);

			final int xOffset = hitBox.positionX() - positionX();
			final int yOffset = hitBox.positionY() - positionY();
			int tileX, tileY;
			Tile t;
			// collision left
			if (hitBox.positionX() - oldPosX < 0) {
				tileX = hitBox.positionX() / Tile.getSize();
				tileY = hitBox.positionY() / Tile.getSize();
				t = main.getWorld().getCurrentMap().getTile(tileX, tileY);
				if (t != null && t.isCollidable()) {
					velX = 0;
					int x = t.getRight() - xOffset;
					oldPosX = x;
					positionSetzen(x, positionY());
				}
				tileX = hitBox.positionX() / Tile.getSize();
				tileY = (int) (hitBox.positionY() + hitBox.getHoehe()) / Tile.getSize();
				t = main.getWorld().getCurrentMap().getTile(tileX, tileY);
				if (t != null && t.isCollidable()) {
					velX = 0;
					int x = t.getRight() - xOffset;
					oldPosX = x;
					positionSetzen(x, positionY());
				}
			}
			// collision right
			if (hitBox.positionX() - oldPosX > 0) {
				tileX = (int) (hitBox.positionX() + hitBox.getBreite()) / Tile.getSize();
				tileY = hitBox.positionY() / Tile.getSize();
				t = main.getWorld().getCurrentMap().getTile(tileX, tileY);
				if (t != null && t.isCollidable()) {
					velX = 0;
					int x = t.getLeft() - xOffset - (int) hitBox.getBreite();
					oldPosX = x;
					positionSetzen(x, positionY());
				}
				tileX = (int) (hitBox.positionX() + hitBox.getBreite()) / Tile.getSize();
				tileY = (int) (hitBox.positionY() + hitBox.getHoehe()) / Tile.getSize();
				t = main.getWorld().getCurrentMap().getTile(tileX, tileY);
				if (t != null && t.isCollidable()) {
					velX = 0;
					int x = t.getLeft() - xOffset - (int) hitBox.getBreite();
					oldPosX = x;
					positionSetzen(x, positionY());
				}
			}
			// collision top
			if (hitBox.positionY() - oldPosY < 0) {
				tileX = hitBox.positionX() / Tile.getSize();
				tileY = hitBox.positionY() / Tile.getSize();
				t = main.getWorld().getCurrentMap().getTile(tileX, tileY);
				if (t != null && t.isCollidable()) {
					velY = 0;
					int y = t.getBottom() - yOffset;
					oldPosY = y;
					positionSetzen(positionX(), y);
				}
				tileX = (int) (hitBox.positionX() + hitBox.getBreite()) / Tile.getSize();
				tileY = hitBox.positionY() / Tile.getSize();
				t = main.getWorld().getCurrentMap().getTile(tileX, tileY);
				if (t != null && t.isCollidable()) {
					velY = 0;
					int y = t.getBottom() - yOffset;
					oldPosY = y;
					positionSetzen(positionX(), y);
				}
			}
			// collision bottom
			if (hitBox.positionY() - oldPosY > 0) {
				tileX = hitBox.positionX() / Tile.getSize();
				tileY = (int) (hitBox.positionY() + hitBox.getHoehe()) / Tile.getSize();
				t = main.getWorld().getCurrentMap().getTile(tileX, tileY);
				if (t != null && t.isCollidable()) {
					velY = 0;
					int y = t.getTop() - (int) hitBox.getHoehe() - yOffset;
					oldPosY = y;
					positionSetzen(positionX(), y);
				}
				tileX = (int) (hitBox.positionX() + hitBox.getBreite()) / Tile.getSize();
				tileY = (int) (hitBox.positionY() + hitBox.getHoehe()) / Tile.getSize();
				t = main.getWorld().getCurrentMap().getTile(tileX, tileY);
				if (t != null && t.isCollidable()) {
					velY = 0;
					int y = t.getTop() - (int) hitBox.getHoehe() - yOffset;
					oldPosY = y;
					positionSetzen(positionX(), y);
				}
			}

			oldPosX = hitBox.positionX();
			oldPosY = hitBox.positionY();

			if (!((aktuellesVerhalten() == "swipe_left" || aktuellesVerhalten() == "swipe_right")
					&& aktuelleFigur().aktuellesBild() < aktuelleFigur().animation().length - 1)) {
				if (velX == 0 && velY == 0) {
					if (side) {
						zustandSetzen("idle_right");
					} else {
						zustandSetzen("idle_left");
					}
				} else {
					if (side) {
						zustandSetzen("walk_right");
					} else {
						zustandSetzen("walk_left");
					}
				}

				if (main.tasteGedrueckt(Taste.LEERTASTE)) {
					if (side) {
						zustandSetzen("swipe_right");
					} else {
						zustandSetzen("swipe_left");
					}
				}
				if (main.tasteGedrueckt(Taste.Q)) {
					if (side) {
						zustandSetzen("strike_right");
					} else {
						zustandSetzen("strike_left");
					}
				}
			}
		}
	}
}
