// 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/field_behavior.proto";
import "google/type/latlng.proto";
import "google/type/money.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 = "CommonFieldsProto";
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";

// A reference to uniquely identify an account according to India's UPI
// standards.
message AccountReference {
  // IFSC of the account's bank branch.
  string ifsc = 1;

  // Output only. Type of account. Examples include SAVINGS, CURRENT, etc.
  string account_type = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Unique number for an account in a bank and branch.
  string account_number = 3;
}

// A participant in a payment settlement transaction processed by the issuer
// switch. The participant could either be the payer or the payee in the
// transaction.
message SettlementParticipant {
  // Details about a payment settlement.
  message SettlementDetails {
    // Output only. The id for the settlement in the bank's backend system. In
    // UPI, this maps to the approval reference number. This value will be
    // present only if this API transaction's state is SUCCEEDED.
    string backend_settlement_id = 1
        [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. A code indicating additional details about the settlement.
    // In UPI, this maps to the response code.
    string code = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. A code indicating additional details about the reversal of a
    // settlement. In UPI, this maps to the reversal response code.
    string reversal_code = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

    // Output only. The amount settled as part of this API transaction. If the
    // settlement had failed, then this value will be 0.00.
    google.type.Money settled_amount = 4
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // The participant information.
  Participant participant = 1;

  // Information about a merchant who is a participant in the payment. This
  // field will be specified only if the participant is a merchant.
  MerchantInfo merchant_info = 2;

  // Output only. The mobile number of the participant.
  string mobile = 3
      [deprecated = true, (google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Additional details about the payment settlement. Values will
  // be populated depending on whether the settlement transaction succeeded or
  // failed.
  SettlementDetails details = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A participant's device tags
message DeviceDetails {
  // The payment application on the device.
  string payment_app = 1;

  // The capability of the device.
  string capability = 2;

  // The geo-code of the device.
  google.type.LatLng geo_code = 3;

  // The device's ID.
  string id = 4;

  // The device's IP address.
  string ip_address = 5;

  // The coarse location of the device.
  string location = 6;

  // The operating system on the device.
  string operating_system = 7;

  // The device's telecom provider.
  string telecom_provider = 8;

  // The type of device.
  string type = 9;
}

// A participant in a transaction processed by the issuer switch.
message Participant {
  // The type of the participant.
  enum Persona {
    // Unspecified persona.
    PERSONA_UNSPECIFIED = 0;

    // Participant is an entity.
    ENTITY = 1;

    // Participant is a person.
    PERSON = 2;
  }

  // The payment address of the participant. In the UPI system, this will be the
  // virtual payment address (VPA) of the participant.
  string payment_address = 1;

  // The persona of the participant.
  Persona persona = 2;

  // The name of the participant.
  string user = 3;

  // Output only. Unique identification of an account according to India's UPI
  // standards.
  AccountReference account = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The device info of the participant.
  DeviceDetails device_details = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The mobile number of the participant.
  string mobile_number = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A merchant entity participating in a payment settlement transaction.
message MerchantInfo {
  // A unique identifier for the merchant.
  string id = 1;

  // The name of the merchant who is a party in the payment. Includes multiple
  // possible names for the merchant.
  MerchantName merchant = 2;

  // Additional information about the merchant.
  MerchantAdditionalInfo additional_info = 3;
}

// The name of a merchant who is a participant in a payment settlement
// transaction. Includes multiple possible names for the merchant.
message MerchantName {
  // The brand name of the merchant.
  string brand = 1;

  // The merchant's legal name.
  string legal = 2;

  // The franchise name under which the merchant operates.
  string franchise = 3;
}

// Additional merchant information specific to India's UPI requirements.
message MerchantAdditionalInfo {
  // Indicates the merchant's type as a small or large merchant.
  enum Type {
    // Unspecified merchant type.
    TYPE_UNSPECIFIED = 0;

    // Large merchant.
    LARGE = 1;

    // Small merchant.
    SMALL = 2;
  }

  // Indicates whether the merchant is an online or offline merchant.
  enum Genre {
    // Unspecified merchant genre.
    GENRE_UNSPECIFIED = 0;

    // Offline merchant
    OFFLINE = 1;

    // Online merchant.
    ONLINE = 2;
  }

  // Indicates whether the merchant has been onboarded by a bank or an
  // aggregator.
  enum OnboardingType {
    // Unspecified merchant onboarding type.
    ONBOARDING_TYPE_UNSPECIFIED = 0;

    // Onboarded by aggreagator.
    AGGREGATOR = 1;

    // Onboarded by bank.
    BANK = 2;

    // Onboarded by the UPI network.
    NETWORK = 3;

    // Onboarded by the TPAP.
    TPAP = 4;
  }

  // Indicates the ownership type of the merchant.
  enum OwnershipType {
    // Unspecified merchant ownership type.
    OWNERSHIP_TYPE_UNSPECIFIED = 0;

    // Properietary ownership.
    PROPRIETARY = 1;

    // Partnership ownership.
    PARTNERSHIP = 2;

    // Public ownership.
    PUBLIC = 3;

    // Private ownership.
    PRIVATE = 4;

    // Other ownership model.
    OTHERS = 5;
  }

  // Merchant Category Code (MCC) as specified by UPI. This is a four-digit
  // number listed in ISO 18245 for retail financial services.
  string category_code = 1;

  // A unique identifier for the merchant store where the payment settlement
  // transaction occurred.
  string store_id = 2;

  // A unique identifier for the POS terminal in the store where the payment
  // settlement transaction occurred.
  string terminal_id = 3;

  // Indicates the type of merchant.
  Type type = 4;

  // Indicates the genre of the merchant.
  Genre genre = 5;

  // Indicates the merchant's onboarding type.
  OnboardingType onboarding_type = 6;

  // Indicates the merchant's owner type.
  OwnershipType ownership_type = 7;
}

// The API type for a transaction. Every transaction processed by the issuer
// switch will be one of these API types.
enum ApiType {
  // Unspecified API type.
  API_TYPE_UNSPECIFIED = 0;

  // Balance API. Maps to UPI's `BalEnq` API. This is a metadata
  // transaction API.
  BALANCE = 1;

  // Check transaction status API. Maps to UPI's `ChkTxn` API. This is a
  // metadata transaction API.
  CHECK_STATUS = 2;

  // Complaint API. Maps to UPI's `Complaint` API. This is a dispute and issue
  // resolution API.
  COMPLAINT = 3;

  // Heart beat API. Maps to UPI's `Hbt` API. This is a metadata transaction
  // API.
  HEART_BEAT = 4;

  // Initiate registration API. Maps to UPI's `Otp` API. This is a metadata
  // transaction API.
  INITIATE_REGISTRATION = 5;

  // List accounts API. Maps to UPI's `ListAccount` API. This is a metadata
  // transaction API.
  LIST_ACCOUNTS = 6;

  // Mandate API. Maps to UPI's `Mandate` API. This is a metadata transaction
  // API.
  MANDATE = 7;

  // Mandate confirmation API. Maps to UPI's `MandateConfirmation` API. This is
  // a metadata transaction API.
  MANDATE_CONFIRMATION = 8;

  // Payment settlement API. Maps to UPI's `Pay` API. This is a financial
  // transaction API.
  SETTLE_PAYMENT = 9;

  // Update credentials API. Maps to UPI's `SetCre` API. This is a metadata
  // transaction API.
  UPDATE_CREDENTIALS = 10;

  // Validate registration API. Maps to UPI's `RegMob` API. This is a metadata
  // transaction API.
  VALIDATE_REGISTRATION = 11;

  // Validate customer API. Maps to UPI's `ValCust` API. This is a validation
  // API.
  VALIDATE_CUSTOMER = 12;

  // Voucher API. Maps to UPI's `Voucher` API.
  VOUCHER = 13;

  // Voucher confirmation API. Maps to UPI's `VoucherConfirmation` API.
  VOUCHER_CONFIRMATION = 14;

  // Activation API. Maps to UPI's `Activation` API.
  ACTIVATION = 15;
}

// The type of a transaction. Every transaction processed by the issuer switch
// will be one of these transaction types. Transaction types are associated with
// a particular API type. This associated is documented with each value.
enum TransactionType {
  // Unspecified transaction type.
  TRANSACTION_TYPE_UNSPECIFIED = 0;

  // Autoupdate transaction type. This is associated with the `CHECK_STATUS`
  // API type. Maps to UPI's `AUTOUPDATE` type.
  TRANSACTION_TYPE_AUTOUPDATE = 1;

  // Balance check transaction type. This is associated with the
  // `BALANCE_ENQUIRY` API type. Maps to UPI's `BalChk` type.
  TRANSACTION_TYPE_BALANCE_CHECK = 2;

  // Balance enquiry transaction type. This is associated with the
  // `BALANCE_ENQUIRY` API type. Maps to UPI's `BalEnq` type.
  TRANSACTION_TYPE_BALANCE_ENQUIRY = 3;

  // Check status transaction type. This is associated with the `COMPLAINT` API
  // type. Maps to UPI's `CHECKSTATUS` type.
  TRANSACTION_TYPE_CHECK_STATUS = 4;

  // Check transaction type. This is associated with the `CHECK_STATUS` API
  // type. Maps to UPI's `ChkTxn` type.
  TRANSACTION_TYPE_CHECK_TRANSACTION = 5;

  // Complaint transaction type. This is associated with the `COMPLAINT` API
  // type. Maps to UPI's `COMPLAINT` type.
  TRANSACTION_TYPE_COMPLAINT = 6;

  // Create transaction type. This is associated with the `MANDATE` API type.
  // Maps to UPI's `CREATE` type.
  TRANSACTION_TYPE_CREATE = 7;

  // Credit transaction type. This is associated with the `SETTLE_PAYMENT` API
  // type. Maps to UPI's `CREDIT` type.
  TRANSACTION_TYPE_CREDIT = 8;

  // Debit transaction type. This is associated with the `SETTLE_PAYMENT` API
  // type. Maps to UPI's `DEBIT` type.
  TRANSACTION_TYPE_DEBIT = 9;

  // Dispute transaction type. This is associated with the `COMPLAINT` API
  // type. Maps to UPI's `DISPUTE` type.
  TRANSACTION_TYPE_DISPUTE = 10;

  // Heart beat transaction type. This is associated with `HEART_BEAT` API type.
  // Maps to UPI's `Hbt` type.
  TRANSACTION_TYPE_HEART_BEAT = 11;

  // List accounts transaction type. This is associated with `LIST_ACCOUNTS` API
  // type. Maps to UPI's `ListAccount` type.
  TRANSACTION_TYPE_LIST_ACCOUNTS = 12;

  // Mandate notification transaction type. This is associated with the
  // `VALIDATE_CUSTOMER` API type. Maps to UPI's `MandateNotification` type.
  TRANSACTION_TYPE_MANDATE_NOTIFICATION = 13;

  // OTP transaction type. This is associated with the `INITIATE_REGISTRATION`
  // API type. Maps to UPI's `Otp` type.
  TRANSACTION_TYPE_OTP = 14;

  // Pause transaction type. This is associated with the `MANDATE` API type.
  // Maps to UPI's `PAUSE` type.
  TRANSACTION_TYPE_PAUSE = 15;

  // Redeem transaction type. This is associated with the `VOUCHER_CONFIRMATION`
  // API type. Maps to UPI's `REDEEM` type.
  TRANSACTION_TYPE_REDEEM = 16;

  // Refund transaction type. This is associated with the `COMPLAINT` API
  // type. Maps to UPI's `REFUND` type.
  TRANSACTION_TYPE_REFUND = 17;

  // Register mobile transaction type. This is associated with the
  // `VALIDATE_REGISTRATION` API type. Maps to UPI's `RegMob` type.
  TRANSACTION_TYPE_REGISTER_MOBILE = 18;

  // Reversal transaction type. This is associated with the `SETTLE_PAYMENT` and
  // `COMPLAINT` API types. Maps to UPI's `REVERSAL` type.
  TRANSACTION_TYPE_REVERSAL = 19;

  // Revoke transaction type. This is associated with the `MANDATE` API type.
  // Maps to UPI's `REVOKE` type.
  TRANSACTION_TYPE_REVOKE = 20;

  // Status update transaction type. This is associated with the `COMPLAINT` API
  // type. Maps to UPI's `STATUSUPDATE` type.
  TRANSACTION_TYPE_STATUS_UPDATE = 21;

  // Update transaction type. This is associated with the `MANDATE` API type.
  // Maps to UPI's `UNPAUSE` type.
  TRANSACTION_TYPE_UNPAUSE = 22;

  // Update transaction type. This is associated with the `MANDATE` API type.
  // Maps to UPI's `UPDATE` type.
  TRANSACTION_TYPE_UPDATE = 23;

  // Update credentials transaction type. This is associated with
  // `UPDATE_CREDENTIALS` API type. Maps to UPI's `SetCre` type.
  TRANSACTION_TYPE_UPDATE_CREDENTIALS = 24;

  // Validate customer transaction type. This is associated with
  // `VALIDATE_CUSTOMER` API type. Maps to UPI's `ValCust` type.
  TRANSACTION_TYPE_VALIDATE_CUSTOMER = 25;

  // Activation international transaction type. This is associated with
  // 'ACTIVATION' API type. Maps to UPI's `International` type.
  TRANSACTION_TYPE_ACTIVATION_INTERNATIONAL = 26;

  // Activation UPI services transaction type. This is associated with
  // 'ACTIVATION' API type. Maps to UPI's `UPI Services` type.
  TRANSACTION_TYPE_ACTIVATION_UPI_SERVICES = 27;
}

// XmlApiType specifies the API type of the request or response as specified in
// the XML payload.
enum XmlApiType {
  // Unspecified API type.
  XML_API_TYPE_UNSPECIFIED = 0;

  // Balance enquiry request API type. Maps to UPI's `ReqBalEnq` API.
  REQ_BAL_ENQ = 1;

  // Check transaction request API type. Maps to UPI's `ReqChkTxn` API.
  REQ_CHK_TXN = 2;

  // Complaint request API type. Maps to UPI's `ReqComplaint` API.
  REQ_COMPLAINT = 3;

  // Heart beat request API type. Maps to UPI's `ReqHbt` API.
  REQ_HBT = 4;

  // List accounts request API type. Maps to UPI's `ReqListAccount` API.
  REQ_LIST_ACCOUNT = 5;

  // Mandate request  API. Maps to UPI's `ReqMandate` API.
  REQ_MANDATE = 6;

  // Mandate confirmation request API type. Maps to UPI's
  // `ReqMandateConfirmation` API.
  REQ_MANDATE_CONFIRMATION = 7;

  // OTP request API. Maps to UPI's `ReqOtp` API.
  REQ_OTP = 8;

  // Payment settlement request API type. Maps to UPI's `ReqPay` API.
  REQ_PAY = 9;

  // Register mobile request API type. Maps to UPI's `ReqRegMob` API.
  REQ_REG_MOB = 10;

  // Update credentials request API type. Maps to UPI's `ReqSetCre` API.
  REQ_SET_CRE = 11;

  // Validate customer request API type. Maps to UPI's `ReqValCust`.
  REQ_VAL_CUST = 12;

  // Create voucher request API type. Maps to UPI's `ReqVoucher`.
  REQ_VOUCHER = 13;

  // Voucher confirmation request API type. Maps to UPI's
  // `ReqVoucherConfirmation` API.
  REQ_VOUCHER_CONFIRMATION = 14;

  // Transaction confirmation request API type. Maps to UPI's
  // `ReqTxnConfirmation` API.
  REQ_TXN_CONFIRMATION = 15;

  // Balance enquiry response API type. Maps to UPI's `RespBalEnq` API.
  RESP_BAL_ENQ = 16;

  // Check transaction response API type. Maps to UPI's `RespChkTxn` API.
  RESP_CHK_TXN = 17;

  // Complaint response API type. Maps to UPI's `RespComplaint` API.
  RESP_COMPLAINT = 18;

  // Heart beat response API type. Maps to UPI's `RespHbt` API.
  RESP_HBT = 19;

  // List accounts response API type. Maps to UPI's `RespListAccount` API.
  RESP_LIST_ACCOUNT = 20;

  // Mandate response API type. Maps to UPI's `RespMandate` API.
  RESP_MANDATE = 21;

  // Mandate confirmation response API type. Maps to UPI's
  // `RespMandateConfirmation` API.
  RESP_MANDATE_CONFIRMATION = 22;

  // OTP response API. Maps to UPI's `RespOtp` API.
  RESP_OTP = 23;

  // Payment settlement response API type. Maps to UPI's `RespPay` API.
  RESP_PAY = 24;

  // Register mobile response API type. Maps to UPI's `RespRegMob` API.
  RESP_REG_MOB = 25;

  // Update credentials response API type. Maps to UPI's `RespSetCre` API.
  RESP_SET_CRE = 26;

  // Validate customer response API type. Maps to UPI's `RespValCust`.
  RESP_VAL_CUST = 27;

  // Create voucher response API type. Maps to UPI's `RespVoucher`.
  RESP_VOUCHER = 28;

  // Voucher confirmation responseAPI type. Maps to UPI's
  // `RespVoucherConfirmation` API.
  RESP_VOUCHER_CONFIRMATION = 29;

  // Transaction confirmation response API type. Maps to UPI's
  // `RespTxnConfirmation` API.
  RESP_TXN_CONFIRMATION = 30;

  // Activation request API type. Maps to UPI's `ReqActivation` API.
  REQ_ACTIVATION = 31;

  // Activation response API type. Maps to UPI's `RespActivation` API.
  RESP_ACTIVATION = 32;
}
