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

from __future__ import annotations


# Минимальная и максимальная оценка движка.
# Все аналитические оценки в Market Intelligence должны быть в диапазоне 0...100.
MIN_SCORE = 0.0
MAX_SCORE = 100.0


# Минимальная и максимальная уверенность движка.
# Уверенность показывает не силу сигнала, а насколько движок доверяет своему выводу.
MIN_CONFIDENCE = 0.0
MAX_CONFIDENCE = 1.0


# Минимальная и максимальная вероятность.
# Вероятность используется, например, для оценки продолжения движения или изменения направления.
MIN_PROBABILITY = 0.0
MAX_PROBABILITY = 100.0


# Минимальный и максимальный вес показателя.
# Вес показывает, насколько сильно отдельный показатель влияет на итоговую оценку.
MIN_WEIGHT = 0.0
MAX_WEIGHT = 1.0


# Значения по умолчанию.
# Они используются, когда данных недостаточно или движок безопасно возвращает пустой результат.
DEFAULT_SCORE = 0.0
DEFAULT_CONFIDENCE = 0.0
DEFAULT_PROBABILITY = 0.0
DEFAULT_WEIGHT = 1.0


# Границы для словесной оценки качества score.
# Эти значения не принимают торговых решений, а только помогают читать диагностику.
WEAK_SCORE_THRESHOLD = 30.0
NORMAL_SCORE_THRESHOLD = 50.0
GOOD_SCORE_THRESHOLD = 70.0
EXCELLENT_SCORE_THRESHOLD = 85.0


# Границы для словесной оценки confidence.
# Число confidence остаётся основным значением, а эти границы помогают
# объяснять его человеку в журнале и диагностике.
VERY_LOW_CONFIDENCE_THRESHOLD = 0.15
LOW_CONFIDENCE_THRESHOLD = 0.30
NORMAL_CONFIDENCE_THRESHOLD = 0.50
HIGH_CONFIDENCE_THRESHOLD = 0.70
VERY_HIGH_CONFIDENCE_THRESHOLD = 0.85


# Возраст данных по умолчанию.
# Если данные старше этого значения, результат можно считать устаревшим.
DEFAULT_STALE_AFTER_SECONDS = 180.0


# Время жизни аналитического сигнала по умолчанию.
# Старый сигнал постепенно теряет значение для анализа.
DEFAULT_SIGNAL_TTL_SECONDS = 180.0


# Ограничение на количество зависимостей одного движка.
# Это защитный архитектурный предел, чтобы движки не превращались
# в большие модули, зависящие от всей платформы сразу.
MAX_ENGINE_DEPENDENCIES = 8


# Ограничение на количество метрик в одном результате.
# Если метрик становится слишком много, значит движок, возможно,
# начинает выполнять чужую работу и его нужно разделить.
MAX_ENGINE_METRICS = 32


# Ограничение на количество предупреждений в диагностике.
# Это защищает журнал от слишком шумных записей.
MAX_DIAGNOSTIC_WARNINGS = 16


# Ограничение на количество ошибок в диагностике.
# Даже если ошибок много, в результате нужно сохранять только полезную часть.
MAX_DIAGNOSTIC_ERRORS = 16


# Базовый набор таймфреймов для первого этапа Market Intelligence.
# Движки не должны жёстко проверять эти значения внутри своей логики.
DEFAULT_TIMEFRAMES = (
    "1m",
    "5m",
    "15m",
    "1h",
)


# Таймфреймы, которые архитектура должна поддерживать в будущем.
# Они указаны здесь как допустимое расширение, но не обязаны использоваться
# на первом этапе реализации.
FUTURE_TIMEFRAMES = (
    "4h",
    "1d",
    "1w",
)


# Поля, которые запрещены в результатах Market Intelligence.
# Аналитический слой не должен принимать торговые решения или создавать заявки.
FORBIDDEN_TRADING_FIELDS = frozenset(
    {
        "should_buy",
        "should_sell",
        "should_enter",
        "should_exit",
        "should_close",
        "should_flip",
        "open_position",
        "close_position",
        "place_order",
        "cancel_order",
        "leverage",
        "order_id",
    }
)