/*
   * get the latest version of this post
   */
  private void updatePost() {
    if (!hasPost() || !mPost.isWP()) {
      return;
    }

    final int numLikesBefore = ReaderLikeTable.getNumLikesForPost(mPost);

    ReaderActions.UpdateResultListener resultListener =
        new ReaderActions.UpdateResultListener() {
          @Override
          public void onUpdateResult(ReaderActions.UpdateResult result) {
            if (!isAdded()) {
              return;
            }
            // if the post has changed, reload it from the db and update the like/comment counts
            if (result.isNewOrChanged()) {
              mPost = ReaderPostTable.getPost(mBlogId, mPostId, false);
              refreshIconCounts();
            }
            // refresh likes if necessary - done regardless of whether the post has changed
            // since it's possible likes weren't stored until the post was updated
            if (result != ReaderActions.UpdateResult.FAILED
                && numLikesBefore != ReaderLikeTable.getNumLikesForPost(mPost)) {
              refreshLikes();
            }
          }
        };
    ReaderPostActions.updatePost(mPost, resultListener);
  }
  /** like/unlike the passed post */
  public static boolean performLikeAction(final ReaderPost post, final boolean isAskingToLike) {
    // do nothing if post's like state is same as passed
    boolean isCurrentlyLiked = ReaderPostTable.isPostLikedByCurrentUser(post);
    if (isCurrentlyLiked == isAskingToLike) {
      AppLog.w(T.READER, "post like unchanged");
      return false;
    }

    // update like status and like count in local db
    int numCurrentLikes = ReaderPostTable.getNumLikesForPost(post.blogId, post.postId);
    int newNumLikes = (isAskingToLike ? numCurrentLikes + 1 : numCurrentLikes - 1);
    if (newNumLikes < 0) {
      newNumLikes = 0;
    }
    ReaderPostTable.setLikesForPost(post, newNumLikes, isAskingToLike);
    ReaderLikeTable.setCurrentUserLikesPost(post, isAskingToLike);

    final String actionName = isAskingToLike ? "like" : "unlike";
    String path = "sites/" + post.blogId + "/posts/" + post.postId + "/likes/";
    if (isAskingToLike) {
      path += "new";
    } else {
      path += "mine/delete";
    }

    com.wordpress.rest.RestRequest.Listener listener =
        new RestRequest.Listener() {
          @Override
          public void onResponse(JSONObject jsonObject) {
            AppLog.d(T.READER, String.format("post %s succeeded", actionName));
          }
        };

    RestRequest.ErrorListener errorListener =
        new RestRequest.ErrorListener() {
          @Override
          public void onErrorResponse(VolleyError volleyError) {
            String error = VolleyUtils.errStringFromVolleyError(volleyError);
            if (TextUtils.isEmpty(error)) {
              AppLog.w(T.READER, String.format("post %s failed", actionName));
            } else {
              AppLog.w(T.READER, String.format("post %s failed (%s)", actionName, error));
            }
            AppLog.e(T.READER, volleyError);
            ReaderPostTable.setLikesForPost(post, post.numLikes, post.isLikedByCurrentUser);
            ReaderLikeTable.setCurrentUserLikesPost(post, post.isLikedByCurrentUser);
          }
        };

    WordPress.getRestClientUtilsV1_1().post(path, listener, errorListener);
    return true;
  }
  /*
   * updates local liking users based on the "likes" meta section of the post's json - requires
   * using the /sites/ endpoint with ?meta=likes - returns true if likes have changed
   */
  private static boolean handlePostLikes(final ReaderPost post, JSONObject jsonPost) {
    if (post == null || jsonPost == null) {
      return false;
    }

    JSONObject jsonLikes = JSONUtils.getJSONChild(jsonPost, "meta/data/likes");
    if (jsonLikes == null) {
      return false;
    }

    ReaderUserList likingUsers = ReaderUserList.fromJsonLikes(jsonLikes);
    ReaderUserIdList likingUserIds = likingUsers.getUserIds();

    ReaderUserIdList existingIds = ReaderLikeTable.getLikesForPost(post);
    if (likingUserIds.isSameList(existingIds)) {
      return false;
    }

    ReaderUserTable.addOrUpdateUsers(likingUsers);
    ReaderLikeTable.setLikesForPost(post, likingUserIds);
    return true;
  }