import copy,hashlib,json
from pathlib import Path
P=Path(__file__).resolve().parent
common={'staff_id':'@staff_one','set_date':'2097-11-11'}
cases={}
def add(name,action,body,kind,method_group=None):cases[name]={'method':'POST','path':'/store/investigate.NutritionLack/'+action,'host':'store.investigate-write.invalid','context':'one','body':body,'kind':kind,'group':method_group}
def body(**values):return dict(common,**values)
problem1=body(enum_data=[{'enum_key':'1','checked':1,'v1':0,'v2':0},{'enum_key':'11','checked':0,'v1':177,'v2':66},{'enum_key':'9','checked':0,'v1':0,'v2':0}],lack=['1'],meal_type=['1'],nutrition_type=['1'],other_text='CDXIW11C8F2_PROBLEM1')
problem2=body(enum_data=[{'enum_key':'1','checked':0,'v1':0,'v2':0},{'enum_key':'11','checked':1,'v1':179,'v2':67},{'enum_key':'25','checked':0,'v1':0,'v2':0}],lack=['2'],meal_type=['1'],nutrition_type=[],other_text='CDXIW11C8F2_PROBLEM2')
meals1=body(enum_data=[{'enum_id':'2','recommend':'CDXIW11C8F2_MEAL2'},{'enum_id':'7','recommend':'CDXIW11C8F2_MEAL7'}],other_text='CDXIW11C8F2_MEALS1')
meals2=body(enum_data=[{'enum_id':'3','recommend':'CDXIW11C8F2_MEAL3'}],other_text='CDXIW11C8F2_MEALS2')
food1=body(enum_data=['2','3'],other_text='CDXIW11C8F2_FOOD1',food_allergy='CDXIW11C8F2_ALLERGY1',food_Intolerance='CDXIW11C8F2_INTOLERANCE1',food_disable='CDXIW11C8F2_DISABLE1')
food2=body(enum_data=['3','4'],other_text='CDXIW11C8F2_FOOD2',food_allergy='CDXIW11C8F2_ALLERGY2',food_Intolerance='CDXIW11C8F2_INTOLERANCE2',food_disable='CDXIW11C8F2_DISABLE2')
for group,action,initial,changed,detail in [('PROBLEM','setProblem',problem1,problem2,'detail'),('MEALS','setMeals',meals1,meals2,'mealDetai'),('FOOD','setFood',food1,food2,'foodDetail')]:
    add(group+'_CREATE',action,initial,'write',group)
    add(group+'_DETAIL1',detail,dict(common),'read',group)
    add(group+'_UPDATE',action,changed,'write',group)
    add(group+'_DETAIL2',detail,dict(common),'read',group)
for type in [6,10,11]: add('DATES_'+str(type),'getCheckedDate',{'staff_id':'@staff_one','type':type},'read')
for group,action,initial in [('PROBLEM','setProblem',problem1),('MEALS','setMeals',meals1),('FOOD','setFood',food1)]:
    cross=copy.deepcopy(initial);cross['staff_id']='@staff_two';add(group+'_CROSS',action,cross,'denied',group)
missing=copy.deepcopy(problem1);missing['staff_id']=0;add('PROBLEM_MISSING','setProblem',missing,'denied','PROBLEM')
assert len(cases)==19
for lane in ['B','C']:
    values=copy.deepcopy(cases)
    refs={'@staff_one':46334 if lane=='B' else 1851,'@staff_two':46335 if lane=='B' else 1852}
    for case in values.values():
        case['body']={k:refs.get(v,v) if isinstance(v,str) else v for k,v in case['body'].items()}
        case['body_raw']=json.dumps(case['body'],ensure_ascii=False,separators=(',',':'))
    (P/f'cases-{lane}.json').write_text(json.dumps(values,ensure_ascii=False,indent=2)+'\n')
source=P.parent/'parallel-ai-rope-exact-http-20261011/source-frozen-sha.json'
(P/'source-frozen-sha.json').write_bytes(source.read_bytes())
plan={'source_methods':['setProblem','setMeals','setFood'],'terminal_equivalents':[],'synthetic_scope':{'tenant':2147001111,'date':'2097-11-11','operator':{'B':10074,'C':10010},'staff':{'B':46334,'C':1851}},'raw_case_sha256':{l:hashlib.sha256((P/f'cases-{l}.json').read_bytes()).hexdigest() for l in ['B','C']},'per_lane_upper_budget':{'HTTP':19,'INSERT':19,'UPDATE_statements':7,'UPDATE_affected_max':8,'DELETE_statements':3,'DELETE_affected_max':3,'DDL':0,'CLI_fixture_INSERT':0},'insert_budget_breakdown':{'Problem_create_master_and_answers':7,'Problem_update_new_answers':4,'Meals_create_master_and_answers':3,'Meals_update_new_answer':1,'Food_create_master_and_answers':3,'Food_update_new_answer':1},'write_tables':['yoshop_nutrition_meals','yoshop_nutrition_lack'],'no_legacy_date_write':'2031-04-05','first_original_phase':['PROBLEM_CREATE','MEALS_CREATE','FOOD_CREATE'],'per_method_success_do_not_replay':True,'failed_original_C_retest_HTTP_budget_requires_Root':True}
(P/'machine-plan.json').write_text(json.dumps(plan,ensure_ascii=False,indent=2)+'\n')
print(json.dumps({'methods':3,'cases_per_lane':19,'INSERT_budget_per_lane':19,'all_HTTP_DML_DDL':0}))
