"""合成离线样本检查。与同名 JSON 及文中列出的附件放在同一目录运行。"""
from pathlib import Path, PurePosixPath
import base64, hashlib, io, inspect, json, math, re, subprocess, sys, tempfile, wave, zipfile
from collections import Counter, defaultdict
from datetime import date, datetime
from decimal import Decimal
sys.dont_write_bytecode=True

def sha(b): return hashlib.sha256(b).hexdigest()
def rejected(fn):
    try: fn()
    except (ValueError,TypeError,KeyError,UnicodeError,OverflowError): return True
    return False

def git(root,*args,input=None,check=True):
    r=subprocess.run(['git','-c','core.autocrlf=false',*args],cwd=root,input=input,capture_output=True,check=check)
    return r

def verify(d,base):
    def parse(fields):
        raw=('\0'.join(fields)+'\0').encode();parts=raw.split(b'\0');assert parts.pop()==b''
        rows=[];i=0
        while i<len(parts):
            status=parts[i].decode();i+=1
            if status in {'A','D','M','T','U'}:n=1
            elif re.fullmatch(r'[RC][0-9]{1,3}',status) and 0<=int(status[1:])<=100:n=2
            else:raise ValueError('未支持或非法状态:'+status)
            if i+n>len(parts):raise ValueError('缺少路径')
            paths=[p.decode() for p in parts[i:i+n]];i+=n
            if any(not x for x in paths):raise ValueError('空路径')
            rows.append({'status':status,'old_path':paths[0],'new_path':paths[1]} if n==2 else {'status':status,'path':paths[0]})
        return rows
    assert parse(d['rename_fields'])==[d['expected']]
    assert rejected(lambda:parse(d['rename_fields'][:-1]))
    fallback=parse(d['fallback_fields']);assert [x['status'] for x in fallback]==['D','A']
    invalid=[rejected(lambda fields=fields:parse(fields)) for fields in d['invalid_status_fields']]
    assert all(invalid)
    assert parse(['R0','old.txt','new.txt'])[0]['status']=='R0'
    assert parse(['C100','old.txt','new.txt'])[0]['status']=='C100'
    return {'rename':parse(d['rename_fields']),'fallback_records':len(fallback),'truncated_rejected':True,'invalid_status_rejections':invalid,'supported_single_statuses':['A','D','M','T','U'],'score_range':[0,100]}

if __name__=='__main__':
    base=Path(__file__).resolve().parent
    data=json.loads((base/'a005.json').read_text('utf-8'))
    result=verify(data,base)
    print(json.dumps({'id':'A005','passed':True,'result':result},ensure_ascii=True))
