// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.shopping.css.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/protobuf/empty.proto";

option csharp_namespace = "Google.Shopping.Css.V1";
option go_package = "cloud.google.com/go/shopping/css/apiv1/csspb;csspb";
option java_multiple_files = true;
option java_outer_classname = "AccountsLabelsProto";
option java_package = "com.google.shopping.css.v1";
option php_namespace = "Google\\Shopping\\Css\\V1";
option ruby_package = "Google::Shopping::Css::V1";

// Manages Merchant Center and CSS accounts labels.
service AccountLabelsService {
  option (google.api.default_host) = "css.googleapis.com";
  option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/content";

  // Lists the labels assigned to an account.
  rpc ListAccountLabels(ListAccountLabelsRequest)
      returns (ListAccountLabelsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=accounts/*}/labels"
    };
    option (google.api.method_signature) = "parent";
  }

  // Creates a new label, not assigned to any account.
  rpc CreateAccountLabel(CreateAccountLabelRequest) returns (AccountLabel) {
    option (google.api.http) = {
      post: "/v1/{parent=accounts/*}/labels"
      body: "account_label"
    };
    option (google.api.method_signature) = "parent,account_label";
  }

  // Updates a label.
  rpc UpdateAccountLabel(UpdateAccountLabelRequest) returns (AccountLabel) {
    option (google.api.http) = {
      patch: "/v1/{account_label.name=accounts/*/labels/*}"
      body: "account_label"
    };
    option (google.api.method_signature) = "account_label";
  }

  // Deletes a label and removes it from all accounts to which it was assigned.
  rpc DeleteAccountLabel(DeleteAccountLabelRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/{name=accounts/*/labels/*}"
    };
    option (google.api.method_signature) = "name";
  }
}

// Label assigned by CSS domain or CSS group to one of its sub-accounts.
message AccountLabel {
  option (google.api.resource) = {
    type: "css.googleapis.com/AccountLabel"
    pattern: "accounts/{account}/labels/{label}"
    plural: "accountLabels"
    singular: "accountLabel"
  };

  // The label type.
  enum LabelType {
    // Unknown label type.
    LABEL_TYPE_UNSPECIFIED = 0;

    // Indicates that the label was created manually.
    MANUAL = 1;

    // Indicates that the label was created automatically by CSS Center.
    AUTOMATIC = 2;
  }

  // The resource name of the label.
  // Format: accounts/{account}/labels/{label}
  string name = 1;

  // Output only. The ID of the label.
  int64 label_id = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The ID of account this label belongs to.
  int64 account_id = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The display name of this label.
  optional string display_name = 4;

  // The description of this label.
  optional string description = 5;

  // Output only. The type of this label.
  LabelType label_type = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Request message for the `ListAccountLabels` method.
message ListAccountLabelsRequest {
  // Required. The parent account.
  // Format: accounts/{account}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "css.googleapis.com/AccountLabel"
    }
  ];

  // The maximum number of labels to return. The service may return fewer than
  // this value.
  // If unspecified, at most 50 labels will be returned.
  // The maximum value is 1000; values above 1000 will be coerced to 1000.
  int32 page_size = 2;

  // A page token, received from a previous `ListAccountLabels` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `ListAccountLabels` must
  // match the call that provided the page token.
  string page_token = 3;
}

// Response message for the `ListAccountLabels` method.
message ListAccountLabelsResponse {
  // The labels from the specified account.
  repeated AccountLabel account_labels = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for the 'CreateAccountLanel' method.
message CreateAccountLabelRequest {
  // Required. The parent account.
  // Format: accounts/{account}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "css.googleapis.com/AccountLabel"
    }
  ];

  // Required. The label to create.
  AccountLabel account_label = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for the `UpdateAccountLabel` method.
message UpdateAccountLabelRequest {
  // Required. The updated label. All fields must be provided.
  AccountLabel account_label = 1 [(google.api.field_behavior) = REQUIRED];
}

// Request message for the 'DeleteAccountLabel' method.
message DeleteAccountLabelRequest {
  // Required. The name of the label to delete.
  // Format:  accounts/{account}/labels/{label}
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "css.googleapis.com/AccountLabel"
    }
  ];
}
