# This file is automatically generated by pyo3_stub_gen
# ruff: noqa: E501

import datetime
import enum
import typing

from nautilus_trader import model
from nautilus_trader import network

__all__ = [
    "KRAKEN",
    "KRAKEN_CLIENT_ID",
    "KRAKEN_VENUE",
    "KrakenDataClientConfig",
    "KrakenDataClientFactory",
    "KrakenEnvironment",
    "KrakenExecutionClientConfig",
    "KrakenExecutionClientFactory",
    "KrakenProductType",
]

KRAKEN: str
KRAKEN_CLIENT_ID: model.ClientId
KRAKEN_VENUE: model.Venue

@typing.final
class KrakenDataClientConfig:
    @property
    def product_type(self) -> KrakenProductType: ...
    @property
    def environment(self) -> KrakenEnvironment: ...
    @property
    def base_url(self) -> str | None: ...
    @property
    def validate_l3_checksum(self) -> bool: ...
    @property
    def timeout_secs(self) -> int: ...
    @property
    def heartbeat_interval_secs(self) -> int: ...
    @property
    def ws_idle_timeout_ms(self) -> int: ...
    @property
    def max_requests_per_second(self) -> int | None: ...
    @property
    def transport_backend(self) -> network.TransportBackend: ...
    def __init__(
        self,
        product_type: KrakenProductType | None = None,
        environment: KrakenEnvironment | None = None,
        api_key: str | None = None,
        api_secret: str | None = None,
        base_url: str | None = None,
        ws_public_url: str | None = None,
        ws_private_url: str | None = None,
        ws_l3_url: str | None = None,
        validate_l3_checksum: bool | None = None,
        proxy_url: str | None = None,
        timeout_secs: int | None = None,
        heartbeat_interval_secs: int | None = None,
        ws_idle_timeout_ms: int | None = None,
        max_requests_per_second: int | None = None,
        transport_backend: network.TransportBackend | None = None,
    ) -> None: ...
    @property
    def has_proxy_url(self) -> bool: ...
    @property
    def ws_public_url(self) -> str | None: ...
    @property
    def ws_private_url(self) -> str | None: ...
    @property
    def ws_l3_url(self) -> str | None: ...

@typing.final
class KrakenDataClientFactory:
    def __init__(self) -> None: ...
    def name(self) -> str: ...

@typing.final
class KrakenExecutionClientConfig:
    @property
    def account_id(self) -> model.AccountId: ...
    @property
    def product_type(self) -> KrakenProductType: ...
    @property
    def environment(self) -> KrakenEnvironment: ...
    @property
    def base_url(self) -> str | None: ...
    @property
    def timeout_secs(self) -> int: ...
    @property
    def heartbeat_interval_secs(self) -> int: ...
    @property
    def auth_timeout_secs(self) -> int | None: ...
    @property
    def max_requests_per_second(self) -> int | None: ...
    @property
    def max_retries(self) -> int: ...
    @property
    def spot_account_type(self) -> model.AccountType: ...
    @property
    def default_leverage(self) -> int | None: ...
    @property
    def use_spot_position_reports(self) -> bool: ...
    @property
    def spot_positions_quote_currency(self) -> str: ...
    @property
    def margin_balance_asset(self) -> str | None: ...
    @property
    def use_ws_trade(self) -> bool: ...
    @property
    def ws_request_timeout_secs(self) -> int: ...
    @property
    def transport_backend(self) -> network.TransportBackend: ...
    def __init__(
        self,
        account_id: model.AccountId,
        api_key: str,
        api_secret: str,
        product_type: KrakenProductType | None = None,
        environment: KrakenEnvironment | None = None,
        base_url: str | None = None,
        ws_url: str | None = None,
        proxy_url: str | None = None,
        timeout_secs: int | None = None,
        heartbeat_interval_secs: int | None = None,
        auth_timeout_secs: int | None = None,
        max_requests_per_second: int | None = None,
        max_retries: int | None = None,
        spot_account_type: model.AccountType | None = None,
        default_leverage: int | None = None,
        use_spot_position_reports: bool | None = None,
        spot_positions_quote_currency: str | None = None,
        margin_balance_asset: str | None = None,
        use_ws_trade: bool | None = None,
        ws_request_timeout_secs: int | None = None,
        transport_backend: network.TransportBackend | None = None,
    ) -> None: ...
    @property
    def has_proxy_url(self) -> bool: ...
    @property
    def ws_url(self) -> str | None: ...

