from __future__ import annotations


def execute(payload: dict) -> dict:
    distance = float(payload.get("distanceM", 0))
    target_distance = float(payload.get("targetDistanceM", 1.8))
    reasons = []
    if float(payload.get("payloadKg", 0)) > 120: reasons.append("PAYLOAD_LIMIT")
    if float(payload.get("batteryPercent", 0)) < 20: reasons.append("LOW_BATTERY")
    accepted = not reasons
    close_stop = distance < 0.8
    speed = 0.0 if not accepted or close_stop else min(float(payload.get("maxSpeedMps", 0.8)), max(0.0, (distance - target_distance) * 0.7))
    command = "BLOCKED" if not accepted else ("SAFETY_STOP" if close_stop else ("HOLD" if speed == 0 else "FOLLOW"))
    return {"component": "cwsfa/following-transport-amr", "accepted": accepted,
            "status": command, "target": "acu", "workerTrackId": str(payload.get("workerTrackId", "unknown")),
            "speedMps": round(speed, 3), "command": command, "blockingReasons": reasons}
