import cn.jojo.cc.biz.cache.english.*;
import cn.jojo.cc.biz.common.config.EnglishDictConfig;
import cn.jojo.cc.biz.model.bo.english.*;
import cn.jojo.cc.common.enums.*;
import cn.jojo.cc.core.domain.english.*;
import cn.jojo.cc.core.service.english.*;
import com.github.benmanes.caffeine.cache.LoadingCache;
import java.lang.reflect.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
public class IndexRaceProbe {
 static void set(Object o,String n,Object v)throws Exception{Field f=o.getClass().getDeclaredField(n);f.setAccessible(true);f.set(o,v);}
 static Object get(Object o,String n)throws Exception{Field f=o.getClass().getDeclaredField(n);f.setAccessible(true);return f.get(o);}
 static EnglishPhraseDo phrase(){EnglishPhraseDo d=new EnglishPhraseDo();d.setId(7L);d.setPhrase("look up");d.setStatus(1);return d;}
 static EnglishPhraseIndexCacheService index(EnglishPhraseCoreService c,EnglishPhraseVariantCoreService v)throws Exception{var s=new EnglishPhraseIndexCacheService();set(s,"englishPhraseCoreService",c);set(s,"englishPhraseVariantCoreService",v);set(s,"englishDictConfig",new EnglishDictConfig());s.init();return s;}
public static void main(String[] args)throws Exception {
  var state=new AtomicInteger(0);
  var worker=index((id,size)->{if(state.get()==2)throw new IllegalStateException("DB failure");return state.get()==0||id>0?List.of():List.of(phrase());},(ids,del)->List.of());
  var redis=new cn.jojo.cc.biz.rediscache.RedissonHelper();set(worker,"redissonHelper",redis);
  worker.readySnapshot(DataBaseTypeEnum.TEACHING);
  state.set(1);redis.version=1;worker.forceVersionCheck(DataBaseTypeEnum.TEACHING);
  System.out.println("NORMAL_FORCE version="+worker.readySnapshot(DataBaseTypeEnum.TEACHING).version());
  state.set(2);redis.version=2;worker.forceVersionCheck(DataBaseTypeEnum.TEACHING);
  var stale=worker.readySnapshot(DataBaseTypeEnum.TEACHING);
  System.out.println("FAILED_FORCE returnsOld="+(stale!=null)+" local="+stale.version()+" remote="+redis.version+" oldPhrase="+worker.findMatchByExactText(stale,"look up").phraseId());
 }
}
