syntax = "proto3";

package card.v1;

option csharp_namespace = "Card.V1";
option java_multiple_files = true;
option java_package = "com.arbiwallet.card.v1";

service CardService {
  rpc GetCardProvidersInfo(GetCardProvidersInfoRequest) returns (GetCardProvidersInfoResponse);
  rpc CreateCard(CreateCardRequest) returns (CardResponse);
  rpc CreateCardsBatch(CreateCardsBatchRequest) returns (CreateCardsBatchResponse);
  rpc TopupCard(TopupCardRequest) returns (TopupCardResponse);
  rpc GetTopupFee(GetTopupFeeRequest) returns (GetTopupFeeResponse);
  rpc QuoteTopupByTarget(QuoteTopupByTargetRequest) returns (QuoteTopupByTargetResponse);
  rpc ExecuteTopupWithLedger(ExecuteTopupWithLedgerRequest) returns (ExecuteTopupWithLedgerResponse);
  rpc ExecuteCreateWithLedger(ExecuteCreateWithLedgerRequest) returns (ExecuteCreateWithLedgerResponse);
  rpc ScanGiftCardQr(ScanGiftCardQrRequest) returns (ScanGiftCardQrResponse);

  rpc ListCards(ListCardsRequest) returns (ListCardsResponse);
  rpc ListCardsPaginated(ListCardsPaginatedRequest) returns (ListCardsPaginatedResponse);
  rpc GetCard(GetCardRequest) returns (CardResponse);
  rpc GetCardBalance(GetCardBalanceRequest) returns (GetCardBalanceResponse);

  rpc GetCardTransactions(GetCardTransactionsRequest) returns (GetCardTransactionsResponse);
  rpc SyncRecentUserCardHistory(SyncRecentUserCardHistoryRequest) returns (SyncRecentUserCardHistoryResponse);
  rpc GetCardAuthTransactions(GetCardAuthTransactionsRequest) returns (GetCardAuthTransactionsResponse);
  rpc GetCard3dsCodes(GetCard3dsCodesRequest) returns (GetCard3dsCodesResponse);

  rpc UpdateCardStatus(UpdateCardStatusRequest) returns (CardResponse);
  rpc FreezeCard(CardActionRequest) returns (CardResponse);
  rpc UnfreezeCard(CardActionRequest) returns (CardResponse);
  rpc DeleteCard(CardActionRequest) returns (DeleteCardResponse);

  rpc GetBins(GetBinsRequest) returns (GetBinsResponse);
  rpc GetBin(GetBinRequest) returns (BinResponse);
  rpc GetBinsExists(GetBinsExistsRequest) returns (GetBinsExistsResponse);
  rpc GetAreaCodes(GetAreaCodesRequest) returns (GetAreaCodesResponse);
  rpc GetRegions(GetRegionsRequest) returns (GetRegionsResponse);

  rpc HandleBincentricWebhook(HandleBincentricWebhookRequest) returns (HandleBincentricWebhookResponse);
}

enum CardStatus {
  CARD_STATUS_UNSPECIFIED = 0;
  CARD_STATUS_CREATED = 1;
  CARD_STATUS_ACTIVE = 2;
  CARD_STATUS_FROZEN = 3;
  CARD_STATUS_BLOCKED = 4;
  CARD_STATUS_DELETED = 5;
  CARD_STATUS_ERROR = 6;
}

message GetCardProvidersInfoRequest {
  int64 account_id = 1;
  string email = 2;
  string phone = 3;
  string first_name = 4;
  string last_name = 5;
}

message CardProviderInfo {
  int64 id = 1;
  string card_type = 2;
  string currency = 3;
  string bin = 4;
  string card_form_factor = 5;
  bool kyc_required = 6;
  string init_balance = 7;
  repeated string regions = 8;
  repeated string phone_prefixes = 9;
  string card_region = 10;
  string issue_fee = 11;
  string required_amount = 12;
  int64 product_id = 13;
  string name = 14;
  string subtitle = 15;
  string topup_fee_percent = 16;
  string min_first_topup = 17;
  string min_regular_topup = 18;
  string monthly_service_fee = 19;
  string validity_period = 20;
  string mobile_pay_support = 21;
  string transaction_fee = 22;
  string atm_withdrawal_fee = 23;
  string fx_fee = 24;
  map<string, string> limits = 25;
  map<string, string> details = 26;
  map<string, string> info = 27;
  bool is_gift = 28;
  string picture_id = 29;
  string label = 30;
}

message GetCardProvidersInfoResponse {
  repeated CardProviderInfo providers = 1;
}

