package draughts;

import grid.Grid;
import position.Direction;
import position.Position;

/**
 * A dámák abban különlegesek az egyszerű bábukhoz képest, hogy léphetnek előre
 * vagy hátra is egyet.
 * A draughts csomagban hozzuk létre a nyilvános King osztályt, mely kiterjeszti
 * az absztrakt Piece osztályt, és amelyben nem adunk meg új adattagot.
 */
public class King extends Piece {

	/**
	 * Egy konstruktor, mely meghívja a szülőosztály konstruktorát. Paraméterül
	 * várja a
	 * @param p pozíciót (Position)
	 * @param c színt (Color)
	 * @param g és a játéktáblát (Piece-szel paraméterezett Grid)
	 */
	public King(Position p, Color c, Grid g) {
		super(p, c, g);
	}

	/**
	 * canStepTo: Egy dáma egyet léphet átlósan tetszőleges irányban.
	 * Előfordulhat hogy kettőt lépünk, ha át tudjunk ugrani az ellenfél egy
	 * bábuját.
	 * @param q paraméterül vár egy pozíciót
	 * @return csak akkor ad vissza igaz értéket, ha lehet oda lépni a bábuval
	 */
	@Override
	public boolean canStepTo(Position q) {
		/**
		 * Vizsgáljuk meg, hogy a megadott pozíció a táblán van-e (isValid), egy
		 * átlón helyezkedik-e el bábu eredeti pozíciója és a paraméter pozíció
		 * (isDiagonal), és a paraméterül kapott pozíció különbözik-e a bábu
		 * jelenlegi pozíciójától (equals).
		 */
		if (g.isValid(q) && Position.isDiagonal(p, q) && !p.equals(q)) {
			Piece n = (Piece) g.get(p.next(Direction.fromDistance(p.distance(q))));
			if (g.get(q) == null) {
				final int steps = Math.abs(q.h - p.h) + Math.abs(q.v - p.v);
				/**
				 * Egy lépés kimarad, ahol azt ellenőriztük, hogy jó irányba
				 * lépnénk-e. A végeredmény tehát a következő logikai kifejezés:
				 * a paraméterül kapott hely üres és vagy csak egyet léptünk
				 * vagy kettőt, az utóbbi esetben egy ellenséges bábu áll a
				 * közbülső mezőn.
				 */
				return steps == 2 || steps == 4 && n != null && n.c != c;
			}
		}
		/**
		 * Ha nem, adjunk vissza hamis értéket.
		 */
		return false;

	}

	/**
	 * toString: Például egy fehér dáma bábu esetén ez WK lesz.
	 * @return visszaadja a bábu színének első betűjét (charAt), mellette egy
	 * "K" betűt.
	 * @note No thanks. My one liner beats calling charAt on some obscure
	 * class.getName and a string concatenation.
	 */
	@Override
	public String toString() {
		//c.toString().charAt(0) + this.getClass().getName()
		return c == Color.WHITE ? "WK" : "BK";
	}

}
