// Copyright 2023 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.cloud.paymentgateway.issuerswitch.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/cloud/paymentgateway/issuerswitch/v1/common_fields.proto";
import "google/protobuf/empty.proto";

option csharp_namespace = "Google.Cloud.PaymentGateway.IssuerSwitch.V1";
option go_package = "cloud.google.com/go/paymentgateway/issuerswitch/apiv1/issuerswitchpb;issuerswitchpb";
option java_multiple_files = true;
option java_outer_classname = "RulesProto";
option java_package = "com.google.cloud.paymentgateway.issuerswitch.v1";
option php_namespace = "Google\\Cloud\\PaymentGateway\\IssuerSwitch\\V1";
option ruby_package = "Google::Cloud::PaymentGateway::IssuerSwitch::V1";

// Manages rules used by the issuer switch's rules engine.
service IssuerSwitchRules {
  option (google.api.default_host) = "issuerswitch.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // List all rules that are applied on transactions by the issuer switch. Rules
  // can be filtered on API type and transaction type.
  rpc ListRules(ListRulesRequest) returns (ListRulesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*}/rules"
    };
    option (google.api.method_signature) = "parent";
  }

  // List all rule metadata for a given rule identifier.
  rpc ListRuleMetadata(ListRuleMetadataRequest)
      returns (ListRuleMetadataResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/rules/*}/metadata"
    };
    option (google.api.method_signature) = "parent";
  }

  // List all metadata values for a rule metadata identifier.
  rpc ListRuleMetadataValues(ListRuleMetadataValuesRequest)
      returns (ListRuleMetadataValuesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/rules/*/metadata/*}/values"
    };
    option (google.api.method_signature) = "parent";
  }

  // Create (add) multiple values to the list of values under the specified rule
  // metadata resource.
  rpc BatchCreateRuleMetadataValues(BatchCreateRuleMetadataValuesRequest)
      returns (BatchCreateRuleMetadataValuesResponse) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/rules/*/metadata/*}/values:batchCreate"
      body: "*"
    };
    option (google.api.method_signature) = "parent";
  }

  // Delete (remove) multiple values from the list of values under the specified
  // rules metadata resource.
  rpc BatchDeleteRuleMetadataValues(BatchDeleteRuleMetadataValuesRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/rules/*/metadata/*}/values:batchDelete"
      body: "*"
    };
    option (google.api.method_signature) = "parent";
  }
}

// A rule that is executed by the issuer switch while processing an
// API transaction.
message Rule {
  option (google.api.resource) = {
    type: "issuerswitch.googleapis.com/Rule"
    pattern: "projects/{project}/rules/{rule}"
  };

  // The unique identifier for this resource.
  // Format: projects/{project}/rules/{rule}
  string name = 1;

  // The description of the rule.
  string rule_description = 2;

  // The API Type for which this rule gets executed. A value of
  // `API_TYPE_UNSPECIFIED` indicates that the rule is executed for all API
  // transactions.
  ApiType api_type = 3;

  // The transaction type for which this rule gets executed. A value of
  // `TRANSACTION_TYPE_UNSPECIFIED` indicates that the rule is executed for
  // all transaction types.
  TransactionType transaction_type = 4;
}

// The metadata associated with a rule. This defines data that are used by the
// rule during execution.
message RuleMetadata {
  option (google.api.resource) = {
    type: "issuerswitch.googleapis.com/RuleMetadata"
    pattern: "projects/{project}/rules/{rule}/metadata/{metadata}"
  };

  // The type of metadata.
  enum Type {
    // Unspecified type.
    TYPE_UNSPECIFIED = 0;

    // List type. Indicates that the metadata contains a list of values which
    // the rule requires for execution.
    LIST = 1;
  }

  // The unique identifier for this resource.
  // Format: projects/{project}/rules/{rule}/metadata/{metadata}
  string name = 1;

  // The description of the rule metadata.
  string description = 2;

  // Type of rule metadata.
  Type type = 3;
}

// Represent a single value in a rule's metadata.
message RuleMetadataValue {
  option (google.api.resource) = {
    type: "issuerswitch.googleapis.com/RuleMetadataValue"
    pattern: "projects/{project}/rules/{rule}/metadata/{metadata}/values/{value}"
  };

  // Output only. The unique identifier for this resource.
  // Format: projects/{project}/rules/{rule}/metadata/{metadata}/values/{value}
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The value of the resource which could be of type string or
  // AccountReference. The metadata values for rules
  // BlockedPayeeAccountReqPayDebitRule, BlockedPayerAccountReqPayDebitRule,
  // BlockedPayeeAccountReqPayCreditRule and BlockedPayerAccountReqPayCreditRule
  // should be of type AccountReference. For all other rules, metadata values
  // should be of type string.
  //
  // The length of the `value` field depends on the type of
  // the value being used for the rule metadata. The following are the minimum
  // and maximum lengths for the different types of values.
  //
  // Value Type | Minimum Length | Maximum Length |
  // -------- | -------- | -------- |
  // Bank account IFSC   | 11   | 11   |
  // Bank account number   | 1   | 255  |
  // Device identifier   | 1   | 255   |
  // Mobile number   | 12   | 12  |
  // Virtual private address (VPA)   | 3   | 255   |
  oneof value {
    // The value for string metadata.
    string id = 2;

    // The value for account reference metadata.
    AccountReference account_reference = 3;
  }
}

// Request body for the `ListRules` method.
message ListRulesRequest {
  // Required. The parent resource must have the format of `projects/{project}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "issuerswitch.googleapis.com/Rule"
    }
  ];

  // The maximum number of rules to return. The service may return fewer
  // than this value. If unspecified or if the specified value is less than 50,
  // at most 50 rules 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 `ListRulesRequest` call.
  // Specify this parameter to retrieve the next page of rules.
  string page_token = 3;
}

// Response body for the `ListRules` method.
message ListRulesResponse {
  // List of rules satisfying the specified filter criteria.
  repeated Rule rules = 1;

  // Pass this token in a subsequent `ListRulesRequest` call to continue to list
  // results. If all results have been returned, this field is an empty string
  // or not present in the response.
  string next_page_token = 2;

  // Total number of rules matching request criteria across all pages.
  int64 total_size = 3;
}

// Request body for the `ListRuleMetadata` method.
message ListRuleMetadataRequest {
  // Required. The parent resource. The format is
  // `projects/{project}/rules/{rule}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "issuerswitch.googleapis.com/RuleMetadata"
    }
  ];

  // The maximum number of rule metadata to return. The service may return fewer
  // than this value. If unspecified or if the specified value is less than 50,
  // at most 50 rule metadata 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 `ListRuleMetadataRequest` call.
  // Specify this parameter to retrieve the next page of rule metadata.
  string page_token = 3;
}

// Response body for the `ListRuleMetadata` method.
message ListRuleMetadataResponse {
  // List of rule metadata associated with the rule.
  repeated RuleMetadata rule_metadata = 1;

  // Pass this token in a subsequent `ListRuleMetadataRequest` call to continue
  // to list results. If all results have been returned, this field is an empty
  // string or not present in the response.
  string next_page_token = 2;

  // Total number of rule metadata matching request criteria across all pages.
  int64 total_size = 3;
}

// Request body for the `ListRuleMetadataValues` method.
message ListRuleMetadataValuesRequest {
  // Required. The parent resource. The format is
  // `projects/{project}/rules/{rule}/metadata/{metadata}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "issuerswitch.googleapis.com/RuleMetadataValue"
    }
  ];

  // The maximum number of metadata values to return. The service may return
  // fewer than this value. If unspecified or if the specified value is less
  // than 1, at most 50 rule metadata values 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 `ListRuleMetadataValuesRequest`
  // call. Specify this parameter to retrieve the next page of rule metadata
  // values.
  string page_token = 3;
}

// Response body for ListRuleMetadataValues. Contains a List of values for a
// given rule metadata resource.
message ListRuleMetadataValuesResponse {
  // List of values for a given rule metadata resource identifier.
  repeated RuleMetadataValue rule_metadata_values = 1;

  // Pass this token in a subsequent `ListRuleMetadataValuesRequest` call to
  // continue to list results. If all results have been returned, this field is
  // an empty string or not present in the response.
  string next_page_token = 2;
}

// Request body for the `BatchCreateRuleMetadataValues` method.
message BatchCreateRuleMetadataValuesRequest {
  // The parent resource shared by all ruleMetadataValue being created. The
  // format is `projects/{project}/rules/{rule}/metadata/{metadata}`. The
  // [CreateRuleMetadataValueRequest.parent][google.cloud.paymentgateway.issuerswitch.v1.CreateRuleMetadataValueRequest.parent]
  // field in the
  // [CreateRuleMetadataValueRequest][google.cloud.paymentgateway.issuerswitch.v1.CreateRuleMetadataValueRequest]
  // messages contained in this request must match this field.
  string parent = 1 [(google.api.resource_reference) = {
    child_type: "issuerswitch.googleapis.com/RuleMetadataValue"
  }];

  // Required. The request message specifying the resources to create.
  // A maximum of 1000 RuleMetadataValues can be created in a batch.
  repeated CreateRuleMetadataValueRequest requests = 2
      [(google.api.field_behavior) = REQUIRED];
}

// Response body for the `BatchCreateRuleMetadataValues` method.
message BatchCreateRuleMetadataValuesResponse {
  // List of RuleMetadataValue created.
  repeated RuleMetadataValue rule_metadata_value = 1;
}

// Request for creating a single `RuleMetadataValue`.
message CreateRuleMetadataValueRequest {
  // Required. The parent resource where this RuleMetadataValue will be created.
  // The format is `projects/{project}/rules/{rule}/metadata/{metadata}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "issuerswitch.googleapis.com/RuleMetadataValue"
    }
  ];

  // Required. The rule metadata value to create or add to a list.
  RuleMetadataValue rule_metadata_value = 2
      [(google.api.field_behavior) = REQUIRED];
}

// Request body for the `BatchDeleteRuleMetadataValues` method.
message BatchDeleteRuleMetadataValuesRequest {
  // The parent resource shared by all RuleMetadataValues being deleted. The
  // format is `projects/{project}/rules/{rule}/metadata/{metadata}`. If this is
  // set, the parent of all of the RuleMetadataValues specified in the
  // list of names must match this field.
  string parent = 1 [(google.api.resource_reference) = {
    child_type: "issuerswitch.googleapis.com/RuleMetadataValue"
  }];

  // Required. The names of the rule metadata values to delete.
  // A maximum of 1000 RuleMetadataValue can be deleted in a batch.
  // Format: projects/{project}/rules/{rule}/metadata/{metadata}/values/{value}
  repeated string names = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "issuerswitch.googleapis.com/RuleMetadataValue"
    }
  ];
}