message CreateCardRequest {
  int64 account_id = 1;
  string name = 2;
  string currency = 3;
  string card_type = 4;
  bool is_virtual = 5;
  string bin = 6;
  string card_holder_name = 7;
  string phone = 8;
  string email = 9;
  string external_uuid = 10;
  string otp_code = 11;
  bool is_auto_topup = 12;
  string auto_top_amount = 13;
  string auto_topup_limit = 14;
  string card_balance_threshold = 15;
  string required_amount = 16;
  bool kyc_required = 17;
  string kyc_applicant_json = 18;
  string kyc_resources_json = 19;
  repeated KycVerifiedResource kyc_verified_resources = 20;
  int64 product_id = 21;
}

message KycVerifiedResource {
  string image_id = 1;
  string id_doc_type = 2;
  string file_name = 3;
  string file_type = 4;
  string content_type = 5;
  int64 content_length = 6;
  bytes file_data = 7;
}

message CreateCardsBatchRequest {
  CreateCardRequest template = 1;
  int32 number_of_cards = 2;
}

message CreateCardsBatchResponse {
  repeated CardResponse cards = 1;
}

message TopupCardRequest {
  int64 account_id = 1;
  int64 card_id = 2;
  string amount = 3;
  string card_crypto_currency = 4;
  string otp_code = 5;
}

message TopupCardResponse {
  int64 card_id = 1;
  string currency_credit = 2;
  string amount_credit = 3;
  string amount_debit = 4;
  string currency_debit = 5;
  string fee = 6;
  string total_amount = 7;
}

message GetTopupFeeRequest {
  int64 account_id = 1;
  int64 card_id = 2;
  string amount = 3;
  string card_crypto_currency = 4;
}

message GetTopupFeeResponse {
  int64 card_id = 1;
  string amount = 2;
  string card_crypto_currency = 3;
  string fee_amount = 4;
  string fee_currency = 5;
  string card_currency = 6;
  string amount_to_card = 7;
}

message QuoteTopupByTargetRequest {
  int64 account_id = 1;
  int64 card_id = 2;
  string target_amount = 3;
  string target_currency = 4;
  string card_crypto_currency = 5;
}

message QuoteTopupByTargetResponse {
  string target_amount = 1;
  string target_currency = 2;
  string input_usdt = 3;
  string fee_usdt = 4;
  string required_debit_usdt = 5;
  string amount_to_card = 6;
  string card_currency = 7;
  string card_crypto_currency = 8;
}

message ExecuteTopupWithLedgerRequest {
  int64 account_id = 1;
  int64 card_id = 2;
  string input_usdt = 3;
  string card_crypto_currency = 4;
  string otp_code = 5;
  string idempotency_seed = 6;
  bool skip_balance_check = 7;
  bool preview_only = 8;
}

message ExecuteTopupWithLedgerResponse {
  string status = 1;
  string flow = 2;
  int64 card_id = 3;
  string target_card_amount = 4;
  string target_card_currency = 5;
  string actual_card_amount = 6;
  string actual_card_currency = 7;
  string input_amount = 8;
  string fee_amount = 9;
  string required_debit_amount = 10;
  string card_crypto_currency = 11;
  string message = 12;
}

message ExecuteCreateWithLedgerRequest {
  int64 account_id = 1;
  string currency = 2;
  string card_type = 3;
  string bin = 4;
  string required_amount = 5;
  string card_holder_name = 6;
  string phone = 7;
  string email = 8;
  string first_name = 9;
  string last_name = 10;
  bool kyc_required = 11;
  string idempotency_seed = 12;
  bool skip_balance_check = 13;
  bool preview_only = 14;
  int64 product_id = 15;
}

message ExecuteCreateWithLedgerResponse {
  string status = 1;
  string flow = 2;
  string required_debit_amount = 3;
  string currency = 4;
  string card_type = 5;
  string bin = 6;
  int64 card_id = 7;
  CardResponse card = 8;
  string message = 9;
  string available_amount = 10;
  string shortfall_amount = 11;
  bool ledger_configured = 12;
  bool sufficient_balance = 13;
}


message ScanGiftCardQrRequest {
  int64 account_id = 1;
  int64 uid = 2;
  int64 card_product_id = 3;
}

message ScanGiftCardQrResponse {
  bool success = 1;
  string required_amount = 2;
  int64 card_id = 3;
}

message ListCardsRequest {
  int64 account_id = 1;
}

message ListCardsResponse {
  repeated CardResponse cards = 1;
}

message ListCardsPaginatedRequest {
  int64 account_id = 1;
  int32 page = 2;
  int32 size = 3;
}

message ListCardsPaginatedResponse {
  repeated CardResponse items = 1;
  int32 total = 2;
  int32 page = 3;
  int32 size = 4;
  int32 pages = 5;
}

