#!/usr/bin/env python3
import json, sys

REQUIRED = ("referent", "contract_version", "caller_mode", "evaluation_window", "evidence_ref", "inherited_not_fact")


def gate(envelope):
    missing = [k for k in REQUIRED if k not in envelope]
    if missing:
        return False, "REFUSE_MISSING_FIELDS:" + ",".join(missing)
    if envelope["inherited_not_fact"] is not True:
        return False, "REFUSE_INHERITED_STATUS"
    if envelope.get("has_more") is True and set(envelope.get("has_more_streams", [])) - set(envelope.get("continuation_covers", [])):
        return False, "REFUSE_UNCOVERED_STREAM"
    return True, "PASS_COVERAGE_OK"


def process(envelope, cursor):
    ok, reason = gate(envelope)
    trace = {"cursor_before": cursor, "gate": reason}
    if not ok:
        trace.update({"result": "REFUSED", "downstream": "NOT_EXECUTED", "cursor_after": cursor})
        return trace
    next_cursor = envelope.get("next_cursor", cursor)
    trace.update({"result": "ACCEPTED", "downstream": "EXECUTED", "cursor_after": next_cursor})
    return trace


def main():
    if len(sys.argv) != 3:
        print("usage: poller_replay.py ENVELOPE.json CURSOR", file=sys.stderr); return 2
    with open(sys.argv[1], encoding="utf-8") as f: envelope = json.load(f)
    print(json.dumps(process(envelope, sys.argv[2]), sort_keys=True))
    return 0

if __name__ == "__main__": raise SystemExit(main())