@typing.final
class KrakenExecutionClientFactory:
    def __init__(self) -> None: ...
    def name(self) -> str: ...

@typing.final
class KrakenFuturesHttpClient:
    def __init__(
        self,
        api_key: str | None = None,
        api_secret: str | None = None,
        base_url: str | None = None,
        demo: bool = False,
        timeout_secs: int = 60,
        max_retries: int | None = None,
        retry_delay_ms: int | None = None,
        retry_delay_max_ms: int | None = None,
        proxy_url: str | None = None,
        max_requests_per_second: int = 5,
    ) -> None: ...
    @property
    def base_url(self) -> str: ...
    @property
    def api_key(self) -> str | None: ...
    @property
    def api_key_masked(self) -> str | None: ...
    def cache_instrument(self, instrument: typing.Any) -> None: ...
    def cancel_all_requests(self) -> None: ...
    def request_instruments(self) -> typing.Any: ...
    def request_instrument_statuses(self) -> typing.Any: ...
    def request_trades(
        self,
        instrument_id: model.InstrumentId,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
    ) -> typing.Any: ...
    def request_mark_price(self, instrument_id: model.InstrumentId) -> typing.Any: ...
    def request_index_price(self, instrument_id: model.InstrumentId) -> typing.Any: ...
    def request_book_snapshot(
        self, instrument_id: model.InstrumentId, depth: int | None = None
    ) -> typing.Any: ...
    def request_bars(
        self,
        bar_type: model.BarType,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
    ) -> typing.Any: ...
    def request_account_state(self, account_id: model.AccountId) -> typing.Any: ...
    def request_order_status_reports(
        self,
        account_id: model.AccountId,
        instrument_id: model.InstrumentId | None = None,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        open_only: bool = False,
    ) -> typing.Any: ...
    def request_fill_reports(
        self,
        account_id: model.AccountId,
        instrument_id: model.InstrumentId | None = None,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
    ) -> typing.Any: ...
    def request_position_status_reports(
        self, account_id: model.AccountId, instrument_id: model.InstrumentId | None = None
    ) -> typing.Any: ...
    def submit_order(
        self,
        account_id: model.AccountId,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId,
        order_side: model.OrderSide,
        order_type: model.OrderType,
        quantity: model.Quantity,
        time_in_force: model.TimeInForce,
        price: model.Price | None = None,
        trigger_price: model.Price | None = None,
        trigger_type: model.TriggerType | None = None,
        reduce_only: bool = False,
        post_only: bool = False,
    ) -> typing.Any: ...
    def modify_order(
        self,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId | None = None,
        venue_order_id: model.VenueOrderId | None = None,
        quantity: model.Quantity | None = None,
        price: model.Price | None = None,
        trigger_price: model.Price | None = None,
    ) -> typing.Any: ...
    def cancel_order(
        self,
        account_id: model.AccountId,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId | None = None,
        venue_order_id: model.VenueOrderId | None = None,
    ) -> typing.Any: ...
    def cancel_all_orders(self, instrument_id: model.InstrumentId | None = None) -> typing.Any: ...
    def cancel_orders_batch(
        self, venue_order_ids: typing.Sequence[model.VenueOrderId]
    ) -> typing.Any: ...

