package system.battle;

import br.ufsc.inf.leobr.cliente.Jogada;
import system.character.BaseCharacter;

/**
 * Cria e controla os mapas do jogo
 * */
public class Map implements Jogada {
	/**
	 * Serve pra não dar merda na serialização de objetos.
	 */
	private static final long serialVersionUID = -4300694807557701846L;
	
	/**
	 * Os tiles do mapa.
	 */
	private Tile[][] tiles;
	
	/**
	 * Inicializa um mapa de tamanho x por y
	 * @param x tamanho horizontal
	 * @param y tamanho vertical
	 */
	public Map(int x, int y) {
		// Define o tamanho do mapa conforme x e y
		tiles = new Tile[x][y];
		
		// Inicializa um mapa plano
		for (int i = 0; i < tiles.length; i++) {
			for (int j = 0; j < tiles[i].length; j++) {
				tiles[i][j] = new Tile(1, 1, new Coordinate(i, j));
			}
		}
	}
	
	/**
	 * Adiciona um ocupante à posição das coordenadas.
	 * @param occupant - ocupante que será adicionado.
	 * @param coordinate - coordenadas do mapa em que ele será adicionado.
	 */
	public void addOccupant(BaseCharacter occupant, Coordinate coordinate) {
		if (tiles[coordinate.getX()][coordinate.getY()].getOccupant() == null) {
			occupant.setCoordinates(coordinate);
			tiles[coordinate.getX()][coordinate.getY()].setOccupant(occupant);
		}
	}
	
	/**
	 * Remove um ocupante nas determinadas coordenadas, caso haja.
	 * @param coordinate - coordenadas para remover o ocupante.
	 */
	public void removeOccupant(Coordinate coordinate) {
		if (tiles[coordinate.getX()][coordinate.getY()].getOccupant() != null) {
			tiles[coordinate.getX()][coordinate.getY()].setOccupant(null);
		}
	}
	
	// Para testes apenas
	public void printMap() {
		for (int i = 0; i < tiles.length; i++) {
			for (int j = 0; j < tiles[i].length; j++) {
				if (tiles[i][j].getOccupant() == null) {
					System.out.print("("+tiles[i][j].getCoordinate().getX()+","+tiles[i][j].getCoordinate().getY()+")");					
				} else {
					System.out.print("("+tiles[i][j].getOccupant().getName()+")");
				}
			}
			System.out.println();
		}
	}
	
	// --------------------------------------------------------------------------------------------
	// Getters e setters
	// --------------------------------------------------------------------------------------------
	
	public Tile[][] getTiles() {
		return tiles;
	}
}
