syntax = "proto3";

package reconstruct.platform.v1;
option csharp_namespace = "Cr.Reconstruct.External.Grpc";
option java_package = "dev.reconstruct.platform.v1";
option java_multiple_files = true;

import "google/protobuf/empty.proto";
import "google/protobuf/struct.proto";

// ----- Services -----
service PlatformService {
  rpc ListCatalogs (ListCatalogsRequest) returns (ListCatalogsResponse) {
  }

  rpc WatchCatalogs (WatchCatalogsRequest) returns (stream WatchCatalogsResponse);

  rpc GetCatalog (GetCatalogRequest) returns (GetCatalogResponse) {
  }

  rpc GetCatalogInsights (GetCatalogInsightsRequest) returns (CatalogInsightsResponse) {
  }

  // Public vocabulary only; no account, product or captured-content data.
  rpc GetCaptureOptions (google.protobuf.Empty) returns (CaptureOptionsResponse) {
  }

  rpc GetRequestOptions (google.protobuf.Empty) returns (RequestOptionsResponse) {
  }

  rpc CreateRequest (CreateRequestRequest) returns (CreateRequestResponse) {
  }

  rpc ListRequests (ListRequestsRequest) returns (ListRequestsResponse) {
  }
  rpc WatchRequests (WatchRequestsRequest) returns (stream WatchRequestsResponse);

  rpc GetRequest (GetRequestRequest) returns (GetRequestResponse) {
  }
  rpc GetCatalogFile (GetCatalogFileRequest) returns (BinaryFileResponse) { }
  rpc GetAppearance (google.protobuf.Empty) returns (AppearanceResponse) { }
  rpc UpdateAppearance (UpdateAppearanceRequest) returns (AppearanceResponse) { }
  rpc GetAvatar (google.protobuf.Empty) returns (BinaryFileResponse) { }
  rpc UpdateAvatar (UpdateAvatarRequest) returns (google.protobuf.Empty) { }
  rpc DeleteAvatar (google.protobuf.Empty) returns (google.protobuf.Empty) { }
  rpc ListPersonalTokens (google.protobuf.Empty) returns (ListPersonalTokensResponse) { }
  rpc CreatePersonalToken (CreatePersonalTokenRequest) returns (CreatedPersonalTokenResponse) { }
  rpc RevokePersonalToken (RevokePersonalTokenRequest) returns (google.protobuf.Empty) { }
  rpc GetAccountProfile (google.protobuf.Empty) returns (AccountDataResponse) { }
  rpc UpdateAccountProfile (UpdateAccountProfileRequest) returns (google.protobuf.Empty) { }
  rpc ConfirmAccountEmail (ConfirmAccountEmailRequest) returns (google.protobuf.Empty) { }
  rpc GetAccountCredentials (google.protobuf.Empty) returns (AccountDataResponse) { }
  rpc GetAccountSessions (google.protobuf.Empty) returns (AccountDataResponse) { }
  rpc TerminateAccountSession (TerminateAccountSessionRequest) returns (google.protobuf.Empty) { }

}

// ----- Enums -----
enum ProductRequestType {
  PRODUCT_REQUEST_TYPE_UNSPECIFIED = 0;
  PRODUCT_REQUEST_TYPE_ADD = 1;
  PRODUCT_REQUEST_TYPE_UPDATE = 2;
}

enum ProductRequestStatus {
  PRODUCT_REQUEST_STATUS_UNSPECIFIED = 0;
  PRODUCT_REQUEST_STATUS_PENDING = 1;
  PRODUCT_REQUEST_STATUS_APPROVED = 2;
  PRODUCT_REQUEST_STATUS_REJECTED = 3;
}

// ----- Models ------
message ListCatalogsRequest {
  int32 page_size = 1;
  string page_token = 2;
  string query = 3;
  string sort = 4;
  string screens = 5;
  string versions = 6;
  repeated string platforms = 7;
  repeated string technologies = 8;
  repeated string renderings = 9;
  repeated string categories = 10;
  repeated string languages = 11;
}

message CatalogFilterOption {
  string id = 1;
  string label = 2;
}

message CatalogFilters {
  repeated CatalogFilterOption platforms = 1;
  repeated CatalogFilterOption technologies = 2;
  repeated CatalogFilterOption renderings = 3;
  repeated CatalogFilterOption categories = 4;
  repeated CatalogFilterOption languages = 5;
}

message CatalogSummary {
  string catalog_id = 1;
  string name = 2;
  string kind = 3;
  string latest_version = 4;
  int32 version_count = 5;
  int32 screen_count = 6;
  repeated string preview_paths = 7;
  string latest_captured_at = 8;
  repeated string platforms = 9;
  repeated string technologies = 10;
  string rendering = 11;
  string default_locale = 12;
  repeated string categories = 13;
  repeated string locales = 14;
  repeated CatalogPlatform platform_variants = 15;
  repeated string detected_locales = 16;
}

message ListCatalogsResponse {
  repeated CatalogSummary catalogs = 1;
  string next_page_token = 2;
  CatalogFilters filters = 3;
}

message GetCatalogRequest {
  string catalog_id = 1;
  string version = 2;
}

