syntax = "proto3";

package devvit.plugin.redditapi.users;

import "devvit/plugin/redditapi/common/common_msg.proto";
import "devvit/plugin/redditapi/users/users_msg.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/wrappers.proto";

option go_package = "github.snooguts.net/reddit/reddit-devplatform-monorepo/go-common/generated/protos/types/devvit/plugin/redditapi";
option java_package = "com.reddit.devvit.plugin.redditapi.users";

// USERS - https://www.reddit.com/dev/api#section_users
// Note: all endpoints require oauth
service Users {
  // https://www.reddit.com/dev/api#POST_api_block_user
  rpc BlockUser(BlockUserRequest) returns (BlockUserResponse) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/api/block_user';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = FORM_SNAKE;
    option (devvit.plugin.redditapi.common.api_client_config).enforce_json = true;
  }

  // https://www.reddit.com/dev/api#POST_api_friend
  rpc Friend(FriendRequest) returns (devvit.plugin.redditapi.common.JsonStatus) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/friend';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = FORM_SNAKE;
    option (devvit.plugin.redditapi.common.api_client_config).enforce_json = true;
  }

  // https://www.reddit.com/dev/api#POST_api_report_user
  rpc ReportUser(ReportUserRequest) returns (google.protobuf.Empty) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/api/report_user';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = FORM_SNAKE;
  }

  // https://www.reddit.com/dev/api#POST_api_setpermissions
  rpc SetPermissions(SetPermissionsRequest) returns (devvit.plugin.redditapi.common.JsonStatus) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/setpermissions';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = FORM_SNAKE;
    option (devvit.plugin.redditapi.common.api_client_config).enforce_json = true;
  }

  // https://www.reddit.com/dev/api#POST_api_unfriend
  rpc Unfriend(UnfriendRequest) returns (google.protobuf.Empty) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/unfriend';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = FORM_SNAKE;
  }

  // https://www.reddit.com/dev/api#GET_api_user_data_by_account_ids
  rpc UserDataByAccountIds(UserDataByAccountIdsRequest) returns (UserDataByAccountIdsResponse);

  // https://www.reddit.com/dev/api#GET_api_username_available
  rpc UsernameAvailable(UsernameAvailableRequest) returns (google.protobuf.BoolValue) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'GET';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/api/username_available?user={user}';
    option (devvit.plugin.redditapi.common.api_client_config).use_custom_response_parser = true;
  }

  // https://www.reddit.com/dev/api#DELETE_api_v1_me_friends_username
  rpc UnfriendUser(GenericUsersRequest) returns (google.protobuf.Empty) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'DELETE';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/api/v1/me/friends/{username}?id={id}';
  }

  // https://www.reddit.com/dev/api#GET_api_v1_me_friends_username
  // TODO: this actually returns a WrappedRedditObject. Fix this up after the system worker is deleted.
  rpc GetFriendInformation(GenericUsersRequest) returns (GeneralFriendResponse) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'GET';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/api/v1/me/friends/{username}?id={id}';
  }

  // https://www.reddit.com/dev/api#PUT_api_v1_me_friends_username
  rpc UpdateFriendRelationship(UpdateFriendRelationshipRequest) returns (GeneralFriendResponse) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'PUT';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/api/v1/me/friends/{name}';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
  }

  // https://www.reddit.com/dev/api#GET_api_v1_user_username_trophies
  rpc UserTrophies(GenericUsersRequest) returns (UserTrophiesResponse) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'GET';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/api/v1/user/{username}/trophies?id={id}';
  }

  // https://www.reddit.com/dev/api#GET_user_username_about
  rpc UserAbout(UserAboutRequest) returns (UserAboutResponse) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'GET';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/user/{username}/about';
  }

  // https://www.reddit.com/dev/api#GET_user_username_where
  rpc UserWhere(UserWhereRequest) returns (devvit.plugin.redditapi.common.Listing) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'GET';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/user/{username}/{where}?context={context}&show={show}&sort={sort}&t={t}&type={type}&after={after}&before={before}&count={count}&limit={limit}';
  }

  // Returns the karma for a given user in the specified subreddit.
  rpc GetUserKarmaForSubreddit(GetUserKarmaForSubredditRequest) returns (GetUserKarmaForSubredditResponse);
}
