/*
  Сервис реализует функционал управления способами оплаты
*/
syntax = "proto3";

import "google/protobuf/timestamp.proto";
import "google/api/annotations.proto";
import "google/api/field_behavior.proto";
import "google/protobuf/field_mask.proto";

package keyapis.invoice.v1;

option java_package = "ru.keyapis.invoice.v1";
option java_outer_classname = "KeyapisInvoiceV1Proto";
option java_multiple_files = false;
option java_string_check_utf8 = true;
option go_package = "/keyapis_invoice_v1";
option cc_enable_arenas = true;
option csharp_namespace = "Keyapis.Invoice.V1";
option objc_class_prefix = "KEYAPISINVOICEV1";
option php_namespace = "Keyapis\\Invoice\\V1";
option ruby_package = "Keyapis::Invoice::V1";
option optimize_for = LITE_RUNTIME;

// Сервис способов оплаты
service PayMethodService{
  // Метод получения списка способов оплаты.
  // Для роли master возвращаются способы оплаты для пользователя из токена.
  // Для роли service возвращаются способы оплаты пользователя, указанного в параметре запроса.
  // Метод доступен для: service, master
  rpc GetPayMethodList(GetPayMethodListRequest) returns(GetPayMethodListResponse) {
    option (google.api.http) = {
      get: "/invoice/api/v1/pay_method/list"
    };
  }
  // Метод удаления способа оплаты.
  // Удаляются способы оплаты для пользователя из токена.
  // Метод доступен для: master
  rpc DeletePayMethod(DeletePayMethodRequest) returns (DeletePayMethodResponse) {
    option (google.api.http) = {
      delete: "/invoice/api/v1/pay_method/{pay_method_id}"
    };
  }
  // Метод установки способа оплаты по умолчанию.
  // Изменяются способы оплаты для пользователя из токена.
  // Метод доступен для: master
  rpc PostPayMethodDefault(PostPayMethodDefaultRequest) returns (PostPayMethodDefaultResponse) {
    option (google.api.http) = {
      post: "/invoice/api/v1/pay_method/{pay_method_id}/default"
      body: "*"
    };
  }
  // Метод добавления способа оплаты с типом "Банковская карта".
  // Добавляется банковская карта для пользователя из токена.
  // Метод доступен для: master
  rpc PostPayMethodBankcard(PostPayMethodBankcardRequest) returns (PostPayMethodBankcardResponse) {
    option (google.api.http) = {
      post: "/invoice/api/v1/pay_method/bankcard"
      body: "*"
    };
  }
  // Метод добавления способа оплаты с типом "СБП".
  // Добавляется СБП для пользователя из токена.
  // Метод доступен для: master
  rpc PostPayMethodSbp(PostPayMethodSbpRequest) returns (PostPayMethodSbpResponse) {
    option (google.api.http) = {
      post: "/invoice/api/v1/pay_method/sbp"
      body: "*"
    };
  }
}