message CatalogScreen {
  string page = 1;
  string view = 2;
  string title = 3;
  string source_url = 4;
  string image_path = 5;
  string locale = 6;
  string implementation = 7;
  string full_page_path = 8;
  repeated string section_paths = 9;
  string video_path = 10;
  bool capture_limited = 11;
  string interaction_video_path = 12;
}

message GetCatalogResponse {
  string catalog_id = 1;
  string name = 2;
  string kind = 3;
  string description = 4;
  string latest_version = 5;
  repeated string versions = 6;
  repeated CatalogScreen screens = 7;
  string latest_captured_at = 8;
  string default_locale = 9;
  repeated string locales = 10;
  repeated string categories = 11;
  repeated CatalogPlatform platforms = 12;
  repeated string detected_locales = 13;
  string version = 14;
}

message RequestPlatformOption {
  string id = 1;
  string label = 2;
  repeated CatalogFilterOption environments = 3;
}

message CaptureOptionsResponse {
  repeated RequestPlatformOption platforms = 1;
  string default_platform = 2;
  string default_environment = 3;
  repeated RequestPlatformOption request_platforms = 4;
}

message RequestOptionsResponse {
  repeated RequestPlatformOption platforms = 1;
}

message CreateRequestRequest {
  ProductRequestType request_type = 5;
  string url = 4;
  string catalog_id = 1;
  string subject = 2;
  string payload_json = 3;
  string view = 6;
  string implementation = 7;
}

message CreateRequestResponse {
  string request_id = 1;
  ProductRequestStatus status = 2;
}

message GetRequestRequest {
  string request_id = 1;
}

message GetRequestResponse {
  ProductRequestType request_type = 15;
  string request_id = 1;
  string catalog_id = 2;
  string subject = 3;
  ProductRequestStatus status = 4;
  string payload_json = 5;
  string url = 6;
  string created_at = 7;
  string reviewed_at = 8;
  string decision_reason = 9;
  string job_id = 10;
  string job_status = 11;
  string safety_status = 12;
  string safety_details = 13;
  string safety_checked_at = 14;
}

message WatchCatalogsRequest { string catalog_id = 1; string revision = 2; }

message WatchCatalogsResponse { bool changed = 1; string revision = 2; }

message WatchRequestsRequest { string scope = 1; string revision = 2; }

message WatchRequestsResponse { bool changed = 1; string revision = 2; }

message ListRequestsRequest {
  int32 page_size = 1;
  string page_token = 2;
  // mine (default), or public for requests from other users.
  string scope = 3;
}

message ListRequestsResponse {
  repeated GetRequestResponse requests = 1;
  string next_page_token = 2;
  string revision = 3;
}

message GetCatalogFileRequest { string catalog_id = 1; string path = 2; string version = 3; }

message BinaryFileResponse { bytes data = 1; string content_type = 2; }

message AppearanceResponse { string nickname = 1; bool has_avatar = 2; }

message UpdateAppearanceRequest { string nickname = 1; }

message UpdateAvatarRequest { bytes data = 1; }

message PersonalToken { string id = 1; string name = 2; repeated string scopes = 3; string created_at = 4; string expires_at = 5; string last_used_at = 6; }

message ListPersonalTokensResponse { repeated PersonalToken tokens = 1; }

message CreatePersonalTokenRequest { string name = 1; repeated string scopes = 2; int32 expires_in_days = 3; }

message CreatedPersonalTokenResponse { PersonalToken info = 1; string secret = 2; }

message RevokePersonalTokenRequest { string id = 1; }

message AccountDataResponse { google.protobuf.Value data = 1; }

message UpdateAccountProfileRequest { google.protobuf.Struct profile = 1; }

message ConfirmAccountEmailRequest { string token = 1; }

message TerminateAccountSessionRequest { string id = 1; }

message CatalogPlatform {
  string view = 1;
  string implementation = 2;
  repeated string locales = 3;
  optional bool captured = 4;
  string label = 5;
}

message GetCatalogInsightsRequest { string catalog_id = 1; string locale = 2; string view = 3; string implementation = 4; string section = 5; string version = 6; }

message CatalogTechnology { string name = 1; string version = 2; repeated string categories = 3; int32 confidence = 4; string website = 5; }

message CatalogFont { string family = 1; repeated string urls = 2; repeated string locales = 3; }

message CatalogTextStyle { string family = 1; string size = 2; string weight = 3; string line_height = 4; string letter_spacing = 5; string color = 6; int32 count = 7; string sample = 8; }

message CatalogAsset { string url = 1; string name = 2; string kind = 3; repeated string pages = 4; }

message CatalogColor { string value = 1; repeated string labels = 2; }

message CatalogColorTheme { string id = 1; string label = 2; repeated CatalogColor colors = 3; }

message CatalogInsightsResponse {
  string version = 1;
  repeated CatalogTechnology technologies = 2;
  string rendering = 3;
  repeated CatalogFont fonts = 4;
  repeated CatalogTextStyle text_styles = 5;
  repeated CatalogAsset assets = 6;
  int32 page_count = 7;
  bool technology_inventory = 8;
  repeated CatalogColorTheme color_themes = 9;
}