message GetCardRequest {
  int64 account_id = 1;
  int64 card_id = 2;
}

message CardResponse {
  int64 id = 1;
  string name = 2;
  int64 account_id = 3;
  string balance = 4;
  string currency = 5;
  string card_number = 6;
  int64 issuer_id = 7;
  string card_type = 8;
  string cvv = 9;
  CardStatus status = 10;
  bool is_virtual = 11;
  string created_at = 12;
  string expires_at = 13;
  string phone = 14;
  string email = 15;
  string card_holder_name = 16;
  string external_uuid = 17;
  bool is_auto_topup = 18;
  string auto_top_amount = 19;
  string auto_topup_limit = 20;
  string current_auto_topup_amount = 21;
  string card_balance_threshold = 22;
  int64 product_id = 23;
  bool is_gift = 24;
  string picture_id = 25;
  string label = 26;
}

message GetCardBalanceRequest {
  int64 account_id = 1;
  int64 card_id = 2;
}

message GetCardBalanceResponse {
  int64 card_id = 1;
  string balance = 2;
  string currency = 3;
}

message GetCardTransactionsRequest {
  int64 account_id = 1;
  int64 card_id = 2;
  int32 pager_offset = 3;
  int32 pager_size = 4;
}

message CardTransaction {
  int64 payment_id = 1;
  int64 card_id = 2;
  string card_number = 3;
  string amount = 4;
  string card_currency = 5;
  string operation_type = 6;
  string status = 7;
  string created_at = 8;
}

message Edge {
  int32 offset = 1;
  int32 size = 2;
  int32 total = 3;
}

message GetCardTransactionsResponse {
  repeated CardTransaction payments = 1;
  Edge edge = 2;
}

message SyncRecentUserCardHistoryRequest {
  int64 account_id = 1;
  int32 size = 2;
  int32 cooldown_seconds = 3;
}

message SyncRecentUserCardHistoryResponse {
  int32 synced_cards = 1;
  int32 skipped_cards = 2;
  int32 failed_cards = 3;
}

message GetCardAuthTransactionsRequest {
  int64 account_id = 1;
  int64 card_id = 2;
  int32 pager_offset = 3;
  int32 pager_size = 4;
}

message CardAuthTransaction {
  int64 id = 1;
  int64 card_id = 2;
  string currency = 3;
  string amount = 4;
  string authorized_amount = 5;
  string authorized_currency = 6;
  string merchant_name = 7;
  string type = 8;
  string status = 9;
  string description = 10;
  string transaction_time = 11;
  string settle_date = 12;
}

message GetCardAuthTransactionsResponse {
  repeated CardAuthTransaction transactions = 1;
  Edge edge = 2;
}

message GetCard3dsCodesRequest {
  int64 account_id = 1;
  int64 card_id = 2;
  int32 pager_offset = 3;
  int32 pager_size = 4;
}

message Card3dsInfo {
  int64 id = 1;
  int64 card_id = 2;
  string currency = 3;
  string amount = 4;
  string merchant_name = 5;
  string type = 6;
  string values = 7;
  string description = 8;
  string transaction_time = 9;
  string expiration_time = 10;
}

message GetCard3dsCodesResponse {
  repeated Card3dsInfo card_3ds_info = 1;
  Edge edge = 2;
}

message UpdateCardStatusRequest {
  int64 account_id = 1;
  int64 card_id = 2;
  CardStatus status = 3;
}

message CardActionRequest {
  int64 account_id = 1;
  int64 card_id = 2;
}

message DeleteCardResponse {
  bool ok = 1;
}

message GetBinsRequest {
  int64 account_id = 1;
}

message GetBinRequest {
  int64 account_id = 1;
  string bin = 2;
}

message GetBinsExistsRequest {
  int64 account_id = 1;
}

message GetAreaCodesRequest {
  int64 account_id = 1;
  string bin = 2;
}

message GetRegionsRequest {
  int64 account_id = 1;
  string bin = 2;
}

message BinResponse {
  string bin = 1;
  string card_type = 2;
  string currency = 3;
  string provider = 4;
  bool kyc_required = 5;
}

message GetBinsResponse {
  repeated BinResponse bins = 1;
}

message GetBinsExistsResponse {
  repeated string bins = 1;
}

message GetAreaCodesResponse {
  repeated string area_codes = 1;
}

message GetRegionsResponse {
  repeated string regions = 1;
}

message HandleBincentricWebhookRequest {
  bytes raw_body = 1;
  string webhook_timestamp = 2;
  string webhook_signature = 3;
}

message HandleBincentricWebhookResponse {
  bool ok = 1;
  bool handled = 2;
  string event_type = 3;
  int64 card_id = 4;
  string reason = 5;
}
