package main.entities;

import java.awt.Color;

import ea.ActionFigur;
import ea.Figur;
import ea.internal.gra.PixelFeld;
import main.worlds.World;

/*
 * Alles was zustände hat und sich Bewegen kann, ist ein LivingEntity.
 */
public abstract class LivingEntity extends Entity {

	protected boolean side; // true = gespiegelt, false = nicht
	public ActionFigur actionFigur; // Sprite des Entities
	protected float spriteScale = 1f; // Skalierung des Sprites
	protected float spriteOffsetX, spriteOffsetY; // Offset des Sprites. Hier kann man die relative render-Position nachjustieren.
	protected float hp = 1f; //hp des Entitys
	protected boolean mirrored;
	
	private static Figur noTexture = new Figur();
	
	static {
		PixelFeld[] img = new PixelFeld[1];
		img[0] = new PixelFeld(16, 16, 1);
		for (int x = 0; x < 16; x++) {
			for (int y = 0; y < 16; y++) {
				img[0].farbeSetzen(x, y, Color.MAGENTA);
			}
		}
		noTexture.animationSetzen(img);
	}
	
	/**
	 * @param figur - erstes (standart) Sprite
	 * @param name  - name des Zustands
	 */
	public LivingEntity() {
		actionFigur = new ActionFigur(noTexture, "undefined") {
			// DEBUG: render boxes

//			@Override
//			public void zeichnen(Graphics2D g, BoundingRechteck r) {
//				g.setColor(Color.GREEN);
//				g.drawRect((int) actionFigur.positionX(), (int) actionFigur.positionY(), (int) actionFigur.getBreite(), (int) actionFigur.getHoehe());
//				g.drawRect((int) ((posX - width / 2) * World.SCALE), (int) ((posY - height / 2) * World.SCALE), (int) (width * World.SCALE), (int) (height * World.SCALE));
//				super.zeichnen(g, r);
//			}
		};
	}

	@Override
	protected void update() {
		// Prüft zu welcher seite man guckt
		if (velX < 0) {
			side = true;
		} else if (velX > 0) {
			side = false;
		}
		
		if (hp <= 0) {
			actionFigur.zustandSetzen(getDeathAnimationName());
			velX = 0;
			velY = 0;
			if (actionFigur.aktuelleFigur().aktuellesBild() == actionFigur.aktuelleFigur().animation().length - 1) {
				deleteEntity();
			}
		}

		// Packt das Sprite an die richtige Stelle
		actionFigur.faktorSetzen((int) (spriteScale * World.SCALE_FACTOR));
		float offsetX = width / 2 + spriteOffsetX - width / 2;
		float offsetY = height / 2 + spriteOffsetY - height / 2;
		actionFigur.positionSetzen((posX + offsetX) * World.SCALE - actionFigur.getBreite() / 2, (posY + offsetY) * World.SCALE - actionFigur.getHoehe() / 2);
	}

	/**
	 * Spiegelt die figur autmatisch, wenn nötig.
	 */
	protected void zustandSetzen(String name) {
		actionFigur.spiegelXSetzen(mirrored ? !side : side);
		if (!actionFigur.aktuellesVerhalten().equals(name)) {
			actionFigur.zustandSetzen(name);
			actionFigur.aktuelleFigur().animationsBildSetzen(0);
		}
	}
	

	public float getHP() {
		return hp;
	}
	
	public void takeDamage(float damage, Entity e) {
		zustandSetzen(getDamageAnimationName());
		actionFigur.aktuelleFigur().animationsBildSetzen(0);
		hp -= damage;
	}
	
	public abstract String getDeathAnimationName();
	public abstract String getDamageAnimationName();
}
