from pathlib import Path
import subprocess,sys
base=Path('/Users/yixiay/Documents/codexWorkSpace/issues/output/597084-review/impact-2026-11-04/source')
out=Path(__file__).resolve().parent
root=base if '--baseline' in sys.argv else out.parent/'code'
label='red' if '--baseline' in sys.argv else 'green'
s=(root/'application/src/main/java/cn/jojo/cc/biz/service/english/dict/impl/EnglishAudioBackfillBizServiceImpl.java').read_text()
a=s.index('    private boolean handleInFlight(');b=s.index('    private void markSubmitted',a)
header=r'''import java.util.*;
public class AudioRegressionProbe {
 static final String ROW_WORD="word",ROW_PHRASE="phrase",ROW_VARIANT="variant";
 static class StringUtils{static boolean isBlank(String s){return s==null||s.isBlank();}}
 static class Log {void warn(String s,Object...v){}void info(String s,Object...v){}} Log log=new Log();
 static class TtsTaskStatus{String s;TtsTaskStatus(String x){s=x;}boolean isRunning(){return s.equals("running");}boolean isCompleted(){return s.equals("completed");}String getStatus(){return s;}String getError(){return "failure";}}
 static class Tts {boolean error,cancelError;String state="completed";int queries;TtsTaskStatus queryTask(String id){queries++;if(error)throw new RuntimeException("query");return new TtsTaskStatus(state);}void cancelTask(String id){if(cancelError)throw new RuntimeException("cancel");}}
 static class Audio{Long resource;Long saveAudio(String s){return resource;}}
 Tts internalTtsClient=new Tts();Audio englishAudioBizService=new Audio();
 static class EnglishAudioBackfillResultBo{int scanned,running,failed,completed;int getScanned(){return scanned;}void setScanned(int v){scanned=v;}int getRunning(){return running;}void setRunning(int v){running=v;}int getFailed(){return failed;}void setFailed(int v){failed=v;}int getCompleted(){return completed;}void setCompleted(int v){completed=v;}}
 int cleared,failCount;void markCleared(String t,Long id){cleared++;}boolean markCompleted(String t,Long id,Long res){return true;}void increaseFailCount(String k){failCount++;}void clearFailCount(String k){failCount=0;}
'''
footer=r'''static int failures;static void check(boolean ok,String name){System.out.println((ok?"PASS ":"FAIL ")+name);if(!ok)failures++;}
 public static void main(String[]x){
 for(String mode:List.of("completed","query-error","cancel-error","running")){
 var a=new AudioRegressionProbe();a.internalTtsClient.error=mode.equals("query-error");a.internalTtsClient.cancelError=mode.equals("cancel-error");if(mode.equals("running"))a.internalTtsClient.state="running";
 var r=new EnglishAudioBackfillResultBo();try{a.handleInFlight("word",1L,"task",1L,null,10000,1800,r);}catch(Exception e){}
 check(a.cleared==1&&a.failCount==1&&r.failed==1,"timeout all branches "+mode);
 }
 var a=new AudioRegressionProbe();a.internalTtsClient.state="failed";var r=new EnglishAudioBackfillResultBo();a.handleInFlight("word",1L,"task",9999L,null,10000,1800,r);check(a.failCount==1&&a.cleared==1,"terminal failure counts lifecycle");
 a=new AudioRegressionProbe();a.failCount=2;a.englishAudioBizService.resource=88L;r=new EnglishAudioBackfillResultBo();check(a.handleInFlight("word",1L,"task",9999L,null,10000,1800,r)&&a.failCount==0,"completion resets lifecycle failure count");
 a=new AudioRegressionProbe();r=new EnglishAudioBackfillResultBo();a.handleInFlight("word",1L,"task",9999L,null,10000,1800,r);check(a.cleared==0,"temporary completed download failure retains task within budget");
 if(failures>0)System.exit(1);
 }}'''
f=out/'AudioRegressionProbe.java';f.write_text(header+s[a:b]+footer)
r=subprocess.run(['javac','-d',str(out/'audio-classes'),str(f)],capture_output=True,text=True)
if r.returncode: print(r.stderr);sys.exit(r.returncode)
r=subprocess.run(['java','-cp',str(out/'audio-classes'),'AudioRegressionProbe'],capture_output=True,text=True)
(out/(label+'-audio.txt')).write_text(r.stdout+r.stderr+'exit='+str(r.returncode)+'\n');print(r.stdout,r.stderr,'exit=',r.returncode);sys.exit(r.returncode)
