"""独立离线核验；Python 3.12 标准库，无网络或设备访问。"""
from pathlib import Path
import json
import struct
import datetime as dt
import math
import re
import uuid

def parse(d):
    date=d['date']; time=d['time']
    if len(date)!=4 or len(time)!=4 or any(type(x)is not int or not 0<=x<=255 for x in date+time): raise ValueError('日期时间长度错误')
    y,m,day,w=[None if x==255 else x for x in date]
    if y is not None: y+=1900
    if (m is not None and not 1<=m<=12) or (day is not None and not 1<=day<=31) or (w is not None and not 1<=w<=7): raise ValueError('日期子集不支持')
    fields=[None if x==255 else x for x in time]
    if any(v is not None and not 0<=v<=limit for v,limit in zip(fields,(23,59,59,99))): raise ValueError('时间字段越界')
    h,mi,s,hs=fields; concrete=all(v is not None for v in (y,m,day,h,mi,s,hs)); stamp=None
    if concrete:
        try: stamp=dt.datetime(y,m,day,h,mi,s,hs*10000).isoformat(timespec='microseconds')
        except ValueError: raise ValueError('日历日期非法') from None
    return {'date_fields':dict(zip(('year','month','day','weekday'),(y,m,day,w))),'time_fields':dict(zip(('hour','minute','second','hundredths'),fields)),'concrete':concrete,'local_datetime':stamp}


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()
