use std::{num::NonZeroU32, sync::LazyLock};
use nautilus_model::identifiers::Venue;
use nautilus_network::ratelimiter::quota::Quota;
use ustr::Ustr;
use super::enums::{BinanceRateLimitInterval, BinanceRateLimitType};
pub const BINANCE: &str = "BINANCE";
pub static BINANCE_VENUE: LazyLock<Venue> = LazyLock::new(|| Venue::new(BINANCE));
pub const BINANCE_NAUTILUS_SPOT_BROKER_ID: &str = "TD67BGP9";
pub const BINANCE_NAUTILUS_FUTURES_BROKER_ID: &str = "aHRE4BCj";
pub const BINANCE_SPOT_HTTP_URL: &str = "https://api.binance.com";
pub const BINANCE_FUTURES_USD_HTTP_URL: &str = "https://fapi.binance.com";
pub const BINANCE_FUTURES_COIN_HTTP_URL: &str = "https://dapi.binance.com";
pub const BINANCE_OPTIONS_HTTP_URL: &str = "https://eapi.binance.com";
pub const BINANCE_SPOT_TESTNET_HTTP_URL: &str = "https://testnet.binance.vision";
pub const BINANCE_FUTURES_USD_TESTNET_HTTP_URL: &str = "https://demo-fapi.binance.com";
pub const BINANCE_FUTURES_COIN_TESTNET_HTTP_URL: &str = "https://testnet.binancefuture.com";
pub const BINANCE_SPOT_DEMO_HTTP_URL: &str = "https://demo-api.binance.com";
pub const BINANCE_FUTURES_USD_DEMO_HTTP_URL: &str = "https://demo-fapi.binance.com";
pub const BINANCE_FUTURES_COIN_DEMO_HTTP_URL: &str = "https://testnet.binancefuture.com";
pub const BINANCE_SPOT_WS_URL: &str = "wss://stream.binance.com:9443/ws";
pub const BINANCE_FUTURES_USD_WS_URL: &str = "wss://fstream.binance.com/ws";
pub const BINANCE_FUTURES_COIN_WS_URL: &str = "wss://dstream.binance.com/ws";
pub const BINANCE_OPTIONS_WS_URL: &str = "wss://nbstream.binance.com/eoptions";
pub const BINANCE_SPOT_SBE_WS_URL: &str = "wss://stream-sbe.binance.com/ws";
pub const BINANCE_SPOT_SBE_WS_API_URL: &str =
"wss://ws-api.binance.com:443/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=3";
pub const BINANCE_FUTURES_USD_WS_API_URL: &str = "wss://ws-fapi.binance.com/ws-fapi/v1";
pub const BINANCE_FUTURES_USD_WS_API_TESTNET_URL: &str =
"wss://testnet.binancefuture.com/ws-fapi/v1";
pub const BINANCE_SPOT_SBE_WS_API_TESTNET_URL: &str = "wss://ws-api.testnet.binance.vision/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=3";
pub const BINANCE_SPOT_SBE_WS_API_DEMO_URL: &str =
"wss://demo-ws-api.binance.com/ws-api/v3?responseFormat=sbe&sbeSchemaId=3&sbeSchemaVersion=3";
pub const BINANCE_SPOT_TESTNET_WS_URL: &str = "wss://stream.testnet.binance.vision/ws";
pub const BINANCE_SPOT_DEMO_WS_URL: &str = "wss://demo-stream.binance.com/ws";
pub const BINANCE_FUTURES_USD_TESTNET_WS_URL: &str = "wss://fstream.binancefuture.com/ws";
pub const BINANCE_FUTURES_COIN_TESTNET_WS_URL: &str = "wss://dstream.binancefuture.com/ws";
pub const BINANCE_API_KEY_HEADER: &str = "X-MBX-APIKEY";
pub const BINANCE_SPOT_API_PATH: &str = "/api/v3";
pub const BINANCE_FAPI_PATH: &str = "/fapi/v1";
pub const BINANCE_DAPI_PATH: &str = "/dapi/v1";
pub const BINANCE_EAPI_PATH: &str = "/eapi/v1";
#[derive(Clone, Copy, Debug)]
pub struct BinanceRateLimitQuota {
pub rate_limit_type: BinanceRateLimitType,
pub interval: BinanceRateLimitInterval,
pub interval_num: u32,
pub limit: u32,
}
pub const BINANCE_SPOT_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::RequestWeight,
interval: BinanceRateLimitInterval::Minute,
interval_num: 1,
limit: 1_200,
},
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::Orders,
interval: BinanceRateLimitInterval::Second,
interval_num: 1,
limit: 10,
},
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::Orders,
interval: BinanceRateLimitInterval::Day,
interval_num: 1,
limit: 100_000,
},
];
pub const BINANCE_FAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::RequestWeight,
interval: BinanceRateLimitInterval::Minute,
interval_num: 1,
limit: 2_400,
},
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::Orders,
interval: BinanceRateLimitInterval::Second,
interval_num: 1,
limit: 50,
},
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::Orders,
interval: BinanceRateLimitInterval::Minute,
interval_num: 1,
limit: 1_200,
},
];
pub const BINANCE_DAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::RequestWeight,
interval: BinanceRateLimitInterval::Minute,
interval_num: 1,
limit: 1_200,
},
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::Orders,
interval: BinanceRateLimitInterval::Second,
interval_num: 1,
limit: 20,
},
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::Orders,
interval: BinanceRateLimitInterval::Minute,
interval_num: 1,
limit: 1_200,
},
];
pub const BINANCE_EAPI_RATE_LIMITS: &[BinanceRateLimitQuota] = &[
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::RequestWeight,
interval: BinanceRateLimitInterval::Minute,
interval_num: 1,
limit: 3_000,
},
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::Orders,
interval: BinanceRateLimitInterval::Second,
interval_num: 1,
limit: 5,
},
BinanceRateLimitQuota {
rate_limit_type: BinanceRateLimitType::Orders,
interval: BinanceRateLimitInterval::Minute,
interval_num: 1,
limit: 200,
},
];
pub static BINANCE_WS_SUBSCRIPTION_QUOTA: LazyLock<Quota> = LazyLock::new(|| {
Quota::per_second(NonZeroU32::new(5).expect("non-zero")).expect("valid constant")
});
pub static BINANCE_WS_CONNECTION_QUOTA: LazyLock<Quota> = LazyLock::new(|| {
Quota::per_second(NonZeroU32::new(1).expect("non-zero")).expect("valid constant")
});
pub static BINANCE_RATE_LIMIT_KEY_SUBSCRIPTION: LazyLock<[Ustr; 1]> =
LazyLock::new(|| [Ustr::from("subscription")]);
pub const BINANCE_GTX_ORDER_REJECT_CODE: i64 = -5022;
pub const BINANCE_NEW_ORDER_REJECTED_CODE: i64 = -2010;
pub const BINANCE_SPOT_POST_ONLY_REJECT_MSG: &str = "Order would immediately match and take.";
pub const BINANCE_BOOK_DEPTHS: [u32; 7] = [5, 10, 20, 50, 100, 500, 1000];