// Способ оплаты
message PayMethod {
  // Справочник типов способов оплаты
  enum Type {
    // Значение не указано
    TYPE_UNKNOWN = 0;
    // Банковская карта
    BANK_CARD = 1;
    // Сервис быстрых платежей
    SBP = 2;
    // Связка Сбербанка
    SBER_BIND = 3;
  };
  // Справочник типов банковских карт
  enum CardType {
    // Значение не указано
    CARD_TYPE_UNKNOWN = 0;
    // Карта VISA
    VISA = 1;
    // Карта EuroCard/MasterCard
    EC_MC = 2;
    // Карта DinersClub
    DCL = 3;
    // Карта JCB
    JCB = 4;
    // Карта American Express
    AMEX = 5;
    // Платежная система "Мир"
    MIR = 6;
  }
  // Статус способа оплаты
  enum StatusType {
    // Значение не указано
    STATUS_TYPE_UNKNOWN = 0;
    // Исправный
    VALID = 1;
    // Истекший
    EXPIRED = 2;
    // Заблокированный
    BLOCKED = 3;
  }
  // Идентификатор способа оплаты
  string pay_method_id = 1 [(google.api.field_behavior) = REQUIRED];
  // Идентификатор пользователя
  int32 user_id = 2 [(google.api.field_behavior) = REQUIRED];
  // Тип способа оплаты
  Type type = 3 [(google.api.field_behavior) = REQUIRED];
  // Признак активной записи
  bool is_active = 4 [(google.api.field_behavior) = REQUIRED];
  // Способ оплаты по умолчанию
  bool is_default = 5 [(google.api.field_behavior) = REQUIRED];
  // Мобильный телефон, на который будут отправляться уведомления
  string pay_method_contact = 6;
  // Описание способа оплаты
  string pay_method_description = 7;
  // Псевдоним способа оплаты
  string pay_method_alias = 8;
  // Тип банковской карты
  CardType card_type = 9 [(google.api.field_behavior) = OUTPUT_ONLY];
  // Маскированный номер карты или идентификатора привязки счета СБП
  string masked_num = 10 [(google.api.field_behavior) = OUTPUT_ONLY];
  // Наименование банка
  string bank_name = 11 [(google.api.field_behavior) = OUTPUT_ONLY];
  // Признак авторизации БК
  bool is_auth = 12 [(google.api.field_behavior) = OUTPUT_ONLY];
  // Статус способа оплаты
  StatusType status_type = 13 [(google.api.field_behavior) = OUTPUT_ONLY];
  // Дата регистрации способа оплаты.
  // # Тип: DateTime
  google.protobuf.Timestamp register_at = 14 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Запрос на получение списка способов оплаты
message GetPayMethodListRequest {
  // Идентификатор пользователя
  int32 user_id = 1;
}

// Ответ на запрос получения списка способов оплаты
message GetPayMethodListResponse {
  // Способы оплаты
  repeated PayMethod data = 1;
}

// Запрос на удаление способа оплаты
message DeletePayMethodRequest {
  // Идентификатор способа оплаты
  string pay_method_id = 1 [(google.api.field_behavior) = REQUIRED];
}

// Ответ на запрос удаления способа оплаты
message DeletePayMethodResponse {
}

// Запрос установки способа оплаты по умолчанию
message PostPayMethodDefaultRequest {
  // Идентификатор способа оплаты
  string pay_method_id = 1 [(google.api.field_behavior) = REQUIRED];
}

// Ответ на запрос установки способа оплаты по умолчанию
message PostPayMethodDefaultResponse {
  // Ошибка запроса
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Тип ответа
  oneof type {
    // Ошибка
    Error error = 1;
  }
}

// Запрос на добавления способа оплаты с типом "Банковская карта"
message PostPayMethodBankcardRequest {
  // URL для переадресации абонента в случае успешной регистрации карты
  string url_return_ok = 1 [(google.api.field_behavior) = REQUIRED];
  // URL для переадресации абонента в случае неуспешной регистрации карты
  string url_return_no = 2;
}

// Ответ на запрос добавления способа оплаты с типом "Банковская карта"
message PostPayMethodBankcardResponse {
  // Ошибка запроса
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Данные регистрации
  message RegisterData {
    // Идентификатор запроса на регистрацию
    string req_id = 1;
    // Ссылка для переадресации клиента для продолжения регистрации
    string url_registration = 2;
  }
  // Тип ответа
  oneof type {
    // Ошибка валидации
    Error error = 1;
    // Данные регистрации
    RegisterData data = 2;
  }
}

// Запрос на добавления способа оплаты с типом "СБП"
message PostPayMethodSbpRequest {
  // URL для переадресации абонента в случае успешной регистрации карты
  string url_return_ok = 1 [(google.api.field_behavior) = REQUIRED];
  // URL для переадресации абонента в случае неуспешной регистрации карты
  string url_return_no = 2;
}

// Ответ на запрос добавления способа оплаты с типом "СБП"
message PostPayMethodSbpResponse {
  // Ошибка запроса
  message Error {
    // Причина ошибки
    oneof reason {
      // Ошибка валидации
      ValidationError validation = 1;
    }
  }
  // Данные регистрации
  message RegisterData {
    // Идентификатор запроса на регистрацию
    string req_id = 1;
    // Ссылка для переадресации клиента для продолжения регистрации
    string url_registration = 2;
    // Содержимое QR кода для регистрации платежного СБП-токена
    string sbp_payload = 3;
  }
  // Тип ответа
  oneof type {
    // Ошибка валидации
    Error error = 1;
    // Данные регистрации
    RegisterData data = 2;
  }
}

// Ошибка валидации
message ValidationError {
  // Путь к полю в формате наименования прото
  string path = 1 [(google.api.field_behavior) = REQUIRED];
  // Валидационное сообщение
  string message = 2 [(google.api.field_behavior) = REQUIRED];
}


