from pathlib import Path
p=Path(__file__).resolve().parent
s=p/'stubs'
def w(name,body):
 f=s/(name.replace('.','/')+'.java');f.parent.mkdir(parents=True,exist_ok=True);f.write_text('package '+name.rsplit('.',1)[0]+';\n'+body)
for n in ['jakarta.annotation.Resource','jakarta.annotation.PostConstruct','org.springframework.stereotype.Component','org.springframework.stereotype.Service']:
 w(n,'public @interface '+n.rsplit('.',1)[1]+' {}')
w('io.swagger.v3.oas.annotations.media.Schema','public @interface Schema { String title() default ""; String description() default ""; String[] allowableValues() default {}; RequiredMode requiredMode() default RequiredMode.AUTO; enum RequiredMode {AUTO,REQUIRED,NOT_REQUIRED} }')
w('io.swagger.v3.oas.annotations.tags.Tag','public @interface Tag { String name(); }')
w('cn.jojo.cc.common.enums.DataBaseTypeEnum','public enum DataBaseTypeEnum {PROD, TEACHING, BOTH}')
w('cn.jojo.cc.common.enums.DataSourceEnum','public enum DataSourceEnum { PROD, DEFAULT; public String getValue(){return name();} }')
w('cn.jojo.cc.common.enums.RedisKeyEnum','public enum RedisKeyEnum { ENGLISH_PHRASE_INDEX_BUILD_LOCK, ENGLISH_PHRASE_INDEX_VERSION; public String buildKey(String s){return name()+s;} }')
w('cn.jojo.cc.common.enums.DeleteStatusEnum','public enum DeleteStatusEnum { NOT_DELETE; public Integer getValue(){return 0;} }')
w('cn.jojo.cc.common.enums.english.EnglishPublishStatusEnum','public enum EnglishPublishStatusEnum { PUBLISHED; public Integer getCode(){return 1;} }')
w('cn.jojo.cc.common.enums.english.SegmentStatusEnum','public enum SegmentStatusEnum {NORMAL; public Integer getCode(){return 0;} }')
w('cn.jojo.cc.core.multidatasource.MultiDataSourceContextHolder','public class MultiDataSourceContextHolder { public static String getDataSource(){return "DEFAULT";} public static void setDataSource(String s){} public static void clearSource(String s){} public static boolean isJYDatasource(){return false;} }')
w('org.redisson.api.RLock','public interface RLock { boolean tryLock(long n, java.util.concurrent.TimeUnit unit) throws InterruptedException; boolean isHeldByCurrentThread(); void unlock(); }')
w('org.redisson.api.RAtomicLong','public interface RAtomicLong {long get(); long incrementAndGet();}')
w('org.redisson.api.RedissonClient','public interface RedissonClient {RLock getLock(String k); RAtomicLong getAtomicLong(String k);}')
w('cn.jojo.cc.core.bo.LoginUserBo','@lombok.Data public class LoginUserBo {Long loginUserId; String loginUserName;}')
w('cn.jojo.cc.core.domain.question.library.QuestionDo','@lombok.Data public class QuestionDo {Long id; String questionKey; Long updateTime;}')
w('cn.jojo.cc.core.domain.english.QuestionSegmentDo','@lombok.Data public class QuestionSegmentDo {Long questionId; String questionKey; String sourceTextMd5; Long questionRevision; String segments; Integer segmentStatus; Integer retryCount; Long creatorId; String creator; Long operatorId; String operator;}')
w('cn.jojo.cc.core.domain.english.EnglishPhraseDo','@lombok.Data public class EnglishPhraseDo {Long id; String phrase; Integer status;}')
w('cn.jojo.cc.core.domain.english.EnglishPhraseVariantDo','@lombok.Data public class EnglishPhraseVariantDo {Long id; Long phraseId; String variantText;}')
w('cn.jojo.cc.core.service.english.EnglishPhraseCoreService','public interface EnglishPhraseCoreService { java.util.List<cn.jojo.cc.core.domain.english.EnglishPhraseDo> listPageByIdGt(long id,int size); }')
w('cn.jojo.cc.core.service.english.EnglishPhraseVariantCoreService','public interface EnglishPhraseVariantCoreService { java.util.List<cn.jojo.cc.core.domain.english.EnglishPhraseVariantDo> listByPhraseIds(java.util.Set<Long> ids,Long del); }')
w('cn.jojo.cc.core.service.english.QuestionSegmentCoreService','public class QuestionSegmentCoreService { public cn.jojo.cc.core.domain.english.QuestionSegmentDo saved; public java.util.List<cn.jojo.cc.core.domain.english.QuestionSegmentDo> rows=java.util.List.of(); public java.util.List<cn.jojo.cc.core.domain.english.QuestionSegmentDo> listByQuestionKeys(java.util.Collection<String> keys){return rows;} public cn.jojo.cc.core.domain.english.QuestionSegmentDo getByQuestionId(Long id){return null;} public boolean upsert(cn.jojo.cc.core.domain.english.QuestionSegmentDo d){saved=d;return true;} public void markFailedByQuestionId(Long id,String key,String md5,Long rev,String msg){} }')
w('cn.jojo.cc.core.service.english.QuestionSegmentUnmatchedCoreService','public class QuestionSegmentUnmatchedCoreService { public void replaceUnmatched(Long id,String key,cn.jojo.cc.common.enums.DataBaseTypeEnum src,java.util.Set<String> words,cn.jojo.cc.core.bo.LoginUserBo operator){} }')
w('cn.jojo.cc.biz.cache.english.EnglishWordCacheService','public class EnglishWordCacheService {public java.util.function.Function<String,Long> loader=s->null; public Long findIdByNormalized(cn.jojo.cc.common.enums.DataBaseTypeEnum source,String text){return loader.apply(text);} public java.util.Map<String,Long> findIdsByNormalizeds(cn.jojo.cc.common.enums.DataBaseTypeEnum source,java.util.Collection<String> texts){java.util.Map<String,Long> out=new java.util.HashMap<>();for(String text:texts){Long id=loader.apply(text);if(id!=null)out.put(text,id);}return out;} }')

w('org.springframework.context.ApplicationEvent','public class ApplicationEvent implements java.io.Serializable {public ApplicationEvent(Object source){} }')
w('org.springframework.context.ApplicationEventPublisher','public interface ApplicationEventPublisher {void publishEvent(Object event);}')
w('cn.jojo.cc.biz.common.config.EnglishDictConfig','public class EnglishDictConfig {public static boolean enabled=true; public boolean isSegmentEnabled(){return enabled;} public int getCacheLocalTtlMinutes(){return 5;} }')

w('org.springframework.beans.factory.annotation.Value','public @interface Value {String value();}')
w('cn.jojo.cc.biz.rediscache.RedissonHelper','public class RedissonHelper {public long version=0;public Long getAtomicLongValue(String k){return version;} public java.util.Optional<Long> incrAndGet(String k){return java.util.Optional.of(++version);} }')
w('cn.jojo.cc.biz.common.config.EnglishDictConfig','public class EnglishDictConfig {public int getCacheLocalTtlMinutes(){return 5;} public int getPhraseIndexVersionCheckMillis(){return 30000;} public int getPhraseIndexPageSize(){return 500;} public long getPhraseIndexLoadRetryMillis(){return 30000;} public boolean isPhraseIndexVersionCheckEnabled(){return true;} }')
w('cn.jojo.cc.common.enums.RedisKeyEnum','public enum RedisKeyEnum {ENGLISH_PHRASE_INDEX_VERSION;public String buildKey(String s){return s;} }')
