use crate::data::enums::position_side::BnPositionSide;
use chrono::{DateTime, Utc};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use serde_with::{TimestampMilliSeconds, formats::Flexible};
use xapi_shared::data::{crypto_asset::CryptoAsset, crypto_symbol::CryptoSymbol};
#[serde_with::serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BnSpotAccountInformation {
pub can_trade: bool,
pub can_withdraw: bool,
pub can_deposit: bool,
pub brokered: bool,
pub require_self_trade_prevention: bool,
#[serde_as(as = "TimestampMilliSeconds<String, Flexible>")]
pub update_time: DateTime<Utc>,
pub account_type: BnSpotAccountType,
pub balances: Vec<BnSpotAccountBalance>,
pub uid: u64,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum BnSpotAccountType {
Spot,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BnSpotAccountBalance {
pub asset: CryptoAsset,
pub free: Decimal,
pub locked: Decimal,
}
#[serde_with::serde_as]
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BnUsdmAccountInformation {
pub available_balance: Decimal,
pub max_withdraw_amount: Decimal,
pub assets: Vec<BnUsdmAccountAsset>,
pub positions: Vec<BnUsdmAccountPosition>,
#[serde_as(as = "TimestampMilliSeconds<String, Flexible>")]
pub update_time: DateTime<Utc>,
}
#[serde_with::serde_as]
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BnUsdmAccountAsset {
pub asset: CryptoAsset,
pub wallet_balance: Decimal,
pub unrealized_profit: Decimal,
pub margin_balance: Decimal,
pub maint_margin: Decimal,
pub initial_margin: Decimal,
pub position_initial_margin: Decimal,
pub open_order_initial_margin: Decimal,
pub cross_wallet_balance: Decimal,
pub cross_un_pnl: Decimal,
pub available_balance: Decimal,
pub max_withdraw_amount: Decimal,
#[serde_as(as = "TimestampMilliSeconds<String, Flexible>")]
pub update_time: DateTime<Utc>,
}
#[serde_with::serde_as]
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BnUsdmAccountPosition {
pub symbol: CryptoSymbol,
pub position_side: BnPositionSide,
pub position_amt: Decimal,
pub unrealized_profit: Decimal,
pub entry_price: Decimal,
pub initial_margin: Decimal,
pub maint_margin: Decimal,
pub leverage: Decimal,
#[serde_as(as = "TimestampMilliSeconds<String, Flexible>")]
pub update_time: DateTime<Utc>,
}