/*
 * Created by pkalmykov@pluto.tv on 10/23/2022.
 * Copyright (c) PlutoTV Inc 2020.
 */

syntax = "proto3";

package vodcategorypackage;

option go_package = "github.com/Pluto-tv/service-dal/golang_client";
option java_package = "tv.pluto.ip.dal.vodcategory";

service VodCategoryManager {
  // GetById (Unary)
  //
  rpc GetById(GetByIdRequest) returns (GetByIdResponse) {}

  // GetByEpisodeId (Unary)
  //
  rpc GetByEpisodeId(GetByEpisodeIdRequest) returns (GetByEpisodeIdResponse) {}

  // GetByIds (Unary)
  //
  rpc GetByIds(GetByIdsRequest) returns (GetByIdsResponse) {}

  // GetAllPaged (Unary)
  //
  rpc GetAllPaged(GetAllPagedRequest) returns (GetAllPagedResponse) {}

  rpc UpdateFields(UpdateFieldsRequest) returns (UpdateFieldsResponse) {}

  rpc Create(CreateRequest) returns (CreateResponse) {}

  rpc GetPopulatedById(GetPopulatedByIdRequest) returns (GetPopulatedByIdResponse) {}

  rpc UpdateOrder(UpdateOrderRequest) returns (UpdateOrderResponse) {}

  // GetVodAutoPublishingSettings (Unary)
  //
  rpc GetVodAutoPublishingSettings(GetVodAutoPublishingSettingsRequest) returns (GetVodAutoPublishingSettingsResponse) {}
}

message Metadata {
  int32 current_offset = 1;
  int32 total_items = 2;
}

message GetAllPagedResponse {
  repeated VodCategory documents = 1;
  Metadata metadata = 2;
}

message GetAllPagedRequest {
  // how many results to return default 1000
  int32 limit = 1;
  // where to begin page default 0
  int32 offset = 2;
  // how to sort results
  repeated GetAllPagedSort sort = 3;
  // filters for paged results
  // published=boolean
  // officeOnly=boolean
  // activeRegion=string
  // kidsMode=boolean
  repeated Filter filters = 4;
  // when set to true the `total count` metadata will not be calculated
  // this can save some performance as count is additional query
  bool disable_total_count = 5;
  RegionFilter region_filter_query = 6;
  repeated string projection = 7;
  // when set to true the `name` value will be sent to MongoDB as regex expression
  // when set to false the `name` value will be sent to MongoDB as a literal string
  bool enable_regex = 8;
}

message RegionFilter {
  repeated string include = 1;
  repeated string exclude = 2;
}

message Filter {
  // field to filter on
  string field = 1;
  // value for the filter
  string value = 2;
  // type of the filter string (default), number, bool
  string type = 3;
  // operator to filter by (values must be AND or OR)
  string operator = 4;
}

message GetByEpisodeIdRequest {
  string id = 1;
}

message GetByEpisodeIdResponse {
  repeated VodCategory documents = 1;
}

message GetByIdRequest {
  string id = 1;
}

message GetByIdResponse {
  VodCategory document = 1;
}

message GetByIdsRequest {
  repeated string ids = 1;
  repeated GetAllPagedSort sort = 2;
  repeated string projection = 3;
}

message GetAllPagedSort {
  // field to sort on
  string field = 1;
  // sort direction 1 | -1
  int32 value = 2;
}

message GetByIdsResponse {
  repeated VodCategory documents = 1;
}

message GenreSubGenre {
  string genre = 1;
  string sub_genre = 2;
}

message SettingsSort {
  string by = 1;
  string order = 2;
}

message VodSettings {
  bool enabled = 1;
  int32 auto_publish_start_position = 2;
  int32 total_count = 3;
  SettingsSort sort = 4;
  VodFilters filters = 5;
}

message VodFilters {
  repeated GenreSubGenre genre = 1;
  repeated string partner = 2;
  repeated string series_type = 3;
  repeated string age_range = 4;
  repeated string rating = 5;
}

