import cn.jojo.cc.biz.service.english.segment.*;
import cn.jojo.cc.biz.common.config.*;import cn.jojo.cc.biz.cache.english.*;
import cn.jojo.cc.core.domain.question.library.*;import cn.jojo.cc.core.domain.english.*;
import cn.jojo.cc.core.service.english.*;import cn.jojo.cc.common.enums.*;
import org.springframework.transaction.*;import org.springframework.transaction.support.*;
import org.springframework.transaction.interceptor.*;import org.springframework.transaction.annotation.*;import org.springframework.aop.framework.*;
import java.util.*;
public class SegmentWaveProbe {
 static void set(Object o,String n,Object v){try{var f=o.getClass().getDeclaredField(n);f.setAccessible(true);f.set(o,v);}catch(Exception e){throw new RuntimeException(e);}}
 static boolean has(Object o,String n){try{o.getClass().getDeclaredField(n);return true;}catch(Exception e){return false;}}
 static class Manager implements PlatformTransactionManager {QuestionSegmentCoreService core;Manager(QuestionSegmentCoreService c){core=c;}public TransactionStatus getTransaction(TransactionDefinition d){core.events.add("begin");return new SimpleTransactionStatus(true);}public void commit(TransactionStatus s){core.events.add("commit");}public void rollback(TransactionStatus s){core.events.add("rollback");core.failures=0;}}
 @SuppressWarnings("unchecked") static <T>T proxy(T target,Manager m){var f=new ProxyFactory(target);f.setProxyTargetClass(true);f.addAdvice(new TransactionInterceptor(m,new AnnotationTransactionAttributeSource()));return (T)f.getProxy();}
 static class Extractor implements SegmentTextExtractor {boolean error;String body="old";public Map<Integer,List<String>> extractRichTextsByContentType(QuestionDo q){if(error)throw new IllegalStateException("bad body");return Map.of(1,List.of(body));}public String extractPlainText(String x){return x;}}
 @SuppressWarnings("unchecked") static Map<String,cn.jojo.cc.common.dto.english.EnglishSegmentDto> bound(EnglishSegmentDeliveryBizService service,Set<String> keys,Map<String,SelectedSegmentOutput> source){try{try{return (Map)service.getClass().getMethod("resolveByQuestionKeys",Set.class,Map.class).invoke(service,keys,source);}catch(NoSuchMethodException old){return service.resolveByQuestionKeys(keys);}}catch(Exception e){throw new RuntimeException(e);}}
 static int failed;static void check(boolean b,String n){System.out.println((b?"PASS ":"FAIL ")+n);if(!b)failed++;}
 public static void main(String[] args){
 var q=new QuestionDo();q.setId(1L);q.setQuestionKey("q1");q.setUpdateTime(1000L);q.setQuestionType(1);
 var core=new QuestionSegmentCoreService();core.current=q;var manager=new Manager(core);var extractor=new Extractor();extractor.error=true;
 var content=new SegmentContentSnapshotService();set(content,"segmentTextExtractor",extractor);
 var tx=new QuestionSegmentTxService();set(tx,"segments",core);set(tx,"content",content);var txProxy=proxy(tx,manager);
 var engine=new QuestionSegmentBizServiceImpl();var config=new EnglishDictConfig();
 set(engine,"questionSegmentCoreService",core);set(engine,"englishDictConfig",config);set(engine,"phraseIndexCacheService",new EnglishPhraseIndexCacheService());set(engine,"englishWordCacheService",new EnglishWordCacheService());
 if(has(engine,"segmentContentSnapshotService")){set(engine,"segmentContentSnapshotService",content);set(engine,"questionSegmentTxService",txProxy);}else{set(engine,"segmentTextExtractor",extractor);}
 var proxiedEngine=proxy(engine,manager);
 try{proxiedEngine.refreshOne(q,DataBaseTypeEnum.TEACHING,null);}catch(IllegalStateException expected){}
 System.out.println("TX events="+core.events+", committedFailures="+core.failures);
 check(core.failures==1 && core.events.indexOf("rollback")<core.events.lastIndexOf("failed"),"failed record commits after compute rollback and unlock");
 int locks=core.locks;config.enabled=false;proxiedEngine.refreshOne(q,DataBaseTypeEnum.TEACHING,null);check(core.locks==locks,"execution pause before DB lock and transaction");config.enabled=true;
 extractor.error=false;var row=new QuestionSegmentDo();row.setQuestionId(1L);row.setQuestionKey("q1");row.setContentType(1);row.setSegmentStatus(0);row.setQuestionRevision(1000L);row.setSourceTextMd5(content.fingerprint(content.readTexts(q)));row.setSegments("{\"matches\":[{\"text\":\"old\",\"type\":\"word\"}]}");core.rows=List.of(row);
 var delivery=new EnglishSegmentDeliveryBizService();set(delivery,"questionSegmentCoreService",core);set(delivery,"englishDictConfig",config);set(delivery,"segmentMatchIdResolver",new SegmentMatchIdResolver());
 if(has(delivery,"questionCoreService")){var questions=new cn.jojo.cc.core.service.question.library.QuestionCoreService();questions.current=q;set(delivery,"questionCoreService",questions);set(delivery,"segmentContentSnapshotService",content);}
 var json=com.alibaba.fastjson.JSON.parseObject(row.getSegments());String hash="form-v1:00000000000000000000000000000000",outputHash="output-v1:00000000000000000000000000000000";json.put("sourcePayloadHash",hash);json.put("sourceOutputPayloadHash",outputHash);json.put("sourceFormDataId",7L);json.put("sourceContentConfigId",8L);row.setSegments(json.toJSONString());
 var selected=new SelectedSegmentOutput(DataBaseTypeEnum.TEACHING,"/v2.json",new SegmentPayloadIdentity(hash,7L,8L,outputHash));
 check(delivery.resolveByQuestionKeys(Set.of("q1")).isEmpty(),"no actual response credential fails closed");
 check(bound(delivery,Set.of("q1"),Map.of("q1",selected)).containsKey("q1"),"same current output credential remains deliverable");
 var oldSelected=new SelectedSegmentOutput(DataBaseTypeEnum.TEACHING,"/v1.json",new SegmentPayloadIdentity("form-v1:11111111111111111111111111111111",7L,8L,outputHash));
 check(bound(delivery,Set.of("q1"),Map.of("q1",oldSelected)).isEmpty(),"actual selected old output rejects new stored sequence");
 var hook=new QuestionSegmentSaveHookService();var mq=new cn.jojo.cc.biz.service.component.AliyunRocketMQService();var state=new QuestionSegmentStateTxService();set(state,"segments",core);set(hook,"englishDictConfig",config);set(hook,"rocketMqProducerService",mq);set(hook,"applicationEventPublisher",(org.springframework.context.ApplicationEventPublisher)event -> {});set(hook,"questionSegmentStateTxService",proxy(state,manager));
 core.lockError=true;locks=core.locks;boolean hookOk=true;try{hook.hookSave(q,null);}catch(Exception e){hookOk=false;}
 check(hookOk&&core.locks==locks,"business save hook does not access derived table before commit");
 hookOk=true;try{hook.onSaveRequested(new cn.jojo.cc.biz.model.event.english.QuestionSegmentSaveRequestedEvent(hook,q,null));}catch(Exception e){hookOk=false;}
 check(hookOk&&mq.sent==1,"postcommit derived failure preserves main result and still sends compute");
 if(failed>0)System.exit(1);
 }}