@typing.final
class KrakenSpotHttpClient:
    def __init__(
        self,
        api_key: str | None = None,
        api_secret: str | None = None,
        base_url: str | None = None,
        timeout_secs: int = 60,
        max_retries: int | None = None,
        retry_delay_ms: int | None = None,
        retry_delay_max_ms: int | None = None,
        proxy_url: str | None = None,
        max_requests_per_second: int = 5,
    ) -> None: ...
    @property
    def base_url(self) -> str: ...
    @property
    def api_key(self) -> str | None: ...
    @property
    def api_key_masked(self) -> str | None: ...
    def cache_instrument(self, instrument: typing.Any) -> None: ...
    def cancel_all_requests(self) -> None: ...
    def get_server_time(self) -> typing.Any: ...
    def request_instruments(self, pairs: typing.Sequence[str] | None = None) -> typing.Any: ...
    def request_instrument_statuses(
        self, pairs: typing.Sequence[str] | None = None
    ) -> typing.Any: ...
    def request_trades(
        self,
        instrument_id: model.InstrumentId,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
    ) -> typing.Any: ...
    def request_book_snapshot(
        self, instrument_id: model.InstrumentId, depth: int | None = None
    ) -> typing.Any: ...
    def request_bars(
        self,
        bar_type: model.BarType,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        limit: int | None = None,
    ) -> typing.Any: ...
    def request_account_state(
        self,
        account_id: model.AccountId,
        account_type: model.AccountType = model.AccountType.CASH,
        margin_balance_asset: str | None = None,
    ) -> typing.Any: ...
    def request_margin_metrics(self, asset: str | None = None) -> typing.Any: ...
    def request_account_state_with_metrics(
        self,
        account_id: model.AccountId,
        account_type: model.AccountType = model.AccountType.CASH,
        margin_balance_asset: str | None = None,
    ) -> typing.Any: ...
    def request_order_status_reports(
        self,
        account_id: model.AccountId,
        instrument_id: model.InstrumentId | None = None,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
        open_only: bool = False,
    ) -> typing.Any: ...
    def request_fill_reports(
        self,
        account_id: model.AccountId,
        instrument_id: model.InstrumentId | None = None,
        start: datetime.datetime | None = None,
        end: datetime.datetime | None = None,
    ) -> typing.Any: ...
    def request_position_status_reports(
        self,
        account_id: model.AccountId,
        instrument_id: model.InstrumentId | None = None,
        account_type: model.AccountType = model.AccountType.CASH,
        use_spot_position_reports: bool = False,
        quote_currency: str = "USDT",
    ) -> typing.Any: ...
    def submit_order(
        self,
        account_id: model.AccountId,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId,
        order_side: model.OrderSide,
        order_type: model.OrderType,
        quantity: model.Quantity,
        time_in_force: model.TimeInForce,
        expire_time: int | None = None,
        price: model.Price | None = None,
        trigger_price: model.Price | None = None,
        trigger_type: model.TriggerType | None = None,
        trailing_offset: str | None = None,
        limit_offset: str | None = None,
        reduce_only: bool = False,
        post_only: bool = False,
        quote_quantity: bool = False,
        display_qty: model.Quantity | None = None,
        leverage: int | None = None,
        account_type: model.AccountType = model.AccountType.CASH,
    ) -> typing.Any: ...
    def cancel_order(
        self,
        account_id: model.AccountId,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId | None = None,
        venue_order_id: model.VenueOrderId | None = None,
    ) -> typing.Any: ...
    def cancel_all_orders(self) -> typing.Any: ...
    def cancel_orders_batch(
        self, venue_order_ids: typing.Sequence[model.VenueOrderId]
    ) -> typing.Any: ...
    def modify_order(
        self,
        instrument_id: model.InstrumentId,
        client_order_id: model.ClientOrderId | None = None,
        venue_order_id: model.VenueOrderId | None = None,
        quantity: model.Quantity | None = None,
        price: model.Price | None = None,
        trigger_price: model.Price | None = None,
    ) -> typing.Any: ...

@typing.final
class KrakenEnvironment(enum.Enum):
    LIVE = ...
    DEMO = ...

@typing.final
class KrakenProductType(enum.Enum):
    SPOT = ...
    FUTURES = ...

def kraken_product_type_from_symbol(symbol: str) -> KrakenProductType: ...
