# app/src/trading/market_intelligence/common/snapshots.py

from __future__ import annotations

from dataclasses import dataclass, field
from time import time

from src.trading.market_intelligence.common.models import EngineResult
from src.trading.market_intelligence.common.payloads import (
    engine_result_to_payload,
)
from src.trading.market_intelligence.common.types import (
    EngineName,
    EngineVersion,
    PayloadDict,
    SymbolName,
    TimeframeName,
)


@dataclass(frozen=True, slots=True)
class EngineSnapshot:
    # Snapshot представляет собой неизменяемый снимок результата работы
    # аналитического движка в определённый момент времени.
    #
    # Snapshot используется для:
    #
    # • журналирования;
    # • Runtime Diagnostics;
    # • последующего сравнения состояний;
    # • формирования Event;
    # • хранения истории анализа.
    #
    # Snapshot не является Runtime-состоянием движка.
    # После создания его содержимое больше не изменяется.

    engine_name: EngineName
    engine_version: EngineVersion

    symbol: SymbolName
    timeframe: TimeframeName

    created_at: float

    payload: PayloadDict = field(default_factory=dict)


def build_engine_snapshot(result: EngineResult) -> EngineSnapshot:
    # Формирует неизменяемый Snapshot из результата Engine.
    #
    # Snapshot всегда строится через общий Payload Layer,
    # чтобы все движки сохраняли результаты в едином формате.

    return EngineSnapshot(
        engine_name=result.engine_name,
        engine_version=result.engine_version,
        symbol=result.symbol,
        timeframe=result.timeframe,
        created_at=time(),
        payload=engine_result_to_payload(result),
    )


def engine_snapshot_to_payload(
    snapshot: EngineSnapshot,
) -> PayloadDict:
    # Преобразует Snapshot в сериализуемый Payload.
    #
    # Отдельная функция позволяет в будущем расширять Snapshot,
    # не изменяя код остальных компонентов платформы.

    return {
        "engine_name": snapshot.engine_name,
        "engine_version": snapshot.engine_version,
        "symbol": snapshot.symbol,
        "timeframe": snapshot.timeframe,
        "created_at": snapshot.created_at,
        "payload": snapshot.payload,
    }