"""Full independent fixed-row DTO oracle, derived before the six HTTP requests."""
import copy,hashlib,json,re
from pathlib import Path
HERE=Path(__file__).resolve().parent
def numbers(v):
    if isinstance(v,dict):return {k:numbers(x) for k,x in v.items()}
    if isinstance(v,list):return [numbers(x) for x in v]
    if type(v) is float and v.is_integer():return int(v)
    return v
def physical(row,lane,plain=True):
    row=copy.deepcopy(row)
    if lane=='C':
        for k in ['power','carbohydrate','protein','fat','sodium']:
            if type(row.get(k)) is float:row[k]=float(format(row[k],'.2f'))
        if plain and type(row.get('use_weight')) is float:row['use_weight']=float(format(row['use_weight'],'.6g'))
    return row
def oracle(s,lane):
    p=next(r for r in s['nutrition'] if r['name']=='CDXNF11F5-candidate-product');setrow=next(r for r in s['nutrition_set'] if r['uuid']==p['set_uuid']);cat=next(r for r in s['nutrition_category'] if r['uuid']==p['nutrition_category_uuid']);time=next(r for r in s['nutrition_time'] if r['uuid']==setrow['use_time']);t=next(r for r in s['nutrition_template'] if r['name']=='CDXNF11F5-candidate-template');ext=next(r for r in s['nutrition_template_ext'] if r['template_uuid']==t['uuid']);assert ext['nutrition_uuid']==p['uuid'] and p['employ']==1
    groupfields=['id','uuid','name','sodium','fat','protein','carbohydrate','power','use_weight','use_number_unit','use_weight_unit','use_method','employ','use_number'];r={k:p[k] for k in groupfields};r.update(use_time=setrow['use_time']);r.update({k:p[k] for k in ['img_path','specifications','manufacturer','supplier','function','synopsis','app_img','nutrition_category_uuid']});r.update(set_name=setrow['name'],category_name=cat['name'],demo=cat['demo']);r=physical(r,lane);r.update(use_weight_unit_cn='',use_number_unit_cn='',use_time_name=time['name']);assert p['use_weight_unit']=='g' and p['use_number_unit']=='份';group={'code':0,'message':'请求成功','data':[r]}
    r={k:p[k] for k in ['uuid','name','img_path','employ','use_method']};r.update(id=setrow['id'],use_time=setrow['use_time']);r.update({k:p[k] for k in ['power','carbohydrate','protein','fat','sodium','use_weight','use_weight_unit','use_number','use_number_unit']});r=physical(r,lane);r['use_number_unit_cn']='';phase=[] if setrow['id']==23 else {'0':0,'2':1,'11':2,'13':3};assert setrow['id']==(23 if lane=='B' else 3);gettime={'code':0,'message':'获取成功','data':{'add_select_phase':phase,'nutrition_array':[r]}}
    t=physical(t,lane,False)
    if lane=='C' and re.fullmatch(r'\d{4}-\d\d-\d\d \d\d:\d\d:\d\d\.0{1,6}',t['create_time']):t['create_time']=t['create_time'].split('.')[0]
    r={k:ext[k] for k in ['train_time','nutrition_uuid','use_volume','use_method']};r.update(img_path=p['img_path'],name=p['name'],set_name=setrow['name']);r.update({k:p[k] for k in ['power','carbohydrate','protein','fat','sodium','use_weight','use_number','use_time','employ']});r=physical(r,lane);r['train_time']=str(r['train_time']) if r['train_time'] else '';t['template_ext']=[r];template={'code':0,'message':'信息获取成功','data':t}
    return numbers({'UseTimeGroup-ro6':group,'GetNutritionTime-ro6':gettime,'TemplateInfo-ro6':template})
if __name__=='__main__':
    for lane in ['B','C']:
        p=HERE/'private'/lane;value=oracle(json.loads((p/'before.json').read_text()),lane);f=p/'expected-before-http.json';assert not f.exists();f.write_text(json.dumps(value,ensure_ascii=False,indent=2)+'\n');f.chmod(0o600);print(json.dumps({'lane':lane,'methods':3,'expected_sha256':hashlib.sha256(f.read_bytes()).hexdigest(),'HTTP':0}))
