"""Load live strategy plugins from config module paths."""

from __future__ import annotations

import importlib
from typing import Any

from RenTech.live.platform_config import StrategySlot
from RenTech.live.protocols import LiveStrategy


def load_strategy(slot: StrategySlot) -> LiveStrategy:
    """
    Import ``module`` path formatted as ``package.module:ClassName``.

    Example: ``RenTech.live.strategies.vrp_ibkr:VrpIbkrStrategy``
    """
    mod_path, _, cls_name = slot.module.partition(":")
    if not mod_path or not cls_name:
        raise ValueError(
            f"Strategy {slot.id!r} module must be 'dotted.module:ClassName', got {slot.module!r}"
        )
    mod = importlib.import_module(mod_path)
    cls = getattr(mod, cls_name)
    inst = cls()
    if not hasattr(inst, "strategy_id"):
        raise TypeError(f"{cls_name} missing strategy_id")
    if str(inst.strategy_id) != slot.id:
        raise ValueError(f"Strategy class id {inst.strategy_id!r} != config id {slot.id!r}")
    return inst  # type: ignore[return-value]


def load_all_enabled(slots: tuple[StrategySlot, ...]) -> list[tuple[StrategySlot, LiveStrategy]]:
    out: list[tuple[StrategySlot, LiveStrategy]] = []
    for slot in slots:
        if not slot.enabled:
            continue
        out.append((slot, load_strategy(slot)))
    return out
