package main.entities.player;

import java.util.ArrayList;

import ea.Taste;
import ea.Vektor;
import main.Main;
import main.SheetLoader;
import main.entities.Entity;
import main.entities.LivingEntity;

public class Player extends LivingEntity {

	private static SheetLoader loader = new SheetLoader("/res/images/player_sprite_sheet.png");
	private boolean onlyAttackOnceTrigger;
	private float range = 1.2f; // die reichweite der Attacke

	public Player() {
		loader.generateFigures(64, 32, new int[] { 5, 8, 7, 6, 2, 5, 4, 7 });

		// Entity-Eigenschaften werden festgelegt
		width = 0.7f;
		height = 0.8f;
		spriteOffsetY = -0.14f;
		spriteScale = 0.8f;
		posX = 7.5f;
		posY = 5.5f;

		// unterschiedliche Animationsgeschwindigkeiten
		// für idle
		loader.getFigur(0).animationsGeschwindigkeitSetzen(200);
		// fürs laufen
		loader.getFigur(1).animationsGeschwindigkeitSetzen(50);

		// Zustände werden hinzugefügt
		actionFigur.neuerZustand(loader.getFigur(0), "idle");
		actionFigur.neuerZustand(loader.getFigur(1), "walk");
		actionFigur.neuerZustand(loader.getFigur(2), "strike");
		actionFigur.neuerZustand(loader.getFigur(3), "swipe");
		actionFigur.neuerZustand(loader.getFigur(6), getDamageAnimationName());
		actionFigur.neuerZustand(loader.getFigur(7), getDeathAnimationName());
	}

	@Override
	protected void update() {
		// Bei dieser animation bleibt man sofort stehen.
		if (!((actionFigur.aktuellesVerhalten().equals("strike"))
				&& actionFigur.aktuelleFigur().aktuellesBild() < actionFigur.aktuelleFigur().animation().length - 1)) {
			// Bei diser soll man sich nicht bewegen können aber weiter rutschen
			if (!((actionFigur.aktuellesVerhalten().equals("swipe")) && actionFigur.aktuelleFigur()
					.aktuellesBild() < actionFigur.aktuelleFigur().animation().length - 1)) {

				// wasd movement
				if (Main.instance.tasteGedrueckt(Taste.A)) {
					velX -= accelleration;
				}
				if (Main.instance.tasteGedrueckt(Taste.D)) {
					velX += accelleration;
				}
				if (Main.instance.tasteGedrueckt(Taste.W)) {
					velY -= accelleration;
				}
				if (Main.instance.tasteGedrueckt(Taste.S)) {
					velY += accelleration;
				}

				// Auf idle stellen wenn man sich nicht bewegt
				if (velX == 0 && velY == 0) {
					zustandSetzen("idle");
				} else {
					zustandSetzen("walk");
				}

				// Attacken
				if (Main.instance.tasteGedrueckt(Taste.LEERTASTE)) {
					zustandSetzen("swipe");
				}
				if (Main.instance.tasteGedrueckt(Taste.Q)) {
					zustandSetzen("strike");
				}
				if (Main.instance.tasteGedrueckt(Taste.F)) {
					zustandSetzen("die");
				}
				onlyAttackOnceTrigger = false;
			}

			// auf Kollisionen prüfen
			checkTileCollisions(Main.instance.getWorld().getCurrentMap());
			// LivingEntity auch updaten lassen
			super.update();
		} else {
			velX = 0;
			velY = 0;
		}

		// auf Kollisionen prüfen
		checkTileCollisions(Main.instance.getWorld().getCurrentMap());

		if (!actionFigur.aktuellesVerhalten().equals(getDamageAnimationName())) {
			if (!onlyAttackOnceTrigger && actionFigur.aktuellesVerhalten().equals("swipe")
					&& actionFigur.aktuelleFigur().aktuellesBild() == 1) {
				onlyAttackOnceTrigger = true;
				ArrayList<Entity> entities = Main.instance.getWorld().getCurrentMap().getEntities();
				for (Entity e : entities) {
					if (e instanceof LivingEntity && e != this && e.dist(this) <= range) {
						LivingEntity le = (LivingEntity) e;
						if (le.getHP() > 0) {
							Vektor toE = vectorToEntity(le);
							toE = toE.normiert();
							if ((toE.x > 0 && !side) || (toE.x <= 0 && side)) {
								le.setVelX(le.getVelX() + toE.x * 0.1f);
								le.setVelY(le.getVelY() + toE.y * 0.1f);
								le.takeDamage(0.1f, this);
							}
						}
					}
				}
			}
		}
	}

	@Override
	public String getDeathAnimationName() {
		return "die";
	}

	@Override
	public String getDamageAnimationName() {
		return "damage";
	}
}
