#!/usr/bin/env python3
import json, random, time, uuid, yaml
from pathlib import Path
import paho.mqtt.client as mqtt

SCENARIOS = {
    "standard_maintenance": lambda: {
        "rate_ml_h": round(random.uniform(2.0, 8.0), 1),
        "vtbi_ml":   random.choice([50, 100, 250]),
        "alarm":     None,
    },
    "soft_limit_hit": lambda: {
        "rate_ml_h": round(random.uniform(15.0, 20.0), 1),  # > ward soft-limit
        "vtbi_ml":   100,
        "alarm":     "SOFT_LIMIT_RATE_HIGH",
    },
    "hard_limit_alarm": lambda: {
        "rate_ml_h": 0.0,
        "vtbi_ml":   0,
        "alarm":     "HARD_STOP_OCCLUDED",
    },
}

def load_cfg():
    return yaml.safe_load(Path("sim_config.yaml").read_text())

def build_event(pump_cfg):
    base = {
        "event_type": "infusion_pump",
        "device_id":  pump_cfg["device_id"],
        "vendor":     pump_cfg["vendor"],
        "timestamp":  time.time(),
        "event_id":   str(uuid.uuid4()),
    }
    base.update(SCENARIOS[pump_cfg["scenario"]]())
    return base

def main():
    cfg = load_cfg()
    cli = mqtt.Client()
    cli.connect(cfg["mqtt"]["host"], cfg["mqtt"]["port"], keepalive=60)

    while True:
        for pump in cfg["pumps"]:
            ev = build_event(pump)
            topic = f"{cfg['mqtt']['topic_prefix']}/{ev['device_id']}/dose"
            cli.publish(topic, json.dumps(ev), qos=1)
            print(f"→ {topic}  {ev}")
        time.sleep(2)                 # publishes every 2 s

if __name__ == "__main__":
    main()
