<?php
require_once __DIR__.'/source/tests/SchoolNutrition/SchoolNutritionDraftServiceTest.php';
use think\Db;
use app\common\enum\schoolNutrition\PlanVersionStatus;
class ApprovalMissingRecipeReproTest extends \tests\SchoolNutrition\SchoolNutritionDraftServiceTest
{
 private function fixture(string $method, array $args=[]){$r=new ReflectionMethod(\tests\SchoolNutrition\SchoolNutritionDraftServiceTest::class,$method);$r->setAccessible(true);return $r->invokeArgs($this,$args);}
 public function testMissingRecipeIsWronglyPublished(): void {$this->runRecipeCase(true);}
 public function testZeroPerPersonWeightIsWronglyPublished(): void {$this->runRecipeCase(false);}
 private function runRecipeCase(bool $missing): void {
  $draft=$this->fixture('preparedDraftForApproval');
  if($missing){Db::name('dish')->where('id',1001)->delete();}else{Db::name('dish')->where('id',1001)->update(['food_weight'=>0]);}
  $meals=Db::name('school_nutrition_plan_meal')->where('plan_version_id',$draft['version_id'])->order('id','asc')->select();
  $payload=[];
  foreach($meals as $i=>$meal){$payload[]=['id'=>(int)$meal['id'],'meal_date'=>$meal['meal_date'],'meal_type'=>(int)$meal['meal_type'],'diner_count'=>$i===0?500:0,'dishes'=>$i===0?[['dish_id'=>101,'serving_factor'=>'1.0000']]:[]];}
  $save=$this->fixture('editorService')->saveDraft(['plan_version_id'=>$draft['version_id'],'expected_version'=>$draft['lock_version'],'meals'=>$payload]);
  $service=$this->fixture('approvalService',['reviewer-1','李审核']);
  $submit=$service->submit(['plan_version_id'=>$draft['version_id'],'expected_version'=>$save['lock_version'],'request_id'=>'repro-submit']);
  $approve=$service->approve(['plan_version_id'=>$draft['version_id'],'expected_version'=>$submit['lock_version'],'request_id'=>'repro-approve']);
  $result=['case'=>$missing?'missing_recipe':'zero_per_person_weight','warnings'=>$save['validation_warnings'],'approve'=>$approve,'legacy_menu_rows'=>Db::name('recipes')->count(),'ingredient_rows'=>Db::name('school_nutrition_plan_ingredient')->count(),'purchase_items'=>Db::name('school_purchase_demand_item')->field('calculation_status,error_code')->select()];
  fwrite(STDOUT,json_encode($result,JSON_UNESCAPED_UNICODE)."\n");
  $this->assertNotEmpty($save['validation_warnings']);
  $this->assertSame(PlanVersionStatus::PUBLISHED,$approve['status']);
 }
}
