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

from __future__ import annotations

from enum import StrEnum


class MarketDirection(StrEnum):
    # Направление движения цены.
    # Это не торговое решение, а только описание того,
    # куда в основном двигалась цена в анализируемом участке.
    UNKNOWN = "unknown"
    UP = "up"
    DOWN = "down"
    SIDEWAYS = "sideways"
    MIXED = "mixed"


class MarketBias(StrEnum):
    # Общий перекос рынка.
    # Например, рынок может быть больше в пользу роста,
    # больше в пользу снижения или противоречивым.
    UNKNOWN = "unknown"
    BULLISH = "bullish"
    BEARISH = "bearish"
    NEUTRAL = "neutral"
    CONFLICTED = "conflicted"


class MarketPhase(StrEnum):
    # Фаза рынка простыми словами:
    # рынок может ускоряться, откатываться, восстанавливаться,
    # расширять движение, выдыхаться или разворачиваться.
    UNKNOWN = "unknown"
    IMPULSE = "impulse"
    PULLBACK = "pullback"
    RECOVERY = "recovery"
    EXPANSION = "expansion"
    EXHAUSTION = "exhaustion"
    REVERSAL = "reversal"
    CONSOLIDATION = "consolidation"


class MarketRegime(StrEnum):
    # Режим рынка описывает общий характер поведения цены.
    # Это помогает понять, рынок сейчас движется направленно,
    # стоит в диапазоне, резко меняется или ведёт себя нестабильно.
    UNKNOWN = "unknown"
    TRENDING = "trending"
    RANGE = "range"
    BREAKOUT = "breakout"
    MEAN_REVERSION = "mean_reversion"
    HIGH_VOLATILITY = "high_volatility"
    LOW_VOLATILITY = "low_volatility"
    PANIC = "panic"
    EUPHORIA = "euphoria"
    ACCUMULATION = "accumulation"
    DISTRIBUTION = "distribution"


class MarketQuality(StrEnum):
    # Качество рынка показывает, насколько рынок понятен для анализа.
    # Плохое качество означает много шума и мало надёжных признаков.
    UNKNOWN = "unknown"
    POOR = "poor"
    WEAK = "weak"
    NORMAL = "normal"
    GOOD = "good"
    EXCELLENT = "excellent"


class EngineStatus(StrEnum):
    # Статус показывает, насколько успешно движок выполнил свою работу.
    # Даже при ошибке движок должен вернуть понятный статус,
    # чтобы вся система могла продолжить работу безопасно.
    UNKNOWN = "unknown"
    OK = "ok"
    PARTIAL = "partial"
    STALE = "stale"
    INSUFFICIENT_DATA = "insufficient_data"
    ERROR = "error"
    DISABLED = "disabled"


class ConfidenceLevel(StrEnum):
    # Словесный уровень уверенности.
    # Число confidence удобно для расчётов, но человеку проще читать
    # понятный уровень: низкая, нормальная или высокая уверенность.
    UNKNOWN = "unknown"
    VERY_LOW = "very_low"
    LOW = "low"
    NORMAL = "normal"
    HIGH = "high"
    VERY_HIGH = "very_high"


class SignalFreshness(StrEnum):
    # Свежесть сигнала показывает его возраст.
    # Старый сигнал постепенно теряет значение для анализа.
    UNKNOWN = "unknown"
    NEW = "new"
    ACTIVE = "active"
    AGING = "aging"
    EXPIRED = "expired"


class RiskLevel(StrEnum):
    # Общий уровень риска рыночной ситуации.
    # Это не решение закрыть или открыть сделку,
    # а только оценка сложности текущего рынка.
    UNKNOWN = "unknown"
    LOW = "low"
    NORMAL = "normal"
    ELEVATED = "elevated"
    HIGH = "high"
    CRITICAL = "critical"


class TimeframeRole(StrEnum):
    # Роль временного интервала в общем анализе.
    # Например, младший интервал показывает детали,
    # а старший помогает понять общий фон.
    UNKNOWN = "unknown"
    LOWER = "lower"
    PRIMARY = "primary"
    HIGHER = "higher"
    CONFIRMATION = "confirmation"


class CheckStatus(StrEnum):
    # Статус внутренней проверки блока.
    # Используется, чтобы проверять движки по частям,
    # а не ждать завершения всего движка целиком.
    OK = "ok"
    WARNING = "warning"
    ERROR = "error"
    SKIPPED = "skipped"


class ProcessingStage(StrEnum):
    # Этап обработки внутри движка или общего блока.
    # Это не название файла, а смысловая часть работы:
    # входные данные, расчёт, оценка, проверка, payload или результат.
    UNKNOWN = "unknown"
    INPUT = "input"
    CALCULATION = "calculation"
    EVALUATION = "evaluation"
    VALIDATION = "validation"
    PAYLOAD = "payload"
    SNAPSHOT = "snapshot"
    RESULT = "result"
    EVENT = "event"