# app/src/trading/auto/state.py

from __future__ import annotations

from dataclasses import dataclass


@dataclass(slots=True)
class AutoTradeState:
    # текущее состояние: OFF / OBSERVING / RUNNING
    status: str = "OFF"

    # выбранная стратегия: TREND / GRID / SCALP
    strategy: str | None = "TREND"

    # торговый инструмент
    symbol: str = "ETH/USD_LEVERAGE"

    # риск на одну сделку в %
    risk_percent: float | None = 1.0

    # время последней проверки
    last_check_at: str | None = None

    # последний сырой сигнал стратегии
    last_signal: str | None = None

    # количество одинаковых сигналов подряд
    last_signal_repeat_count: int = 0

    # уверенность последнего сигнала от 0.0 до 1.0
    last_signal_confidence: float = 0.0

    # причина последнего сигнала
    last_signal_reason: str | None = None

    # время начала текущего сигнала, monotonic timestamp
    signal_started_at: float | None = None

    # статус торгового решения: WAITING / CONFIRMING / READY / BLOCKED
    decision_status: str = "WAITING"

    # человекочитаемое объяснение решения
    decision_reason: str | None = None

    # сигнал подтверждён по количеству повторов
    is_signal_confirmed: bool = False

    # сигнал готов к будущему execution
    is_signal_ready: bool = False

    # текущая позиция: NONE / LONG / SHORT
    position_side: str = "NONE"

    # цена входа
    entry_price: float | None = None

    # размер позиции
    position_size: float | None = None

    # monotonic timestamp открытия текущей позиции
    position_opened_monotonic_at: float | None = None

    # нереализованный PnL
    unrealized_pnl_usd: float | None = None

    # position health / runtime risk
    position_pnl_percent: float | None = None
    position_hold_seconds: int | None = None
    position_pressure: str | None = None
    position_health_score: int | None = None
    position_health_status: str | None = None
    position_health_reason: str | None = None
    position_risk_level: str | None = None
    position_risk_reason: str | None = None
    position_trend_alignment: str | None = None
    position_adverse_momentum: bool = False
    position_exit_pressure: str | None = None

    # position intelligence layer
    position_lifecycle_stage: str | None = None
    position_hold_quality: str | None = None
    position_decay_state: str | None = None
    position_exit_confidence: float | None = None
    position_exit_signal: str | None = None
    position_intelligence_reason: str | None = None
    position_recommended_action: str | None = None

    # advanced lifecycle analytics
    position_peak_pnl_usd: float | None = None
    position_peak_pnl_percent: float | None = None

    position_mfe_percent: float | None = None
    position_mae_percent: float | None = None

    position_fatigue_score: float | None = None
    position_fatigue_state: str | None = None

    position_giveback_percent: float | None = None

    # position behavioral state
    position_conviction_state: str | None = None
    position_exit_urgency: str | None = None
    position_reversal_risk: str | None = None

    # stall-состояние позиции:
    # NONE — позиция развивается нормально
    # EARLY — ещё рано оценивать
    # STALLED — позиция стоит на месте
    # NOISY_STALLED — позиция застряла в шумном рынке
    # ADVERSE_STALLED — позиция застряла и рынок начинает идти против неё
    position_stall_state: str | None = None
    position_stall_reason: str | None = None

    # autonomous trade management
    autonomous_action: str | None = None
    autonomous_action_reason: str | None = None
    autonomous_action_confidence: float | None = None
    autonomous_protection_required: bool = False
    autonomous_reduce_required: bool = False
    autonomous_exit_required: bool = False

    # runtime position action execution
    autonomous_last_action: str | None = None
    autonomous_last_action_reason: str | None = None
    autonomous_last_action_at: float | None = None

    # loss cooldown tracking
    last_loss_monotonic_at: float | None = None

    # runtime protection engine
    position_protection_status: str | None = None
    position_protection_reason: str | None = None

    # break-even protection
    break_even_armed: bool = False
    break_even_price: float | None = None

    # trailing protection
    trailing_stop_active: bool = False
    trailing_stop_price: float | None = None

    # locked profit protection
    profit_lock_active: bool = False
    profit_lock_price: float | None = None

    # runtime protection execution
    runtime_protection_action: str | None = None
    runtime_protection_reason: str | None = None
    runtime_protection_updated_at: float | None = None

    # максимальная просадка
    max_drawdown_usd: float | None = None

    # плечо
    leverage: float | None = 2.0

    # stop loss по движению цены в %
    stop_loss_percent: float | None = 1.0

    # take profit по движению цены в %
    take_profit_percent: float | None = 2.0

    # максимальный допустимый paper-убыток в USD
    max_loss_usd: float | None = None

    # максимальная доля баланса, которую можно зарезервировать под позицию
    max_reserved_balance_percent: float | None = 50.0

    # последняя причина блокировки execution
    execution_block_reason: str | None = None

    # человекочитаемая блокировка совершения сделок для UI / Telegram
    execution_block_title: str | None = None
    execution_block_message: str | None = None
    execution_block_action: str | None = None

    # причина авто-уменьшения размера позиции
    execution_size_adjustment_reason: str | None = None

    # капитал, выделенный только под AutoTrade
    allocated_balance_usd: float = 1000.0

    # зафиксированный результат закрытых paper-сделок
    realized_pnl_usd: float = 0.0

    # cumulative realized pnl за текущий цикл автоторговли
    cycle_realized_pnl_usd: float = 0.0

    # количество закрытых сделок в текущем цикле
    cycle_closed_trades: int = 0

    # количество прибыльных закрытых сделок
    cycle_winning_trades: int = 0

    # количество убыточных сделок в текущем цикле
    cycle_losing_trades: int = 0

    # серия убыточных сделок подряд
    cycle_consecutive_losses: int = 0

    # активна ли cooldown-блокировка после серии убытков
    loss_cooldown_active: bool = False

    # причина cooldown-блокировки
    loss_cooldown_reason: str | None = None

    # сумма комиссий за сделки RT в текущем цикле
    cycle_trade_fees_usd: float = 0.0

    # сумма списаний/начислений за левередж в текущем цикле
    cycle_overnight_fees_usd: float = 0.0

    # время запуска текущего цикла
    cycle_started_at: float | None = None

    # время последней adaptive size корректировки
    adaptive_size_changed_at: float | None = None

    # данные последнего flip
    last_flip_old_side: str | None = None
    last_flip_new_side: str | None = None
    last_flip_pnl_usd: float | None = None
    last_flip_reason: str | None = None

    # monotonic timestamp последнего flip
    last_flip_monotonic_at: float | None = None

    # последнее execution-действие
    last_execution_action: str | None = None

    # последняя execution-причина
    last_execution_reason: str | None = None

    # последняя причина блокировки flip
    last_flip_block_reason: str | None = None

    # время последнего успешного flip
    last_flip_at: str | None = None

    # состояние рынка по Market State Engine
    market_state: str | None = None

    # направление тренда: UP / DOWN / FLAT / UNKNOWN
    market_trend: str | None = None

    # волатильность: LOW / NORMAL / HIGH / UNKNOWN
    market_volatility: str | None = None

    # сила тренда: WEAK / NORMAL / STRONG / UNKNOWN
    market_trend_strength: str | None = None

    # качество тренда: CLEAN / NORMAL / NOISY / UNKNOWN
    market_trend_quality: str | None = None

    # фаза рынка: IMPULSE / PULLBACK / RANGE / SQUEEZE / UNKNOWN
    market_phase: str | None = None

    # направление короткой фазы рынка: UP / DOWN / FLAT / UNKNOWN
    market_phase_direction: str | None = None

    # общая оценка рынка 0..100 на основе всех market-метрик:
    # HTF trend, локальный trend, фаза, структура, волатильность, качество, timing.
    market_score: float | None = None

    # человекочитаемая категория market_score:
    # отличный / благоприятный / нейтральный / сложный / неблагоприятный
    market_score_label: str | None = None

    # направленная оценка входа 0..100.
    # market_long_score — насколько хорош вход в Long.
    # market_short_score — насколько хорош вход в Short.
    # Это не дубль market_score: market_score = общий рынок,
    # long/short score = оценка конкретного направления.
    market_long_score: float | None = None
    market_short_score: float | None = None

    # последняя полностью закрытая свеча.
    # В Dzengi последняя candle[-1] обычно текущая формирующаяся,
    # поэтому закрытая свеча берётся как candle[-2].
    last_closed_candle_change_percent: float | None = None
    last_closed_candle_direction: str | None = None

    # движение внутри текущей свечи/интервала анализа.
    # Используется как short-term фактор для входа/выхода и UI.
    current_interval_change_percent: float | None = None
    current_interval_direction: str | None = None
    current_interval_label: str | None = None

    # структура рынка: HH_HL / LH_LL / MIXED / UNKNOWN
    market_structure: str | None = None
    market_structure_reason: str | None = None

    # advanced trend quality metrics
    market_trend_gap_percent: float | None = None
    market_trend_consistency: float | None = None
    market_trend_efficiency: float | None = None
    ema_distance_atr_ratio: float | None = None
    ema_fast_slope_percent: float | None = None
    ema_slow_slope_percent: float | None = None
    candle_noise_score: float | None = None
    price_position_score: float | None = None

    # advanced trend quality semantic states
    trend_quality_score: float | None = None
    ema_distance_state: str | None = None
    entry_timing_state: str | None = None
    entry_timing_reason: str | None = None

    # higher timeframe volatility context
    htf_interval: str | None = None
    htf_atr_percent: float | None = None
    htf_atr_percent_baseline: float | None = None
    htf_volatility_ratio: float | None = None
    htf_volatility: str | None = None

    # higher timeframe trend context
    htf_market_state: str | None = None
    htf_trend: str | None = None
    htf_trend_strength: str | None = None
    htf_trend_quality: str | None = None
    htf_market_phase: str | None = None
    htf_alignment: str | None = None
    htf_confirmation_score: float | None = None
    htf_reason: str | None = None

    # состояние momentum/breakout semantic engine
    # NONE / MOMENTUM_UP / MOMENTUM_DOWN / BREAKOUT_UP / BREAKOUT_DOWN / UNKNOWN
    momentum_state: str | None = None

    # направление momentum
    momentum_direction: str | None = None

    # изменение цены в momentum window
    momentum_change_percent: float | None = None

    # сила momentum относительно threshold
    momentum_strength: float | None = None

    # breakout уровень
    breakout_level: float | None = None

    # расстояние от breakout уровня в %
    breakout_distance_percent: float | None = None

    # причина breakout/momentum классификации
    breakout_reason: str | None = None

    # таймфрейм анализа рынка
    market_analysis_interval: str | None = None

    # объяснение последнего анализа рынка
    market_analysis_reason: str | None = None

    # код причины, почему вход в позицию сейчас не выполнен
    entry_block_reason: str | None = None

    # человекочитаемое объяснение причины не входа
    entry_block_message: str | None = None

    # время последнего обновления сигнала, monotonic timestamp
    signal_updated_at: float | None = None

    # время последнего обновления market analysis, monotonic timestamp
    market_analysis_updated_at: float | None = None

    # причина runtime expiration
    runtime_expired_reason: str | None = None

    # человекочитаемое сообщение runtime expiration
    runtime_expired_message: str | None = None

    # возраст последнего market snapshot в секундах
    snapshot_age_seconds: float | None = None

    # spread между bid/ask в %
    spread_percent: float | None = None

    # качество рынка для исполнения: GOOD / WARNING / BLOCKED / UNKNOWN
    execution_quality: str | None = None

    # код причины качества исполнения
    execution_quality_reason: str | None = None

    # человекочитаемое объяснение качества исполнения
    execution_quality_message: str | None = None

    # источник execution pricing snapshot
    execution_price_source: str | None = None

    # возраст execution snapshot
    execution_price_age_seconds: float | None = None

    # bid execution price
    execution_bid_price: float | None = None

    # ask execution price
    execution_ask_price: float | None = None

    # last execution price
    execution_last_price: float | None = None

    # pricing freshness status:
    # FRESH / AGING / STALE / UNKNOWN
    execution_price_freshness: str | None = None

    # признак деградации runtime market data
    market_runtime_degraded: bool = False

    # сколько секунд текущий BUY / SELL сигнал удерживается
    signal_confirmation_seconds: int = 0

    # сколько секунд нужно удерживать BUY / SELL сигнал для подтверждения
    signal_confirmation_required_seconds: int = 10

    # сколько повторов ещё не хватает до подтверждения
    signal_confirmation_missing_repeats: int = 0

    # прогресс подтверждения сигнала от 0.0 до 1.0
    signal_confirmation_progress: float = 0.0

    # человекочитаемая причина текущего confirmation status
    signal_confirmation_reason: str | None = None

    # semantic-статус execution слоя:
    # IDLE / WAITING_SIGNAL / READY / BLOCKED / EXECUTED / POSITION_OPEN / PROTECTED
    execution_semantic_status: str | None = None

    # короткая строка для UI
    execution_semantic_message: str | None = None

    # техническая детализация для логов / отладки
    execution_semantic_reason: str | None = None

    # итоговая execution confidence от 0.0 до 1.0
    execution_confidence_score: float | None = None

    # уровень confidence: LOW / NORMAL / HIGH
    execution_confidence_level: str | None = None

    # минимальный score для допуска execution
    execution_confidence_required_score: float | None = None

    # человекочитаемая причина confidence-оценки
    execution_confidence_reason: str | None = None

    # детализация факторов confidence для логов / отладки
    execution_confidence_factors: dict | None = None

    # итоговый риск после adaptive sizing
    effective_risk_percent: float | None = None

    # итоговый риск в USD после adaptive sizing
    effective_target_risk_usd: float | None = None

    # базовый размер позиции до adaptive sizing
    adaptive_size_base: float | None = None

    # итоговый размер позиции после adaptive sizing
    adaptive_size_final: float | None = None

    # итоговый множитель adaptive sizing
    adaptive_size_multiplier: float | None = None

    # человекочитаемая причина adaptive sizing
    adaptive_size_reason: str | None = None

    # факторы adaptive sizing для логов / отладки
    adaptive_size_factors: dict | None = None

    # статус торговой сессии инструмента
    market_is_open: bool | None = None
    market_status: str | None = None
    market_status_message: str | None = None
    market_status_updated_at: float | None = None

    # номер текущего цикла автоторговли, для которого была зафиксирована статистика
    cycle_number: int = 0

    # уникальный номер сделки внутри runtime
    trade_sequence: int = 0

    # id текущей открытой сделки
    current_trade_id: str | None = None

    # номер цикла, в котором открыта текущая сделка
    current_trade_cycle_number: int | None = None