
public class MoveUtils 
{

    static final int BISHOP_UP_LEFT = 0;
    static final int BISHOP_UP_RIGHT = 1;
    static final int BISHOP_DOWN_LEFT = 2;
    static final int BISHOP_DOWN_RIGHT = 3;

    static final int ROOK_UP = 0;
    static final int ROOK_DOWN = 2;
    static final int ROOK_LEFT = 3;
    static final int ROOK_RIGHT = 1;


    public static long getRookMovesSeparate(long combined_occ, int square) 
    {
        long combinedAttacks = 0;

        long rookAttackUp = MoveConstants.ROOK_ATTACKS[ROOK_UP][square];
        long rookAndOccs = rookAttackUp & combined_occ;
        if (rookAndOccs != 0) 
        {
            long lastValue = rookAndOccs;
            for (int i = 0; i < 8; i++) 
            {
                rookAndOccs = rookAndOccs & rookAndOccs - 1;
                if (rookAndOccs == 0) 
                {
                    int endSquare = Perft.bitScanForward(lastValue); // Implement this method
                    combinedAttacks |= Inb.INBETWEEN_BITBOARDS[square][endSquare];
                    break;
                }
                lastValue = rookAndOccs;
            }
        } 
        else 
        {
            combinedAttacks |= rookAttackUp;
        }
       // Pr.println("Rook up");
        //Pr.printlongLn(combinedAttacks);

        long rookAttackLeft = MoveConstants.ROOK_ATTACKS[ROOK_LEFT][square];
        rookAndOccs = rookAttackLeft & combined_occ;
        if (rookAndOccs != 0) 
        {
            long lastValue = rookAndOccs;
            for (int i = 0; i < 8; i++) 
            {
                rookAndOccs = rookAndOccs & rookAndOccs - 1;
                if (rookAndOccs == 0) 
                {
                    int endSquare = Perft.bitScanForward(lastValue); // Implement this method
                    combinedAttacks |= Inb.INBETWEEN_BITBOARDS[square][endSquare];
                    break;
                }
                lastValue = rookAndOccs;
            }
        } 
        else 
        {
            combinedAttacks |= rookAttackLeft;
        }
        //Pr.println("Rook left");
        //Pr.printlongLn(combinedAttacks);

        long rookAttackDown = MoveConstants.ROOK_ATTACKS[ROOK_DOWN][square];
        rookAndOccs = rookAttackDown & combined_occ;
        if (rookAndOccs != 0) 
        {
            int endSquare = Perft.bitScanForward(rookAndOccs); // Implement this method
            combinedAttacks |= Inb.INBETWEEN_BITBOARDS[square][endSquare];
        } 
        else 
        {
            combinedAttacks |= rookAttackDown;
        }
       // Pr.println("Rook down");
      //  Pr.printlongLn(combinedAttacks);

        long rookAttackRight = MoveConstants.ROOK_ATTACKS[ROOK_RIGHT][square];
        rookAndOccs = rookAttackRight & combined_occ;
        if (rookAndOccs != 0) 
        {
            int endSquare = Perft.bitScanForward(rookAndOccs); // Implement this method
            combinedAttacks |= Inb.INBETWEEN_BITBOARDS[square][endSquare];
        } 
        else 
        {
            combinedAttacks |= rookAttackRight;
        }
      //  Pr.println("Rook right");
      //  Pr.printlongLn(combinedAttacks);

        return combinedAttacks;
    }    

