# app/src/trading/strategies/registry.py

from __future__ import annotations

from src.trading.strategies.base import BaseStrategy
from src.trading.strategies.hold import HoldStrategy
from src.trading.strategies.scalp import ScalpStrategy
from src.trading.strategies.trend import TrendStrategy


class StrategyRegistry:
    # доступные стратегии
    _strategies: dict[str, BaseStrategy] = {
        "HOLD": HoldStrategy(),
        "TREND": TrendStrategy(),
        "GRID": HoldStrategy(),
        "SCALP": ScalpStrategy(),
    }

    # сбросить runtime-память одной стратегии
    @classmethod
    def reset_runtime(
        cls,
        name: str | None = None,
        *,
        symbol: str | None = None,
    ) -> None:
        if name:
            strategy = cls.get(name)
            strategy.reset_runtime(symbol)
            return

        for strategy in cls._strategies.values():
            strategy.reset_runtime(symbol)

    # сбросить runtime-память всех стратегий
    @classmethod
    def reset_all_runtime(cls) -> None:
        cls.reset_runtime()
        
    # получить стратегию по имени
    @classmethod
    def get(cls, name: str | None) -> BaseStrategy:
        if not name:
            return cls._strategies["HOLD"]

        normalized_name = name.strip().upper()
        return cls._strategies.get(normalized_name, cls._strategies["HOLD"])

    # получить список доступных стратегий
    @classmethod
    def names(cls) -> list[str]:
        return sorted(cls._strategies.keys())