package a8;

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

public class ChessGame extends Observable implements Observer {

	private ChessBoard board;
	private ChessPlayer player1;
	private ChessPlayer player2;
	private boolean player1Move;
	private ArrayList<ChessMove> moves = new ArrayList();
	
	public ChessGame(ChessPlayer player1, ChessPlayer player2) {
		this.player1 = player1;
		this.player2 = player2;
		board = new ChessBoard();
		
		
		new Rook(player1, this, new ChessPosition(0,0));
		new Knight(player1, this, new ChessPosition(1,0));
		new Bishop(player1, this, new ChessPosition(2,0));
		new Queen(player1, this, new ChessPosition(3,0));
		new King(player1, this, new ChessPosition(4,0));
		new Bishop(player1, this, new ChessPosition(5,0));
		new Knight(player1, this, new ChessPosition(6,0));
		new Rook(player1, this, new ChessPosition(7,0));

			
		for (int i=0; i<8; i++) {
			new Pawn(player1, this, new ChessPosition(i,1));
		}

		new Rook(player2, this, new ChessPosition(0,7));
		new Knight(player2, this, new ChessPosition(1,7));
		new Bishop(player2, this, new ChessPosition(2,7));
		new Queen(player2, this, new ChessPosition(3,7));
		new King(player2, this, new ChessPosition(4,7));
		new Bishop(player2, this, new ChessPosition(5,7));
		new Knight(player2, this, new ChessPosition(6,7));
		new Rook(player2, this, new ChessPosition(7,7));

		for (int i=0; i<8; i++) {
			new Pawn(player2, this, new ChessPosition(i,6));
		}		
	}
	
	public ChessPlayer getPlayer1() {
		return player1;
	}
	
	public ChessPlayer getPlayer2() {
		return player2;
	}

	public ChessBoard getBoard() {
		return board;
	}

	public boolean getPlayer1Move(){
		return this.player1Move;
	}
	public void changePlayerMove(){
		 this.player1Move = !this.player1Move;
	}
	
	
	@Override
	public void update(Observable arg0, Object arg1) {
		moves.add((ChessMove) arg1);
		setChanged();
		this.notifyObservers(arg1);
	}
	
	public int getLogSize(){
		return moves.size();
	}
	
	public ChessMove[] getMoves(int n){
		if(n==0){
		return moves.toArray(new ChessMove[moves.size()]);
		}else if(n>0){
			List<ChessMove> subArray = moves.subList(0, n);
			return  subArray.toArray(new ChessMove[subArray.size()]);
		}else {
			
			List<ChessMove> subArray = moves.subList(this.getLogSize()-n-1, this.getLogSize()-1);
			return  subArray.toArray(new ChessMove[subArray.size()]);
		}
	}
	
	public void undo(){
		
		if(moves.size()!=0){
		
		ChessMove moved = moves.get(getLogSize()-1);
		
		
		this.board.removePieceFrom(moved.getTo());
		this.board.placePieceAt(moved.getPiece(), moved.getFrom());
		if(moved.getCaptured()!=null){
		this.board.placePieceAt(moved.getCaptured(), moved.getTo());
		}
		this.changePlayerMove(); //this isn't working apparently
		moves.remove(getLogSize()-1);
		setChanged();
		notifyObservers(null);
	
		
	}
		}
	
}
