//---------------------------------------------------------------------------
const bool ChessGame::CanDoMove(const ChessMove& move) const
{
  //Regular move
  const ChessPiece piece = mBoard.GetPiece(move.x1,move.y1);
  //Is it of the right color?
  if (piece.GetColor()!=mWhoseTurn) return false;
  //Is the captured piece of the other color?
  //->checked by ChessBoard
  //ChessBoard checks the rest
  return mBoard.CanDoMove(move);
}
bool ChessMove::IsValidMove(const ChessBoard& board) const{
    if (endX < 0 || endX > 7 || endY < 0 || endY > 7)
        return false;
    ChessPiece* startPiece = board.GetPiece(startX, startY);
    ChessPiece* occupyingPiece = board.GetPiece(endX, endY);
    ChessColor color = startPiece->GetColor();
    if (occupyingPiece && occupyingPiece->GetColor() == color)
        return false;
    switch (startPiece->GetRank()){
    case PAWN:
        return IsValidMovePawn(board) || IsValidEnPassantMove(board, GetDelta(color), GetStartingRow(color));
    case ROOK:
        return IsValidMoveRook(board);
    case KNIGHT:
        return IsValidMoveKnight();
    case BISHOP:
        return IsValidMoveBishop(board);
    case QUEEN:
        return IsValidMoveBishop(board) || IsValidMoveRook(board);
    case KING:
        return IsValidMoveKing() || IsValidCastleMove(board);
    }
    return false;
}
bool ChessMove::IsValidMovePawn(const ChessBoard& board) const{
    ChessPiece* pawn = board.GetPiece(startX, startY);
    ChessColor color = pawn->GetColor();
    int delta = GetDelta(color);
    int startingRow = GetStartingRow(color);
    ChessPiece* occupyingPiece = board.GetPiece(endX, endY);
    if (occupyingPiece){
        return abs(startX-endX)==1 && startY+delta==endY;
    } else if (endX==startX){
        if (startingRow==startY){
            return endY==startingRow+delta || (!board.GetPiece(endX, startingRow+delta) && endY==startingRow+delta*2);
        } else {
            return endY==startY+delta;
        }
    }
    return false;
}
bool ChessMove::IsValidCastleMove(const ChessBoard& board) const{
    ChessPiece* king = board.GetPiece(startX, startY);
    if (king->GetMoveCount() != 0) return false;
    if (abs(startX-endX) != 2 || startY != endY) return false;
    int x = 7;
    int delta = 1;
    if (startX > endX){
        x = 0;
        delta = -1;
    }
    ChessPiece* rook = board.GetPiece(x, startY);
    if (rook && rook->GetMoveCount() != 0) return false;
    ChessColor opposingColor = SwitchColor(king->GetColor());
    for (int i = startX; GetCondition(i, startX, x); i += delta){
        if ((board.GetPiece(i, startY) && i != startX)
          || board.UnderAttack(opposingColor,i,startY)) return false;
    }
    return true;
}
void GamePresenter::drawBoard() {
	SDL_RenderClear(main_renderer);
	SDL_RenderCopy(main_renderer,background,NULL,&fullscreen);
	SDL_Rect currentField;
	currentField.h = SCREEN_HEIGHT/8;
	currentField.w = SCREEN_WIDTH/8;
	currentField.y = 0;
	for(int a = 7; a >= 0; a--){
		currentField.x = 0;
		for(int b = 0; b<8; b++){
			ChessPiece* CurrentPiece = currentgame->getPieceAtLocation(a*8 + b);
			if (CurrentPiece)
				SDL_RenderCopy(main_renderer,piecesheet,&pieces[getSpriteForPiece(CurrentPiece->GetType(),CurrentPiece->GetColor())],&currentField);
			currentField.x += currentField.w;
		}
		currentField.y += currentField.h;
	}
	if (currentgame->isGameOver()){
		SDL_SetTextureAlphaMod(piecesheet,160);
		if (currentgame->getResult() == "White wins"){
			SDL_RenderCopy(main_renderer,piecesheet,&pieces[getSpriteForPiece('K','W')],&fullscreen);

		}
		if (currentgame->getResult() == "Black wins"){
			SDL_RenderCopy(main_renderer,piecesheet,&pieces[getSpriteForPiece('K','B')],&fullscreen);
		}
		if (currentgame->getResult() == "Draw"){
			SDL_Rect lefthalf;
			lefthalf.h=SCREEN_HEIGHT;
			lefthalf.w=SCREEN_WIDTH/2;
			lefthalf.x=0;
			lefthalf.y=0;
			SDL_Rect righthalf(lefthalf);
			righthalf.x=SCREEN_WIDTH/2;
			SDL_Rect halfwhiteking=pieces[getSpriteForPiece('K','W')];
			SDL_Rect halfblackking=pieces[getSpriteForPiece('K','B')];
			halfwhiteking.w/=2;
			halfblackking.w/=2;
			halfblackking.x+=halfblackking.w;
			SDL_RenderCopy(main_renderer,piecesheet,&halfwhiteking,&lefthalf);
			SDL_RenderCopy(main_renderer,piecesheet,&halfblackking,&righthalf);
		}
		SDL_SetTextureAlphaMod(piecesheet,255);
	}
	SDL_RenderPresent(main_renderer);
}