"""
Modular multi-timeframe stack: data, momentum regime, z-score MR, orchestrator, main runner.

Exports are loaded lazily so lightweight modules (e.g. ``vrp_backtester``) can be
imported without pulling in the full stack.
"""

from __future__ import annotations

import importlib
from typing import Any, Final

__all__ = [
    "DataLoader",
    "MomentumFilter",
    "compute_regime_series",
    "StatArbEngine",
    "PairStatArbEngine",
    "adf_on_spread",
    "causal_ols_spread",
    "engle_granger_spread",
    "merge_intraday_pair",
    "rolling_zscore",
    "run_mean_reversion_positions",
    "StrategyOrchestrator",
    "apply_momentum_gate",
]

_LAZY: Final[dict[str, tuple[str, str]]] = {
    "DataLoader": (".data_loader", "DataLoader"),
    "MomentumFilter": (".momentum_filter", "MomentumFilter"),
    "compute_regime_series": (".momentum_filter", "compute_regime_series"),
    "StatArbEngine": (".statarb_engine", "StatArbEngine"),
    "PairStatArbEngine": (".statarb_engine", "PairStatArbEngine"),
    "adf_on_spread": (".statarb_engine", "adf_on_spread"),
    "causal_ols_spread": (".statarb_engine", "causal_ols_spread"),
    "engle_granger_spread": (".statarb_engine", "engle_granger_spread"),
    "merge_intraday_pair": (".statarb_engine", "merge_intraday_pair"),
    "rolling_zscore": (".statarb_engine", "rolling_zscore"),
    "run_mean_reversion_positions": (".statarb_engine", "run_mean_reversion_positions"),
    "StrategyOrchestrator": (".strategy_orchestrator", "StrategyOrchestrator"),
    "apply_momentum_gate": (".strategy_orchestrator", "apply_momentum_gate"),
}


def __getattr__(name: str) -> Any:
    if name in _LAZY:
        mod_name, attr = _LAZY[name]
        mod = importlib.import_module(mod_name, __name__)
        return getattr(mod, attr)
    raise AttributeError(f"module {__name__!r} has no attribute {name!r}")


def __dir__() -> list[str]:
    return sorted(set(__all__) | set(globals()))
