"""独立离线核验；Python 3.12 标准库，无网络或设备访问。"""
from pathlib import Path
import json
import struct
import datetime as dt
import math
import re
import uuid

def parse(d):
    reads=d['reads']; changes=[]; prev=None
    for i,r in enumerate(reads):
        if not all(k in r for k in ('value','status','source','server')): raise ValueError('原始证据缺必要字段')
        for field in ('source','server'):
            if r[field] is not None:
                try:
                    if not r[field].endswith('Z'): raise ValueError()
                    dt.datetime.fromisoformat(r[field].replace('Z','+00:00'))
                except (ValueError,AttributeError): raise ValueError('时间文本不是明确UTC') from None
        if type(r['status'])is not int or not 0<=r['status']<=0xffffffff: raise ValueError('质量码非法')
        changed=prev is None or (r['value'],r['status'])!=(prev['value'],prev['status'])
        if changed:
            stamp=r['source']; evidence='initial_observation' if prev is None else 'value_changed' if r['value']!=prev['value'] else 'status_changed'
            if stamp is None: evidence='source_time_unknown'
            elif prev is not None and prev['source'] is not None and dt.datetime.fromisoformat(stamp.replace('Z','+00:00'))<=dt.datetime.fromisoformat(prev['source'].replace('Z','+00:00')):
                stamp=None; evidence='contradictory_source_time'
            changes.append({'read':i,'value':r['value'],'status':r['status'],'source_time':stamp,'evidence':evidence})
        prev=r
    return {'reads':reads,'source_changes':changes,'read_count':len(reads),'observed_change_count':max(0,len(changes)-1)}


def main():
    root = Path(__file__).resolve().parent
    fixture = json.loads((root / "fixture.json").read_text(encoding="utf-8"))
    rows = []
    for item in fixture["cases"]:
        try:
            result = parse(item["input"])
        except ValueError as exc:
            assert "expected_error" in item, (item["case_id"], str(exc))
            assert str(exc) == item["expected_error"], (item["case_id"], str(exc))
            rows.append({"case_id": item["case_id"], "kind": item["kind"], "rejected": str(exc)})
        else:
            assert "expected_error" not in item, item["case_id"]
            assert result == item["expected"], (item["case_id"], result, item["expected"])
            rows.append({"case_id": item["case_id"], "kind": item["kind"], "result": result})
    report = {"fixture": fixture["topic"], "cases": rows, "assertions_passed": len(rows), "scope": "合成输入离线演算；未接真实设备"}
    (root / "report.json").write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
    print(json.dumps({"assertions_passed": len(rows), "all_passed": True}, ensure_ascii=True))

if __name__ == "__main__":
    main()