message VodCategory {
  string id = 1;
  string name = 2;
  string display_name = 3;
  int32 order = 4;
  bool enabled = 5;
  bool pluto_office_only = 6;
  string enabled_at = 7;
  string description = 8;
  RegionFilter region_filter = 9;
  RegionFilter distribution = 10;
  string intile_channel = 11;
  int32 intile_order = 12;
  Path icon_svg = 13;
  Path icon_png = 14;
  Path image_featured = 15;
  string created_at = 16;
  string updated_at = 17;
  string disabled_at = 18;
  string active_region = 19;
  bool kids_mode = 20;
  repeated Category categories = 21;
  repeated CustomReference custom_references = 22;
  bool archived = 23;
  bool hero_carousel = 24;
  int32 title_count = 25;
  VodSettings settings = 26;

  message Path {
    string path = 1;
  }

  message RegionFilter {
    repeated string include = 1;
    repeated string exclude = 2;
  }
}

message Image {
  string path = 1;
  string title = 2;
}

message Window {
  string start_date = 1;
  string end_date = 2;
  string id = 3;
  int32 current_screenings = 4;
  int32 screenings = 5;
}

message AvailabilityWindows {
  repeated Window _a_v_o_d = 1 [json_name = "AVOD"];
  repeated Window linear = 2;
}

message VodCategoryEntriesSeries {
  string id = 1;
  Image poster = 2;
  repeated string vod_category_entries = 3;
  int32 episode_count = 4;
  AvailabilityWindows availability_windows = 5;
  string name = 6;
  string genre = 7;
  int32 season_count = 8;
}

message VodCategoryEntriesEpisode {
  string id = 1;
  string name = 2;
  string genre = 3;
  AvailabilityWindows availability_windows = 4;
  repeated string vod_category_entries = 5;
  Image poster = 6;
  int32 duration = 7;
}

message VodCategoryEntries {
  string id = 1;
  int32 order = 2;
  VodCategoryEntriesSeries series = 3;
  VodCategoryEntriesEpisode episode = 4;
  int32 total_duration = 5;
}

message VodCategoryPopulated {
  string id = 1;
  string name = 2;
  string display_name = 3;
  int32 order = 4;
  bool enabled = 5;
  bool pluto_office_only = 6;
  string enabled_at = 7;
  string description = 8;
  RegionFilter region_filter = 9;
  RegionFilter distribution = 10;
  string intile_channel = 11;
  int32 intile_order = 12;
  Path icon_svg = 13;
  Path icon_png = 14;
  Path image_featured = 15;
  string created_at = 16;
  string updated_at = 17;
  string disabled_at = 18;
  string active_region = 19;
  bool kids_mode = 20;
  repeated CategoryPopulated categories = 21;
  repeated CustomReference custom_references = 22;
  bool archived = 23;
  bool hero_carousel = 24;
  int32 title_count = 25;

  message Path {
    string path = 1;
  }

  message RegionFilter {
    repeated string include = 1;
    repeated string exclude = 2;
  }

  repeated VodCategoryEntries vod_category_entries = 26;
}

message CategoryPopulated {
  string id = 1;
  string cat_id = 2;
  int32 order = 3;
  string name = 4;
  MainCategory category_details = 5;
}

message MainCategory {
  string id = 1;
  string name = 2;
  int32 order = 3;
  Path svg_image_url = 4;
  Path png_image_url = 5;
  string created_at = 6;
  string updated_at = 7;
  string slug = 8;
  bool pluto_office_only = 9;
  string stacking_order = 10;
  Distribution distribution = 11;
  string active_region = 12;
}

message Distribution {
  repeated string app_names = 1;
  repeated string devices = 2;
}

message Path {
  string path = 1;
}

message Category {
  string id = 1;
  string cat_id = 2;
  int32 order = 3;
  string name = 4;
}

message CustomReference {
  string id = 1;
  string type = 2;
  string value = 3;
}

message UpdateFieldsRequest {
  string id = 1;
  VodCategory document = 2;
  repeated string update_fields = 3;
}

message UpdateFieldsResponse {
  VodCategory document = 1;
}

message CreateRequest {
  VodCategory document = 1;
}

message CreateResponse {
  VodCategory document = 1;
}

message GetPopulatedByIdRequest {
  string id = 1;
}

message GetPopulatedByIdResponse {
  VodCategoryPopulated document = 1;
}

message UpdateOrderElement {
  string id = 1;
  int32 order = 2;
}

message UpdateOrderRequest {
  repeated UpdateOrderElement documents = 1;
}

message UpdateOrderResponse {
  repeated UpdateOrderElement documents = 1;
}

message GetVodAutoPublishingSettingsRequest {
  string id = 1;
}

message GetVodAutoPublishingSettingsResponse {
  VodSettings document = 1;
}
