def getAlphaBetaMove(board, parser):
    import MoveNode as MoveNode
    depth = 1
    AIagent = AI(board, True, depth)
    legalMoves = board.getAllMovesLegal(board.currentSide)
    bestMove = None
    moveTree = AIagent.generateMoveTree()
    legalBestMoves = AIagent.bestMovesWithMoveTree(moveTree)

    #conLegalMoves = AIagent.getAllMovesLegalConcurrent(board.currentSide)

    def alphaBetaMax(alpha, beta, depth):
        global bestMove
        value = -float(999999)
        #if (depth == 0 or board.isCheckmate or board.isStalemate):
        if (depth == 0):
            return (board.getPointValueOfSide(board.currentSide), )
        random.shuffle(legalBestMoves)
        for move in legalBestMoves:
            random.shuffle(legalMoves)
            for m in legalMoves:
                random.shuffle(legalMoves)
                value = max(value, alphaBetaMin(alpha, beta, depth - 1)[0])
                if (value >= beta):
                    return beta, m
                if (value > alpha):
                    alpha = value
                    bestMove = m
                    bestMove.notation = parser.notationForMove(bestMove)
        #return {'alpha': alpha, 'bestMove': bestMove}
        return alpha, bestMove
        #return bestMove

    def alphaBetaMin(alpha, beta, depth):
        global bestMove
        value = float(999999)
        #if (depth == 0 or board.isCheckmate or board.isStalemate):
        if (depth == 0):
            return (-board.getPointValueOfSide(board.currentSide), )

        random.shuffle(legalBestMoves)
        for move in legalBestMoves:
            random.shuffle(legalMoves)
            for m in legalMoves:
                random.shuffle(legalMoves)
                value = min(value, alphaBetaMax(alpha, beta, depth - 1)[0])
                if (value <= alpha):
                    return alpha, m
                if (value < beta):
                    beta = value
                    bestMove = m
                    bestMove.notation = parser.notationForMove(bestMove)
        #return {'beta': beta, 'bestMove': bestMove}
        return beta, bestMove
        #return bestMove

    score, action = alphaBetaMax(-999999, 999999, 3)
    return score, action