"""Rebuild demo_register_route.fython from route_core.py, save it in both agent scopes and register on both devices.
Run after any change to route_core.py: python3 build_registrar.py"""
import json, os, sys, time, urllib.request
here = os.path.dirname(os.path.abspath(__file__))
core = open(os.path.join(here, "route_core.py"), encoding="utf-8").read().split('if __name__ == "__main__":')[0]
import hashlib
tail = open(os.path.join(here, "handler_tail.py"), encoding="utf-8").read()
# the hash covers the handler text WITHOUT the hash line; verify from an export: drop the HANDLER_SHA line, sha256 the rest
sha = hashlib.sha256((core + tail).encode("utf-8")).hexdigest()
handler = core + "HANDLER_SHA = " + json.dumps(sha) + "\n" + tail
print("handler sha256", sha)
assert "\\" not in handler and "'''" not in handler, "handler must have no backslashes or triple quotes"
reg = ("$extens(\"include.py\")\ninclude(\"import os\", [])\n\ndef demo_register_route() -> dict:\n    import os\n    import disnet\n    handler_code = '''" + handler +
       "'''\n    d = disnet.Disnet(url=\"https://disnet.extella.ai\")\n    envelope = {\"filtered_source_code\": \"\", \"func_name\": \"\", \"args\": None, \"kwargs\": None, \"cspl\": \"route\", \"response_format\": None}\n"
       "    d.container(code=handler_code, func_name=\"route\", container_path=\"route\", args=None, kwargs=envelope, cspl_type=\"fython\", push=False)\n"
       "    return {\"status\": \"success\", \"handler\": \"route v1: order of three deliveries\", \"version\": 1, \"bytes\": len(handler_code), \"folder\": os.path.abspath(\"containers_folder\")}\n")
open(os.path.join(here, "demo_register_route.fython"), "w", encoding="utf-8").write(reg)
T = open(os.path.expanduser("~/.extella/api_token.txt")).read().strip()
desc = "Registers the route language handler on this device: a program chooses the order of three deliveries (list, nearest, farthest, shortest_total, house); the engine walks shortest paths. Run once per device. Result carries host and os."
def call(path, body, agent):
    r = urllib.request.Request("https://api.extella.ai/api" + path, data=json.dumps(body).encode(), headers={"X-Auth-Token": T, "X-Profile-Id": "default", "X-Agent-Id": agent, "Content-Type": "application/json"})
    return json.loads(urllib.request.urlopen(r, timeout=150).read())
for agent in ("agent_extella_default", "agent_Fgw-hPvLsg9vyn2QDg5GO"):
    print("save", agent[:14], call("/expert/save", {"name": "demo_register_route", "description": desc, "code": reg, "cspl": "fython", "kwargs": {}, "global": False}, agent).get("status"))
if "--no-register" not in sys.argv:
    for dev, name in (("85800354-f7b7-449f-b526-9357cd91f780", "vps"), ("24f37e45-8c9f-4896-b64f-0dcd0cd8b0e4", "mac")):
        t0 = time.time()
        try:
            out = call("/expert/run", {"name": "demo_register_route", "params": {}, "targets": [dev]}, "agent_Fgw-hPvLsg9vyn2QDg5GO")
            print("register", name, round(time.time() - t0, 1), json.dumps(out)[:120])
        except urllib.error.HTTPError as e:
            print("register", name, "HTTP", e.code, e.read()[:200])