    public static long getBishopMovesSeparate(long combined_occ, int square) 
    {

        //Pr.printIntLn(square);
        //Pr.printSquareLn(square);

        long combinedAttacks = 0;

        long bishopAttackUpLeft = MoveConstants.BISHOP_ATTACKS[BISHOP_UP_LEFT][square];
        long bishopAndOccs = bishopAttackUpLeft & combined_occ;
        if (bishopAndOccs != 0) {
            long lastValue = bishopAndOccs;
            for (int i = 0; i < 8; i++) {
                bishopAndOccs &= bishopAndOccs - 1;
                if (bishopAndOccs == 0) {
                    int endSquare = Perft.bitScanForward(lastValue); // Implement this method
                    combinedAttacks |= Inb.INBETWEEN_BITBOARDS[square][endSquare];
                    break;
                }
                lastValue = bishopAndOccs;
            }
        } else {
            combinedAttacks |= bishopAttackUpLeft;
        }
       // Pr.println("Bishop up left");
        //Pr.printlongLn(combinedAttacks);

        long bishopAttackUpRight = MoveConstants.BISHOP_ATTACKS[BISHOP_UP_RIGHT][square];
        bishopAndOccs = bishopAttackUpRight & combined_occ;
        if (bishopAndOccs != 0) {
            long lastValue = bishopAndOccs;
            for (int i = 0; i < 8; i++) {
                bishopAndOccs &= bishopAndOccs - 1;
                if (bishopAndOccs == 0) {
                    int endSquare = Perft.bitScanForward(lastValue); // Implement this method
                    combinedAttacks |= Inb.INBETWEEN_BITBOARDS[square][endSquare];
                    break;
                }
                lastValue = bishopAndOccs;
            }
        } else {
            combinedAttacks |= bishopAttackUpRight;
        }
       // Pr.println("Bishop up right");
       // Pr.printlongLn(combinedAttacks);

        long bishopAttackDownLeft = MoveConstants.BISHOP_ATTACKS[BISHOP_DOWN_LEFT][square];

       // Pr.println("down left bitboard");
       // Pr.printlongLn(bishopAttackDownLeft);
       // Pr.println("__________");

        bishopAndOccs = bishopAttackDownLeft & combined_occ;
        if (bishopAndOccs != 0) {
            int endSquare = Perft.bitScanForward(bishopAndOccs); // Implement this method
            combinedAttacks |= Inb.INBETWEEN_BITBOARDS[square][endSquare];
        } else {
            combinedAttacks |= bishopAttackDownLeft;
        }
      //  Pr.println("Bishop down left");
       // Pr.printlongLn(combinedAttacks);

        long bishopAttackDownRight = MoveConstants.BISHOP_ATTACKS[BISHOP_DOWN_RIGHT][square];
        bishopAndOccs = bishopAttackDownRight & combined_occ;
        if (bishopAndOccs != 0) {
            int endSquare = Perft.bitScanForward(bishopAndOccs); // Implement this method
            combinedAttacks |= Inb.INBETWEEN_BITBOARDS[square][endSquare];
        } else {
            combinedAttacks |= bishopAttackDownRight;
        }
      //  Pr.println("Bishop down right");
      //  Pr.printlongLn(combinedAttacks);
        return combinedAttacks;
    }

    public static Boolean Is_Square_Attacked_By_Black_Global(int square, long occupancy)
    {
                    
       // if (Board.bitboard_array_global[GenConst.BP] & MoveConstants.WHITE_PAWN_ATTACKS[square]).signum() != 0) {
            //return true;
        //}
        //if (Board.bitboard_array_global[GenConst.BN] & MoveConstants.KNIGHT_ATTACKS[square]).signum() != 0) {
            //return true;
        //}
        //if (Board.bitboard_array_global[GenConst.BK] & MoveConstants.KING_ATTACKS[square]).signum() != 0) {
         ///   return true;
        //}
        //long bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupancy, square);
        //if (Board.bitboard_array_global[GenConst.BB] & bishopAttacks).signum() != 0) {
         ///   return true;
        //}
        //if (Board.bitboard_array_global[GenConst.BQ] & bishopAttacks).signum() != 0) {
         ///   return true;
        //}
        //B/igInteger rookAttacks = MoveUtils.GetRookMovesSeparate(occupancy, square); 
        //if (Board.bitboard_array_global[GenConst.BR] & rookAttacks).signum() != 0) {
            //return true;
        //}
        //if (Board.bitboard_array_global[GenConst.BQ] & rookAttacks).signum() != 0) {
            //return true;
        //}
    
        return false;
    }


    public static Boolean Is_Square_Attacked_By_White_Global(int square, long occupancy)
    {
                    
       // if (Board.bitboard_array_global[GenConst.WP] & MoveConstants.BLACK_PAWN_ATTACKS[square]).signum() != 0) {
            //return true;
        //}
        //if (Board.bitboard_array_global[GenConst.WN] & MoveConstants.KNIGHT_ATTACKS[square]).signum() != 0) {
            //return true;
        //}
        //if (Board.bitboard_array_global[GenConst.WK] & MoveConstants.KING_ATTACKS[square]).signum() != 0) {
            //return true;
        //}
        //long bishopAttacks = MoveUtils.GetBishopMovesSeparate(occupancy, square);
        //if (Board.bitboard_array_global[GenConst.WB] & bishopAttacks).signum() != 0) {
            //return true;
        //}
        //if (Board.bitboard_array_global[GenConst.WQ] & bishopAttacks).signum() != 0) {
            //return true;
        //}
        //long rookAttacks = MoveUtils.GetRookMovesSeparate(occupancy, square); 
        //if (Board.bitboard_array_global[GenConst.WR] & rookAttacks).signum() != 0) {
            //return true;
        //}
        //if (Board.bitboard_array_global[GenConst.WQ] & rookAttacks).signum() != 0) {
            //return true;
        //}
    
        return false;
    }


}
