#!/usr/bin/env python3
"""Safe consumer-side resume adapter for verified continuity receipts."""
import hashlib, json, sys

def canon(x):
    return json.dumps(x, ensure_ascii=False, sort_keys=True, separators=(",", ":"))
def digest(x): return hashlib.sha256(canon(x).encode()).hexdigest()
def refuse(code, detail):
    print(json.dumps({"status":"REFUSE", "code":code, "detail":detail}, sort_keys=True))
    return 1

def main(path):
    try:
        rows=[json.loads(line) for line in open(path, encoding="utf-8") if line.strip()]
    except Exception as e: return refuse("READ_ERROR", str(e))
    if not rows: return refuse("EMPTY", "no receipt records")
    prev=None
    for i,r in enumerate(rows):
        required=("seq","event","provenance","status","payload","self_hash")
        missing=[k for k in required if k not in r]
        if missing: return refuse("MISSING_FIELDS", f"record {i}: {','.join(missing)}")
        if r["status"] == "INHERITED": return refuse("INHERITED_NOT_FACT", f"record {i}")
        if not isinstance(r["provenance"], dict) or not r["provenance"].get("source_ref"):
            return refuse("PROVENANCE_REQUIRED", f"record {i}")
        body={k:r[k] for k in r if k != "self_hash"}
        if digest(body) != r["self_hash"]: return refuse("HASH_SELF", f"record {i}")
        if prev is not None and r.get("prev_hash") != prev:
            return refuse("HASH_CHAIN", f"record {i}")
        prev=r["self_hash"]
    last=rows[-1]
    p=last["payload"]
    for k in ("stable_id","next_gate","owner_or_waiting_on","exit_condition"):
        if not p.get(k): return refuse("RESUME_FIELDS", k)
    out={"status":"RESUME_READY","stable_id":p["stable_id"],"next_gate":p["next_gate"],"owner_or_waiting_on":p["owner_or_waiting_on"],"exit_condition":p["exit_condition"],"evidence_ref":last["provenance"]["source_ref"],"verified_records":len(rows),"head_hash":last["self_hash"]}
    print(json.dumps(out, ensure_ascii=False, sort_keys=True)); return 0

if __name__ == "__main__": sys.exit(main(sys.argv[1]) if len(sys.argv)==2 else refuse("USAGE","resume_adapter.py RECEIPTS.jsonl"))
