package main;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

import ea.Bild;
import ea.Knoten;

/**
 * Ein feld auf der Map
 */
public class Tile extends Knoten {

	// IDs der Tiles
	public static final int GRASS = 0;
	public static final int WALL_TOP = 1;
	public static final int WALL_BOTTOM = 2;
	public static final int STONE_WALL = 3;
	public static final int STONE_WALL_BOTTOM = 4;
	public static final int STONE_FLOOR = 5;

	private Bild img; // Bild, das gerendert wird
	private int id; // Die id dises Tiles

	/**
	 * @param id
	 * @param x - X-Koordinate in units
	 * @param y - Y-Koordinate in units
	 */
	public Tile(int id, float x, float y) {
		this.id = id;

		// Das Bild laden
		try {
			BufferedImage buff = ImageIO.read(Tile.class.getResourceAsStream(getPathFromId(id)));
			// Gras hat 8 verschiedene Texturen von denen eine zufällig ausgewählt werden
			// muss.
			if (id == GRASS) {
				buff = buff.getSubimage(16 * (int) (Math.random() * 8), 0, 16, 16);
			}
			if (id == STONE_FLOOR) {
				buff = buff.getSubimage(16 * (int) (Math.random() * 10), 0, 16, 16);
			}
			// Skalieren
			BufferedImage scaled = new BufferedImage(World.SCALE, World.SCALE, BufferedImage.TYPE_INT_RGB);
			scaled.getGraphics().drawImage(buff, 0, 0, World.SCALE, World.SCALE, null);
			img = new Bild(x * World.SCALE, y * World.SCALE, scaled);
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		// Bild zu EA hinzufügen.
		add(img);
	}

	/**
	 * @return den Pfad der zu der Id gehört.
	 */
	private String getPathFromId(int id) {
		switch (id) {
		case GRASS:
			return "/res/images/tiles/grass.png";
		case WALL_TOP:
			return "/res/images/tiles/wall_top.png";
		case WALL_BOTTOM:
			return "/res/images/tiles/wall_bottom.png";
		case STONE_WALL:
			return "/res/images/tiles/test.png";
		case STONE_WALL_BOTTOM:
			return "/res/images/tiles/stone_wall_bottom.png";
		case STONE_FLOOR:
			return "/res/images/tiles/Stone_floor.png";
		}
		return null;
	}

	/**
	 * @return die Größe der Textur
	 */
	public static int getSize() {
		return 16;
	}

	/**
	 * @return ob man durch das Tile durchgehen kann
	 */
	public boolean isCollidable() {
		// Alle Tiles durch die man nicht laufen soll müssen hier true zurückgeben,
		// sonst werden sie bei der Collisiondetection nicht berücksichtigt.
		return id == WALL_TOP || id == STONE_WALL ;
	}

	/**
	 * Kleine Hifsmethode un die koordinate der Top-Kante rurückzugenben.
	 */
	public int getTop() {
		return positionY();
	}

	/**
	 * Kleine Hifsmethode un die koordinate der Bottom-Kante rurückzugenben.
	 */
	public int getBottom() {
		return positionY() + getSize();
	}

	/**
	 * Kleine Hifsmethode un die koordinate der Left-Kante rurückzugenben.
	 */
	public int getLeft() {
		return positionX();
	}

	/**
	 * Kleine Hifsmethode un die koordinate der Right-Kante rurückzugenben.
	 */
	public int getRight() {
		return positionX() + getSize();
	}
}
