syntax = "proto3";

package devvit.plugin.redditapi.widgets;

import "devvit/plugin/redditapi/common/common_msg.proto";
import "devvit/plugin/redditapi/widgets/widgets_msg.proto";
import "google/protobuf/empty.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.widgets";

// WIDGETS - https://www.reddit.com/dev/api#section_widgets
service Widgets {
  // Add a button widget to a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#POST_api_widget}
  rpc AddButtonWidget(AddButtonWidgetRequest) returns (ButtonWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'button';
  }
  // Add an image widget to a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#POST_api_widget}
  rpc AddImageWidget(AddImageWidgetRequest) returns (ImageWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'image';
  }
  // Add a calendar widget to a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#POST_api_widget}
  rpc AddCalendarWidget(AddCalendarWidgetRequest) returns (CalendarWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'calendar';
  }
  // Add a text widget to a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#POST_api_widget}
  rpc AddTextAreaWidget(AddTextAreaWidgetRequest) returns (TextAreaWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'textarea';
  }
  // Add a community list widget to a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#POST_api_widget}
  rpc AddCommunityListWidget(AddCommunityListWidgetRequest) returns (CommunityListWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'community-list';
  }
  // Add a post flair widget to a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#POST_api_widget}
  rpc AddPostFlairWidget(AddPostFlairWidgetRequest) returns (PostFlairWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'post-flair';
  }
  // Add a custom widget to a subreddit. This is an experimental feature.
  // Custom widgets don't display on mobile devices. Customizations can break at any time
  //
  // @see {@link https://www.reddit.com/dev/api#POST_api_widget}
  rpc AddCustomWidget(AddCustomWidgetRequest) returns (CustomWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'custom';
  }
  // Delete a widget from a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#DELETE_api_widget_%7Bwidget_id%7D}
  rpc DeleteWidget(DeleteWidgetRequest) returns (google.protobuf.Empty) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'DELETE';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget/{id}';
  }
  // Update a button widget on a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#PUT_api_widget_%7Bwidget_id%7D}
  rpc UpdateButtonWidget(UpdateButtonWidgetRequest) returns (ButtonWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'PUT';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget/{id}';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'button';
  }
  // Update an image widget on a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#PUT_api_widget_%7Bwidget_id%7D}
  rpc UpdateImageWidget(UpdateImageWidgetRequest) returns (ImageWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'PUT';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget/{id}';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'image';
  }
  // Update a calendar widget on a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#PUT_api_widget_%7Bwidget_id%7D}
  rpc UpdateCalendarWidget(UpdateCalendarWidgetRequest) returns (CalendarWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'PUT';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget/{id}';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'calendar';
  }
  // Update a text widget on a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#PUT_api_widget_%7Bwidget_id%7D}
  rpc UpdateTextAreaWidget(UpdateTextAreaWidgetRequest) returns (TextAreaWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'PUT';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget/{id}';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'textarea';
  }
  // Update a community list widget on a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#PUT_api_widget_%7Bwidget_id%7D}
  rpc UpdateCommunityListWidget(UpdateCommunityListWidgetRequest) returns (UpdateCommunityListWidgetResponse) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'PUT';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget/{id}';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'community-list';
  }
  // Update a post flair widget on a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#PUT_api_widget_%7Bwidget_id%7D}
  rpc UpdatePostFlairWidget(UpdatePostFlairWidgetRequest) returns (PostFlairWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'PUT';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget/{id}';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'post-flair';
  }
  // Update a custom widget on a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#PUT_api_widget_%7Bwidget_id%7D}
  rpc UpdateCustomWidget(UpdateCustomWidgetRequest) returns (CustomWidget) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'PUT';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget/{id}';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = JSON_CAMEL;
    option (devvit.plugin.redditapi.common.api_client_config).request_kind_value = 'custom';
  }
  // Get an S3 upload lease for a widget image. This is used to upload images for image widgets.
  //
  // @see {@link https://www.reddit.com/dev/api#POST_api_widget_image_upload_s3}
  rpc GetWidgetImageUploadLease(GetWidgetImageUploadLeaseRequest) returns (GetWidgetImageUploadLeaseResponse) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'POST';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widget_image_upload_s3';
    option (devvit.plugin.redditapi.common.api_client_config).request_body_type = FORM_CAMEL;
  }
  // Update the order of widgets on a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#PATCH_api_widget_order_%7Bsection%7D}
  rpc OrderWidgets(OrderWidgetsRequest) returns (google.protobuf.Empty) {}
  // Get a list of widgets on a subreddit.
  //
  // @see {@link https://www.reddit.com/dev/api#GET_api_widgets}
  rpc GetWidgets(GetWidgetsRequest) returns (GetWidgetsResponse) {
    option (devvit.plugin.redditapi.common.api_client_config).method = 'GET';
    option (devvit.plugin.redditapi.common.api_client_config).path = '/r/{subreddit}/api/widgets';
  }
}
