
package chess2;
import java.util.ArrayList;

public class Reply {

    public static ArrayList<MoveNode> replies(ChessBoard BASE, Side SIDE)
    {
       
        ChessBoard futureBoard = new ChessBoard(BASE);
        ArrayList<MoveNode> replies = new ArrayList();
        for(int i=0;i<futureBoard.queens.size();i++)
        {
            if (futureBoard.queens.get(i).side==SIDE){
                ArrayList<Decision> possibleDecisions = futureBoard.queens.get(i).possibleDecisions();
                       for (int n=0;n<possibleDecisions.size();n++){

                                futureBoard.queens.get(i).move(possibleDecisions.get(n).xPos, possibleDecisions.get(n).yPos);
                                if (SIDE==Side.WHITE)
                                 {
                                     futureBoard.whiteMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.whiteMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.whiteMovePiece = Piece.QUEEN;
                                 }
                                 else
                                 {
                                     futureBoard.blackMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.blackMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.blackMovePiece = Piece.QUEEN;
                                 }
                                 replies.add(new MoveNode(new ChessBoard(futureBoard), SIDE));
                                 futureBoard = new ChessBoard(BASE);
                       }
                   }
        }
        for(int i=0;i<futureBoard.bishops.size();i++)
        {
            if (futureBoard.bishops.get(i).side==SIDE){
                ArrayList<Decision> possibleDecisions = futureBoard.bishops.get(i).possibleDecisions();
                       for (int n=0;n<possibleDecisions.size();n++){

                                futureBoard.bishops.get(i).move(possibleDecisions.get(n).xPos, possibleDecisions.get(n).yPos);
                                if (SIDE==Side.WHITE)
                                 {
                                     futureBoard.whiteMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.whiteMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.whiteMovePiece = Piece.BISHOP;
                                 }
                                 else
                                 {
                                     futureBoard.blackMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.blackMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.blackMovePiece = Piece.BISHOP;
                                 }
                                replies.add(new MoveNode(new ChessBoard(futureBoard), SIDE));
                                futureBoard = new ChessBoard(BASE);
                       }
                   }
        }
        for(int i=0;i<futureBoard.rooks.size();i++)
        {
            if (futureBoard.rooks.get(i).side==SIDE){
                ArrayList<Decision> possibleDecisions = futureBoard.rooks.get(i).possibleDecisions();
                       for (int n=0;n<possibleDecisions.size();n++){

                                 futureBoard.rooks.get(i).move(possibleDecisions.get(n).xPos, possibleDecisions.get(n).yPos);
                                 if (SIDE==Side.WHITE)
                                 {
                                     futureBoard.whiteMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.whiteMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.whiteMovePiece = Piece.ROOK;
                                 }
                                 else
                                 {
                                     futureBoard.blackMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.blackMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.blackMovePiece = Piece.ROOK;
                                  //   System.out.println("blackMoveXPos: "+futureBoard.blackMoveXPos);
                                 }
                                 replies.add(new MoveNode(new ChessBoard(futureBoard), SIDE));
                                 futureBoard = new ChessBoard(BASE);
                       }
                   }
        }
         for(int i=0;i<futureBoard.pawns.size();i++)
        {
            if (futureBoard.pawns.get(i).side==SIDE){
                ArrayList<Decision> possibleDecisions = futureBoard.pawns.get(i).possibleDecisions();
                       for (int n=0;n<possibleDecisions.size();n++){

                                futureBoard.pawns.get(i).move(possibleDecisions.get(n).xPos, possibleDecisions.get(n).yPos);
                                if (SIDE==Side.WHITE)
                                 {
                                     futureBoard.whiteMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.whiteMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.whiteMovePiece = Piece.PAWN;
                                 }
                                 else
                                 {
                                     futureBoard.blackMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.blackMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.blackMovePiece = Piece.PAWN;
                                 }
                                 replies.add(new MoveNode(new ChessBoard(futureBoard), SIDE));
                                 futureBoard = new ChessBoard(BASE);
                       }
                   }
        }
        for(int i=0;i<futureBoard.knights.size();i++)
        {
            if (futureBoard.knights.get(i).side==SIDE){
                ArrayList<Decision> possibleDecisions = futureBoard.knights.get(i).possibleDecisions();
                       for (int n=0;n<possibleDecisions.size();n++){

                                 futureBoard.knights.get(i).move(possibleDecisions.get(n).xPos, possibleDecisions.get(n).yPos);
                                 if (SIDE==Side.WHITE)
                                 {
                                     futureBoard.whiteMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.whiteMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.whiteMovePiece = Piece.KNIGHT;
                                 }
                                 else
                                 {
                                     futureBoard.blackMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.blackMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.blackMovePiece = Piece.KNIGHT;
                                 }
                                 replies.add(new MoveNode(new ChessBoard(futureBoard), SIDE));
                                 futureBoard = new ChessBoard(BASE);
                       }
                   }
        }
       
       for(int i=0;i<futureBoard.mysteryPieces.size();i++)
        {
            if (futureBoard.mysteryPieces.get(i).side==SIDE){
                ArrayList<Decision> possibleDecisions = futureBoard.mysteryPieces.get(i).possibleDecisions();
                       for (int n=0;n<possibleDecisions.size();n++){

                                 futureBoard.mysteryPieces.get(i).move(possibleDecisions.get(n).xPos, possibleDecisions.get(n).yPos);
                                 if (SIDE==Side.WHITE)
                                 {
                                     futureBoard.whiteMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.whiteMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.whiteMovePiece = Piece.MYSTERYPIECE;
                                 }
                                 else
                                 {
                                     futureBoard.blackMoveXPos = possibleDecisions.get(n).xPos;
                                     futureBoard.blackMoveYPos = possibleDecisions.get(n).yPos;
                                     futureBoard.blackMovePiece = Piece.MYSTERYPIECE;
                                 }
                                 replies.add(new MoveNode(new ChessBoard(futureBoard), SIDE));
                                 futureBoard = new ChessBoard(BASE);
                       }
                   }
        }
        ArrayList<Decision> possibleDecisions = futureBoard.yourKing(SIDE).possibleDecisions();
            for (int i=0;i<possibleDecisions.size();i++)
            {
                futureBoard.yourKing(SIDE).move(possibleDecisions.get(i).xPos, possibleDecisions.get(i).yPos);
                replies.add(new MoveNode(new ChessBoard(futureBoard), SIDE));
                futureBoard = new ChessBoard(BASE);
            }
        return replies;
    }
}
