"""交易所行情适配器协议：策略/撮合只依赖此接口，不直接碰 OKX/币安。"""

from __future__ import annotations

from typing import Any, Protocol, Sequence, runtime_checkable

from .types import BookLevel, MarketSnapshot, OptionPair, Quote


@runtime_checkable
class ExchangeMarket(Protocol):
    name: str

    async def start(self) -> None: ...

    async def stop(self) -> None: ...

    def list_option_contracts(self, family: str) -> list[dict[str, Any]]:
        """中性期权合约列表：inst_id/expiry_ymd/strike/side/ct_mult。"""
        ...

    def fetch_index(self, index_id: str) -> float | None: ...

    def fetch_mark(self, inst_id: str) -> float | None: ...

    def fetch_book(
        self, inst_id: str, depth: int = 5
    ) -> tuple[list[BookLevel], list[BookLevel], int | None]: ...

    def get_ct_mult(self, option_inst_id: str, family: str, default: float) -> float: ...

    def set_pair(self, pair: OptionPair | None) -> None: ...

    def warm_and_subscribe(self, inst_ids: Sequence[str]) -> None:
        """REST 预热盘口 + 设置 WS 订阅列表。"""
        ...

    async def resubscribe(self, inst_ids: Sequence[str]) -> None: ...

    def quote(self, inst_id: str) -> Quote | None: ...

    def snapshot(self, perp_inst_id: str) -> MarketSnapshot: ...

    def snapshot_dict(self, perp_inst_id: str) -> dict[str, Any]: ...

    def set_index_px(self, px: float | None) -> None: ...

    def set_mark_px(self, inst_id: str, mark_px: float | None) -> None: ...
