use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Invoice {
pub id: String,
#[serde(default)]
pub merchant_id: String,
#[serde(rename = "fiat_amount")]
pub amount: f64,
#[serde(rename = "fiat_currency")]
pub currency: String,
pub status: String,
#[serde(default)]
pub network: String,
#[serde(default)]
pub crypto_currency: String,
#[serde(default)]
pub crypto_amount: f64,
#[serde(rename = "deposit_address", default)]
pub wallet_address: String,
#[serde(default)]
pub customer_email: String,
#[serde(default)]
pub customer_name: String,
#[serde(default)]
pub merchant_order_id: String,
#[serde(default)]
pub callback_url: String,
#[serde(default)]
pub return_url: String,
#[serde(default)]
pub metadata: Option<HashMap<String, serde_json::Value>>,
#[serde(default)]
pub payment_url: String,
#[serde(default)]
pub tx_hash: String,
#[serde(rename = "received_amount", default)]
pub paid_amount: f64,
#[serde(default)]
pub confirmations: i32,
#[serde(default)]
pub required_confirmations: i32,
#[serde(default)]
pub expires_at: String,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub updated_at: String,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct CreateInvoiceParams {
pub amount: f64,
#[serde(skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub network: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub crypto_currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub merchant_order_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub customer_email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub customer_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub return_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Payout {
pub id: String,
pub network: String,
pub currency: String,
pub status: String,
#[serde(default)]
pub gross_amount: f64,
#[serde(default)]
pub net_amount: f64,
#[serde(default)]
pub fee_amount: f64,
#[serde(default)]
pub nmc_amount: Option<f64>,
#[serde(default)]
pub recipient_address: String,
#[serde(default)]
pub reference_id: Option<String>,
#[serde(default)]
pub batch_id: Option<String>,
#[serde(default)]
pub tx_hash: String,
#[serde(default)]
pub error_message: Option<String>,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub completed_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct CreatePayoutParams {
pub amount: f64,
pub currency: String,
pub network: String,
pub recipient_address: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub reference_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Wallet {
pub id: String,
pub address: String,
pub network: String,
pub currency: String,
#[serde(default)]
pub balance: f64,
#[serde(default)]
pub label: String,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct GenerateWalletParams {
pub network: String,
pub currency: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SwapQuote {
pub from_currency: String,
pub to_currency: String,
pub from_amount: f64,
pub to_amount: f64,
pub rate: f64,
#[serde(default)]
pub expires_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Swap {
pub id: String,
pub from_currency: String,
pub to_currency: String,
pub from_amount: f64,
pub to_amount: f64,
pub rate: f64,
pub status: String,
#[serde(default)]
pub tx_hash: String,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct SwapParams {
pub from_currency: String,
pub to_currency: String,
pub amount: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebhookEvent {
#[serde(default)]
pub id: String,
#[serde(rename = "event")]
pub event_type: String,
pub data: HashMap<String, serde_json::Value>,
#[serde(rename = "timestamp", default)]
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct ListParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub network: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct PaginatedList<T> {
pub items: Vec<T>,
pub total: i64,
pub page: i64,
pub per_page: i64,
pub has_more: bool,
}