# -*- coding: utf-8 -*-
"""病院の搬送ロボットの Unity が読む条件 hospital-unity-params.json を、前提の表（assumptions.json）とフロアの形から書き出す。

Unity は値を自分で決めず、このファイルを読む（配膳の serving-robot-params.json と同じ考え方。正はサイト側）。
使い方：python3 export_unity_params.py
"""
import hashlib
import json
from pathlib import Path

HERE = Path(__file__).resolve().parent


def day_schedule(A):
    """1日を通して回すときの、青のロボットの便の時刻表（試算 hospital_sim.py の1台から書き出す）。
    Unity はこの時刻に積む所を出る（依頼の出方・まとめ方・ほかのルートへ行っている間は試算が決める）"""
    import hospital_sim as H
    A2, L = H.load_inputs()
    day0 = H.hm(A2["rules"]["day"]["value"][0])
    out = {"what": "青のロボットの便の時刻表。plan × 速さ × 種。depart は 7:30 からの秒、from は積む所（表＝内科外来の処置室／裏口）",
           "model": A2["model"], "day_start": A2["rules"]["day"]["value"][0], "plans": {}}
    for plan in ("廊下だけ", "時間で切替", "裏口だけ"):
        out["plans"][plan] = {}
        for sp in (0.5, 0.6, 0.8):
            p = H.params(A2, {"route_plan": plan, "robot_speed": sp})
            out["plans"][plan][str(sp)] = []
            for seed in range(A2["rules"]["seeds"]["value"]):
                d = H.Day(A2, L, p, 1, seed)
                d.run()
                out["plans"][plan][str(sp)].append([{"depart": t["depart_s"], "from": t["from"]} for t in d.trip_log if t["route"] == "blue"])
    return out


def main():
    A = json.loads((HERE / "assumptions.json").read_text(encoding="utf-8"))
    lay_path = (HERE / A["layout"]).resolve()
    L = json.loads(lay_path.read_text(encoding="utf-8"))
    U = A["unity"]
    lb = (HERE / "../hospital_layouts/hospital_h0b.json").resolve()
    LB = json.loads(lb.read_text(encoding="utf-8"))
    c = {k: v["value"] for k, v in A["common"].items()}
    route = U["route"]["value"]
    out = {
        "about": "病院の搬送ロボットの Unity（ServiceSim の病院の場面）が読む条件。export_unity_params.py が assumptions.json から書き出す。直すときは assumptions.json を直して書き出し直す",
        "model": A["model"],
        "layout": {"file": "tools/hospital_layouts/hospital_h0.json",
                   "md5": hashlib.md5(lay_path.read_bytes()).hexdigest(),
                   "name": L["meta"]["name"]},
        "route": {"key": route, **{k: A["routes"][route][k] for k in ("from_point", "to_point")},
                  "path": L["routes"][route]["path"], "distance_m": L["routes"][route]["distance_m"],
                  "what": U["route"]["what"]},
        "robot": {"speeds_mps": U["speeds"]["value"], "speed_max_mps": c["robot_speed_max"],
                  "min_passage_m": c["min_passage_m"], "size_m": {"w": 0.459, "d": 0.549, "h": 1.081},
                  "size_source": "KEENON 公式 BUTLERBOT W3"},
        "people": {"crowd": U["crowd_people"]["value"], "mix": U["people_mix"]["value"],
                   "stretcher_per_h": U["stretcher_per_h"]["value"]},
        "count_rules": {k: {"value": v["value"], "unit": v["unit"], "what": v["what"]} for k, v in U["count_rules"].items()},
        "braking": {k: (v["value"] if isinstance(v, dict) else v) for k, v in U["braking"].items()},
        "loading_point": U["loading_point"]["value"],
        "loading_point_what": U["loading_point"]["what"],
        "count_shape": U["count_shape"]["value"],
        "near_miss_speed_mps": U["near_miss_speed_mps"]["value"],
        "near_miss_speed_basis": U["near_miss_speed_basis"]["value"],
        "sensor_width_m": U["sensor_width_m"]["value"],
        "wheelchair_avoid_stopped_robot": U["wheelchair_avoid_stopped_robot"]["value"],
        "near_miss_split_by_robot_moving": U["near_miss_split_by_robot_moving"]["value"],
        "east_hall_people_ratio": U["east_hall_people_ratio"]["value"],
        "layout_back_door": {"file": "tools/hospital_layouts/hospital_h0b.json",
                             "md5": hashlib.md5(lb.read_bytes()).hexdigest(),
                             "name": LB["meta"]["name"],
                             "blue_path": LB["routes"]["blue"]["path"], "blue_distance_m": LB["routes"]["blue"]["distance_m"]},
        "staff_corridor_interval_s": U["staff_corridor_interval_s"]["value"],
        "stretcher_yield": U["stretcher_yield"]["value"],
        "crowd_by_time": U["crowd_by_time"]["value"],
        "back_door_hours": A["rules"]["back_door_hours"]["value"],
        "day_schedule": day_schedule(A),
        "waiting_near_miss": U["waiting_near_miss"]["value"],
        "day_end_rule": U["day_end_rule"]["value"],
        "switch_move": U["switch_move"]["value"],
        "seeds": U["seeds"]["value"],
        "basis": {k: U[k]["basis"] for k in ("speeds", "crowd_people", "people_mix", "stretcher_per_h")},
    }
    (HERE / "hospital-unity-params.json").write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8")
    print("wrote hospital-unity-params.json")


if __name__ == "__main__":
    main()
