syntax = "proto3";

// Микросервис заявок на вывод (USDT TRON/BSC). Клиент: Wallet Gateway по gRPC.
package withdrawal.v1;

option csharp_namespace = "Withdrawal.V1";
option java_multiple_files = true;
option java_package = "com.arbiwallet.withdrawal.v1";

service WithdrawalService {
  rpc CreateWithdrawal(CreateWithdrawalRequest) returns (Withdrawal);
  rpc GetWithdrawal(GetWithdrawalRequest) returns (Withdrawal);
  rpc ListWithdrawals(ListWithdrawalsRequest) returns (ListWithdrawalsResponse);
  rpc GetMonthlyWithdrawalLimit(GetMonthlyWithdrawalLimitRequest) returns (MonthlyWithdrawalLimit);
  rpc GetWithdrawalLimits(GetWithdrawalLimitsRequest) returns (WithdrawalLimits);
  // Один ответ для фронта: мин. on-chain сумма + комиссии по каждой паре asset/network (без user-лимитов).
  rpc GetPayoutPricing(GetPayoutPricingRequest) returns (GetPayoutPricingResponse);
  rpc AdminSetMonthlyWithdrawalLimit(AdminSetMonthlyWithdrawalLimitRequest) returns (AdminSetMonthlyWithdrawalLimitResponse);
  rpc AdminSetUserWithdrawalLimits(AdminSetUserWithdrawalLimitsRequest) returns (AdminSetUserWithdrawalLimitsResponse);
  rpc AdminRejectWithdrawal(AdminRejectWithdrawalRequest) returns (Withdrawal);
  rpc AdminUpsertPayoutConfig(AdminUpsertPayoutConfigRequest) returns (PayoutConfigRow);
  rpc ListPayoutConfigs(ListPayoutConfigsRequest) returns (ListPayoutConfigsResponse);
}

message CreateWithdrawalRequest {
  string user_id = 1;
  string network = 2;
  string asset = 3;
  string amount = 4;
  string to_address = 5;
  optional string idempotency_key = 6;
}

message GetWithdrawalRequest {
  string user_id = 1;
  string withdraw_request_id = 2;
}

message ListWithdrawalsRequest {
  optional string user_id = 1;
  optional string status = 2;
  optional string network = 3;
  optional string from = 4;
  optional string to = 5;
  optional int32 take = 6;
}

message ListWithdrawalsResponse {
  repeated Withdrawal items = 1;
}

message GetMonthlyWithdrawalLimitRequest {
  string user_id = 1;
}

message GetWithdrawalLimitsRequest {
  string user_id = 1;
  // Для `min_withdrawal_amount` по выбранной паре; по умолчанию USDT + TRON.
  optional string asset = 2;
  optional string network = 3; // "TRON" | "BSC" — enum ChainNetwork
}

message GetPayoutPricingRequest {}

message GetPayoutPricingResponse {
  repeated PayoutConfigRow rows = 1;
}

message WithdrawalLimits {
  string user_id = 1;
  string min_withdrawal_amount = 2;
  string daily_limit = 3;
  string monthly_limit = 4;
  string daily_used = 5;
  string daily_remaining = 6;
  string monthly_used = 7;
  string monthly_remaining = 8;
  string kyc_tier = 9;
  bool is_custom_limit = 10;
  string day_start_utc = 11;
  string day_end_exclusive_utc = 12;
  string month_start_utc = 13;
  string month_end_exclusive_utc = 14;
  repeated PayoutConfigRow payout_config_rows = 15;
}

message PayoutConfigRow {
  string asset = 1;
  string network = 2;
  string min_on_chain = 3;
  string service_fee = 4;
  string network_fee = 5;
}

message AdminUpsertPayoutConfigRequest {
  string admin_api_key = 1;
  string asset = 2;
  string network = 3;
  string min_on_chain = 4;
  string service_fee = 5;
  string network_fee = 6;
  bool is_active = 7; // true по умолчанию
}

message ListPayoutConfigsRequest {
  string admin_api_key = 1;
}

message ListPayoutConfigsResponse {
  repeated PayoutConfigRow rows = 1;
}

message MonthlyWithdrawalLimit {
  string user_id = 1;
  string monthly_limit_usdt = 2;
  string min_withdrawal_usdt = 3;
  string used_this_month_usdt = 4;
  string remaining_this_month_usdt = 5;
  string month_start_utc = 6;
  string month_end_exclusive_utc = 7;
  optional string daily_limit_usdt = 8;
  optional string used_this_day_usdt = 9;
  optional string remaining_this_day_usdt = 10;
  optional string day_start_utc = 11;
  optional string day_end_exclusive_utc = 12;
  optional string kyc_tier = 13;
  optional bool is_custom_limit = 14;
}

message AdminSetMonthlyWithdrawalLimitRequest {
  string admin_api_key = 1;
  string user_id = 2;
  string monthly_limit_usdt = 3;
}

message AdminSetMonthlyWithdrawalLimitResponse {
  string user_id = 1;
  string monthly_limit_usdt = 2;
}

message AdminSetUserWithdrawalLimitsRequest {
  string admin_api_key = 1;
  string user_id = 2;
  optional string custom_daily_limit_usdt = 3;
  optional string custom_monthly_limit_usdt = 4;
  bool clear_custom_limits = 5;
}

message AdminSetUserWithdrawalLimitsResponse {
  string user_id = 1;
  optional string custom_daily_limit_usdt = 2;
  optional string custom_monthly_limit_usdt = 3;
}

message AdminRejectWithdrawalRequest {
  string admin_api_key = 1;
  string withdraw_request_id = 2;
}

message Withdrawal {
  string withdraw_request_id = 1;
  string user_id = 2;
  string network = 3;
  string asset = 4;
  string amount = 5;
  string to_address = 6;
  string status = 7;
  string service_fee = 8;
  string network_fee = 9;
  string created_at = 10;
  optional string transaction_id = 11;
  optional string reference_id = 12;
  optional string custody_tx_id = 13;
  optional string tx_hash = 14;
  optional int32 aml_score = 15;
  optional string aml_reason = 16;
  optional string aml_decision = 17;
  optional string error_code = 18;
  optional string error_message = 19;
  optional string finalized_at = 20;
  optional string refunded_at = 21;
  // Счётчик списания: on-chain (amount) + service_fee + network_fee.
  optional string gross_debit = 22;
}
