# app/src/market_data/acquisition/protocol.py

from __future__ import annotations

from typing import Protocol, runtime_checkable

from src.market_data.acquisition.models.candle import Candle
from src.market_data.acquisition.models.instrument import Instrument
from src.market_data.acquisition.models.quote import Quote


# Источник сырого документа Instrument Reference Data.
@runtime_checkable
class InstrumentDocumentSource(Protocol):
    def fetch_instrument_document(self) -> object:
        """
        Получить декодированный транспортный документ Instrument Reference Data.

        Источник не выполняет schema validation, parsing, value validation
        или mapping во внутреннюю модель Instrument.
        """
        ...


# Обработчик сырого документа Instrument Reference Data.
@runtime_checkable
class InstrumentDocumentHandler(Protocol):
    def handle_instrument_document(
        self,
        document: object,
    ) -> tuple[Instrument, ...]:
        """
        Преобразовать сырой документ в проверенные внутренние модели Instrument.
        """
        ...


# Источник готового справочника инструментов для Acquisition Service.
@runtime_checkable
class InstrumentFeedProtocol(Protocol):
    def load_instruments(self) -> tuple[Instrument, ...]:
        """
        Получить полный immutable-набор внутренних моделей Instrument.
        """
        ...


# Источник сырого документа Quotes Feed.
@runtime_checkable
class QuoteDocumentSource(Protocol):
    def fetch_quote_document(
        self,
        symbol: str,
    ) -> object:
        """
        Получить декодированный транспортный документ текущей котировки.

        Источник не выполняет schema validation, parsing, value validation
        или mapping во внутреннюю модель Quote.
        """
        ...


# Обработчик сырого документа Quotes Feed.
@runtime_checkable
class QuoteDocumentHandler(Protocol):
    def handle_quote_document(
        self,
        document: object,
    ) -> Quote:
        """
        Преобразовать сырой документ в проверенную внутреннюю модель Quote.
        """
        ...


# Источник готовой текущей котировки для Acquisition Service.
@runtime_checkable
class QuoteFeedProtocol(Protocol):
    def load_quote(
        self,
        symbol: str,
    ) -> Quote:
        """
        Получить внутреннюю модель текущей котировки инструмента.
        """
        ...


# Источник сырого документа Candles Feed.
@runtime_checkable
class CandlesDocumentSource(Protocol):
    def fetch_candles_document(
        self,
        symbol: str,
        *,
        interval: str,
        limit: int,
        price_type: str,
    ) -> object:
        """
        Получить декодированный транспортный документ рыночных свечей.

        Источник не выполняет schema validation, parsing, value validation
        или mapping во внутреннюю модель Candle.
        """
        ...


# Обработчик сырого документа Candles Feed.
@runtime_checkable
class CandlesDocumentHandler(Protocol):
    def handle_candles_document(
        self,
        document: object,
        *,
        symbol: str,
        interval: str,
        source: str,
    ) -> tuple[Candle, ...]:
        """
        Преобразовать сырой документ в проверенный immutable-набор Candle.
        """
        ...


# Источник готового набора свечей.
@runtime_checkable
class CandlesFeedProtocol(Protocol):
    def load_candles(
        self,
        symbol: str,
        *,
        interval: str,
        limit: int,
        price_type: str,
    ) -> tuple[Candle, ...]:
        """
        Получить immutable-набор внутренних моделей Candle.
        """
        ...