package agent;

import java.util.ArrayList;
import java.util.Map;

import agent.Neighborhood.Direction;
import board.Board;
import board.Cell;

public class Agent {

	/** Dugo paszczyzny zajmowanej przez agenta - linia barkowa */
	private static final int AGENT_LENGTH = 3; // TODO: zastanowic sie, czy
												// kazdy agent ma te sam
												// wielkosc

	/**
	 * Szeroko paszczyzny zajmowane przez agenta - o prostopada do linii
	 * barkowej
	 */
	private static final int AGENT_WIDTH = 2;

	/** Wspolczynnik wagowy obliczonego zagroenia */
	private static final int THREAT_COEFF = 100;

	/** Wspolczynnik wagowy odlegoci od wyjcia */
	private static final int EXIT_COEFF = 10;

	/** Wspolczynnik wagowy dla czynnikw spoecznych */
	private static final int SOCIAL_COEFF = 1;

	/** Referencja do planszy */
	private Board board;

	/** Flaga informujca o statusie jednostki - zywa lub martwa */
	private boolean alive;

	/** Otoczenie agenta pobierane przy kadym update()'cie */
	private Map<Direction, Neighborhood> neighborhood;

	/**
	 * Konstruktor agenta. Zmienia jego status na alive.
	 * 
	 * @param board
	 *            referencja do planszy
	 */
	// TODO: Tworzenie cech osobniczych
	public Agent(Board board) {
		alive = true;
		this.board = board;
		// TODO: losowanie moich cech/charakterystyki
	}

	/** Akcje agenta w danej iteracji */
	public void update() {
		if (!alive)
			return;
		
		// kuba, wybacz, e Ci tu smaruj, ale chciaem pokaza jak tego uywa :}
		neighborhood = board.getNeighborhoods(this);
		if (neighborhood.get(Neighborhood.Direction.BOTTOM).getTemperature() < 70) {
			// jest dobrze
		}
		// koniec smarowania -- micha

		checkIfIWillLive();

		checkCollisions();

		computePotentialComponentByThreat();
		computePotentialComponentByExit();
		computePotentialComponentBySocialDistances();

		decideWhereToGo();

		updateMotorSkills();
	}

	/** Statyczna metoda, moe by wywoana przed utworzeniem agenta */
	public static int getWidth() {
		return AGENT_WIDTH;
	}

	/** Statyczna metoda, moe by wywoana przed utworzeniem agenta */
	public static int getLength() {
		return AGENT_LENGTH;
	}

	private void checkIfIWillLive() {
		// TODO: sprawdzenie czy przeyj nastpn iteracj
		// if (...)
		// alive = false;
	}

	private void checkCollisions() {
		// TODO: sprawdzenie kolizji
	}

	private void computePotentialComponentByThreat() {
		// TODO: skadowa potencjau od zagroenia poarowego
	}

	private void computePotentialComponentByExit() {
		// TODO: skadowa potencjau od ew. wyjcia (jeli widoczne)
	}

	private void computePotentialComponentBySocialDistances() {
		// TODO: skadowa potencjau od Social Distances
	}

	private void decideWhereToGo() {
		// TODO: jeli czekamy, eby symulowa zmian prdkoci, przechowaj
		// decyzj na potem?
	}

	private void updateMotorSkills() {
		// TODO: ograniczenie zdolnoci poruszania si w wyniku zatrucia?
	}

}
@@ -920,16 +920,123 @@
 n alive;
+%0A%09%0A%09/** Agent's own direction, use only TOP,BOTTOM,LEFT,RIGHT */%0A%09private Neighborhood.Direction direction;
 %0A%0A%09/** O

Add Agent's direction