#!/usr/bin/env python3
"""sherpa_events.py — the Axones emitter. Append-only, hash-chained event log for
MegaSherpa+ / Atlas operations. Zero dependencies. Import this from the runner loop.

Chain rule: hash = sha256( prev_hash + canonical(event_without_hash) )
canonical = JSON, sorted keys, separators (',',':'), ensure_ascii=False.
Anyone — including a browser — can re-verify the chain. That is the point.
"""
import json, hashlib, time, os

GENESIS = "0"*64

def canonical(ev: dict) -> str:
    core = {k: v for k, v in ev.items() if k != "hash"}
    return json.dumps(core, sort_keys=True, separators=(",", ":"), ensure_ascii=False)

def chain_hash(prev_hash: str, ev: dict) -> str:
    return hashlib.sha256((prev_hash + canonical(ev)).encode("utf-8")).hexdigest()

class Axones:
    def __init__(self, path):
        self.path = path
        self.prev = GENESIS
        self.seq = 0
        if os.path.exists(path):
            with open(path, encoding="utf-8") as f:
                for line in f:
                    if line.strip():
                        ev = json.loads(line)
                        self.prev, self.seq = ev["hash"], ev["seq"]

    def emit(self, type_, actor, family, target=None, verdict=None, evidence=None, note=None, ts=None):
        ev = {"seq": self.seq + 1, "ts": ts or time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
              "type": type_, "actor": actor, "family": family}
        if target:  ev["target"]  = target
        if verdict: ev["verdict"] = verdict
        if evidence:ev["evidence"]= evidence
        if note:    ev["note"]    = note
        ev["prev_hash"] = self.prev
        ev["hash"] = chain_hash(self.prev, ev)
        with open(self.path, "a", encoding="utf-8") as f:
            f.write(json.dumps(ev, ensure_ascii=False) + "\n")
        self.prev, self.seq = ev["hash"], ev["seq"]
        return ev

def verify(path) -> tuple[bool, int, str]:
    prev = GENESIS; n = 0
    with open(path, encoding="utf-8") as f:
        for line in f:
            if not line.strip(): continue
            ev = json.loads(line)
            if ev["prev_hash"] != prev: return (False, n, f"seq {ev['seq']}: prev_hash mismatch")
            if chain_hash(prev, ev) != ev["hash"]: return (False, n, f"seq {ev['seq']}: hash mismatch")
            prev = ev["hash"]; n += 1
    return (True, n, prev)

if __name__ == "__main__":
    import sys
    ok, n, head = verify(sys.argv[1])
    print(json.dumps({"chain_ok": ok, "events": n, "head": head}))
    sys.exit(0 if ok else 1)
