"""Independent fixed-input oracle from original rows, frozen before HTTP."""
import json, math, hashlib
from pathlib import Path
HERE=Path(__file__).resolve().parent
def number(v):
    v=float(v)
    return int(v) if v.is_integer() else v
def rnd(v,d=0):return number(math.floor(v*10**d+0.5)/10**d)
def response(data,message='获取信息成功'):return dict(code=0,message=message,data=data)
def oracle(s,dictionary):
    st=s['staff_full'][0];di=s['dishes'][0];rec=s['recommend'][0];food=s['food'][0];recipe=s['dish'][0]
    meals=sorted(s['menu'],key=lambda m:int(m['meal_times']));days=['2026-10-08','2026-10-09']
    assert st['sex']==1 and st['birthday']=='1990-01-01' and st['sport_uuid'] not in dictionary['sport_flag']
    assert rec['environment']==36 and rec['temperature']==34 and len(meals)==3
    n=[float(m['number']) for m in meals];powers=[number(float(di['energy'])*v) for v in n]
    protein=[number(float(recipe['food_weight'])/float(di['raw_flag_weight'])*float(m['weight'])*float(food['edible_part'])/100*float(food['protein'])/100*float(m['number'])) for m in meals]
    weights=[number(float(di['weight'])*v) for v in n];weight=sum(weights);fiber=number(float(di['dietary_fiber'])*sum(n));carb=number(float(di['carbohydrate'])*sum(n));va=number(float(di['va'])*sum(n))
    assert weight==600 and sum(protein)==60 and fiber==30 and powers==[100,200,300]
    out={};fields=['va','vb1','vb2','vc','ve','vpp'];actual=[number(float(di[f])*sum(n)) for f in fields]
    vb=rnd(float(rec['recommend_power'])/1000,1);tui=[1500,vb,vb,200,30,30]
    suff=[rnd(rnd(v/t,2)*100) for v,t in zip(actual,tui)]
    out['Oneweiliang']=response(dict(array_tui=tui,actual_data=[actual],sufficiency=suff,is_rational=['不足' if v<80 else '充足' for v in suff],color=['#E9C738' if v<80 else '#89D363' for v in suff]),'请求成功')
    va_tui=dictionary['other_recommend']['18']['va']['1'];va_czd=rnd(rnd(va/va_tui,2)*100)
    out['Moreweiliang']=response([dict(avg=dict(shiji_avg=va,czd_avg=va_czd,tuijian_avg=va_tui),table=dict(heli_day=0,few_80_day=1,few_90_day=0,few_day=1,heli_zhanbi=0,few_zhanbi=100),map=dict(czd_data=[va_czd],shiji_data=[va],recommend_data=[va_tui,va_tui]),que_date=[[]],x=['2026/10/08'],que_date_lack_num=1,que_date_null_num=0)])
    out['Morenutrient']=response(dict(avg=dict(shiji_avg=carb,tui_avg=carb//2,czd_avg=100),table=dict(heli_day=1,plus_110_day=0,plus_120_day=0,few_80_day=0,few_90_day=0,plus_day=0,few_day=0,heli_zhanbi=100,plus_zhanbi=0,few_zhanbi=0),map=dict(czd_data=[100,0],shiji_data=[carb,0],tui_data=[carb,0]),que_date=[[],['未就餐']],x=days,que_date_lack_num=1,que_date_null_num=1))
    enough=rnd(rnd(weight/85,2)*100)
    dietary={k:dict(sum=0,jiantou=2,enough=0) for k in ['guwu','shucai','shuiguo','xuqinshuichan','dan','dounai','jianguo']};dietary['guwu']=dict(sum=weight,jiantou=1,enough=enough);out['Dietary']=response(dietary)
    info={}
    for key,p in zip(['morning','noon','night','all'],protein+[sum(protein)]):
        info[key]=dict(all_sum=p,youzhi=dict(youzhi_sum=0,youzhidanbai=dict(dongwu=0,doulei=0)),yiban=dict(yiban_sum=p,yibandanbai=dict(gulei=p,qita=0 if key=='all' else '0.00')))
    info['all']['youzhi']['youzhidanbai']['prescription_protein']=0;info['all']['youzhi'].update(ratio=0,cz='不足');out['Protein']=response(info)
    info={k:dict(sheruliang=0,zhanbi=0,name=[]) for k in ['zhushi','sucai','huncai','shuiguo','dannaijianguo','tangyin']}
    info['zhushi'].update(sheruliang=fiber,zhanbi=100,name=[di['name']],dietary_fiber=[fiber],dietary_fibers=[fiber],combine_name_dietary_fibers={di['name']:fiber})
    info.update(order=['主食','素菜','荤菜','水果','蛋奶坚果','汤饮'],sum=fiber,recomend=25,need_evaluate='充足');out['DietaryFiber']=response(info)
    arr_num=dict(heli=1,heli_ratio=100,buzu1=0,buzu2=0,buzu_day=0,buzu_ratio=0,guoduo1=0,guoduo2=0,guoduo_day=0,guoduo_ratio=0)
    out['Stage_meal']=response([arr_num,days,[dict(shipower=powers[0],total_power=number(rec['morning_power']),menu_date=days[0],ratio=100),dict(shipower=0,total_power=0,menu_date=days[1],ratio=0)],dict(ratio_jun=100,shiji_jun=powers[0],tuijian_jun=number(rec['morning_power'])),1])
    vegetable='深色蔬菜应占蔬菜总摄入量的1/2以上';animal='优先选择脂肪含量相对较低的水产、禽及制品类'
    specs=[('grey_gushu',6),('shuleijiquanguwu',3),('grey_shucai',21),('shenseshucai',vegetable),('qianseshucai',vegetable),('jungu',vegetable),('haizao',vegetable),('shuiguo',7),('grey_xuqinshuichan',21),('qin',animal),('zhu',animal),('niu',animal),('yang',animal),('shui',animal),('dan',7),('dou',7),('nai',4),('jianguo',5)]
    array={k:dict(shiji=0,tuijian=v,title='') for k,v in specs}
    for k,v in [('grey_gushu',21),('shuleijiquanguwu',7),('grey_shucai',21),('shuiguo',7),('grey_xuqinshuichan',21),('dan',7),('nai',7)]:array[k].update(shiji=v,title='摄入充足')
    for k in ['dou','jianguo']:array[k]['title']='严重缺乏'
    # The original Stage_dietary loop adds each running total, including 100+300+600.
    cum=sum(sum(weights[:i+1]) for i in range(len(weights)))
    out['Stage_dietary']=response([[dict(shiji=weight,tuijian=85,menu_date=days[0],que='',enough=enough),dict(shiji=0,tuijian=0,menu_date=days[1],que='缺早餐缺午餐缺晚餐',enough=0)],array,dict(shiji=cum,tuijian='gushu'),1])
    data=[]
    for day,p in zip(days,[sum(protein),0]):data.append(dict(menu_date=day,yiban_protein=p,yiban_ratio=100 if p else 0,youzhi_protein=0,youzhi_ratio=0,zong_protein=p,yingyangpin=0))
    out['Stage_protein']=response([data,dict(buzu_day=1,buzu_ratio=100,chongzu_day=0,chongzu_ratio=0),[],1])
    # Original Stage_fiber adds all source fiber rows once per calendar date.
    out['Stage_fiber']=response([[fiber,0],[rnd(fiber/25*100),0],days,dict(day_cz=1,cz=100,bz=0,day_bz=0),fiber*len(days),25,1])
    return out
if __name__=='__main__':
    for lane in ['B','C']:
        p=HERE/'private'/lane;s=json.loads((p/'batch-before10.json').read_text());d=json.loads((p/'dictionary.json').read_text());out=oracle(s,d)
        target=p/'expected10-before-http.json'
        if target.exists():assert json.loads(target.read_text())==out
        else:target.write_text(json.dumps(out,ensure_ascii=False,indent=2)+'\n');target.chmod(0o600)
        print(json.dumps(dict(lane=lane,methods=len(out),sha256=hashlib.sha256(target.read_bytes()).hexdigest(),HTTP=0)))
