<?php
require_once __DIR__ . '/source/tests/SchoolNutrition/SchoolNutritionDraftServiceTest.php';
class ReviewQueueCrashTest extends \tests\SchoolNutrition\SchoolNutritionDraftServiceTest {
    private function invokeFixture($name, array $args = []) {
        $r = new \ReflectionMethod(\tests\SchoolNutrition\SchoolNutritionDraftServiceTest::class, $name);
        $r->setAccessible(true);
        return $r->invokeArgs($this, $args);
    }
    public function testReviewQueueCrashAfterApplyReportsFailedForPersistedDraft(): void {
        $created = $this->invokeFixture('service')->openDraft($this->invokeFixture('validPayload'));
        $this->invokeFixture('seedRecommendationCandidates');
        $svc = $this->invokeFixture('recommendationTaskService', [static function (): bool {return true;}]);
        $submitted = $svc->submit(['plan_version_id'=>$created['version_id'],'expected_version'=>0]);
        $ok = $svc->process($submitted['task_no']);
        $this->assertSame('SUCCEEDED',$ok['status']);
        // Recreate the durable state at the crash window: saveDraft committed but task status not yet committed.
        \think\Db::name('school_nutrition_recommendation_task')->where('task_no',$submitted['task_no'])->update([
            'status'=>'RUNNING','recommendation_id'=>null,'result_payload'=>null,
        ]);
        $retry = $svc->process($submitted['task_no']);
        $rows = \think\Db::name('school_nutrition_plan_dish')->count();
        $applied = \think\Db::name('school_nutrition_recommendation')->where('status','APPLIED')->count();
        echo "\nREPRO ".json_encode(['after_redelivery'=>$retry['status'],'failure_code'=>$retry['failure_code'],'persisted_dishes'=>$rows,'applied_recommendations'=>$applied])."\n";
        $this->assertSame('FAILED',$retry['status']);
        $this->assertSame('PLAN_VERSION_CONFLICT',$retry['failure_code']);
        $this->assertSame(35,$rows);
        $this->assertSame(1,$applied);
    }
}
