from typing import Dict, List, Tuple

ModeStep = Tuple[float, float, float]  # duration, acceleration, frequency
ModeDefinition = Dict[str, object]

MODES: Dict[str, ModeDefinition] = {
    "soft": {
        "name": "soft",
        "description": "Low-frequency softening/training pulse.",
        "profile": [(600.0, 10.0, 50.0)],
    },
    "hard": {
        "name": "hard",
        "description": "High-frequency stiffening pulse.",
        "profile": [(300.0, 5.0, 150.0)],
    },
    "cyclic": {
        "name": "cyclic",
        "description": "Repeated soft/hard cycles for sequence memory testing.",
        "profile": [(600.0, 10.0, 50.0), (300.0, 5.0, 150.0)] * 3,
    },
    "thermal": {
        "name": "thermal",
        "description": "Passive hold/rest period to let the material relax.",
        "profile": [(3600.0, 0.0, 0.0)],
    },
}


def available_modes() -> List[str]:
    return list(MODES.keys())


def get_mode(name: str) -> ModeDefinition:
    if name not in MODES:
        raise KeyError(f"Unknown mode: {name}")
    return MODES[name]


def profile_for_mode(name: str) -> List[ModeStep]:
    return get_mode(name)["profile"]


def describe_mode(name: str) -> str:
    mode = get_mode(name)
    return f"{mode['name']}: {mode['description']}"
