//package com.ruoyi.project.utils;
//
//import com.hankcs.hanlp.HanLP;
//import com.hankcs.hanlp.seg.common.Term;
//import com.ruoyi.project.domain.TrsResults;
//import com.ruoyi.project.domain.TrsSensitiveWords;
//import com.ruoyi.project.mapper.TrsSensitiveWordsMapper;
//import org.ahocorasick.trie.Emit;
//import org.ahocorasick.trie.Trie;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import java.util.*;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
//
///**
// * 字典工具类
// *
// * @author ruoyi
// */
//@Component
//public class JiaoduiUtils2
//{
//    @Autowired
//    private TrsSensitiveWordsMapper trsSensitiveWordsMapper;
//    public List<TrsResults> getJiaodui(String content){
//        // 缓存敏感词的正确词和错误类型
//        Map<String, String> correctWordMap = new HashMap<>();
//        Map<String, String> errorTypeMap = new HashMap<>();
//        Trie trie = loadSensitiveWords(correctWordMap, errorTypeMap);
//        List<TrsResults> results = detect(trie, content, correctWordMap, errorTypeMap);
//        return results;
//    }
//
//    public Trie loadSensitiveWords(Map<String, String> correctWordMap, Map<String, String> errorTypeMap) {
//        Trie.TrieBuilder builder = Trie.builder();
//
//        TrsSensitiveWords trsSensitiveWords = new TrsSensitiveWords();
//        List<TrsSensitiveWords> sensitiveWords = trsSensitiveWordsMapper.selectTrsSensitiveWordsList(trsSensitiveWords);
//        for (TrsSensitiveWords sensitiveWord : sensitiveWords) {
//            String wrongWord = sensitiveWord.getWrongWord();
//            builder.addKeyword(wrongWord);
//            correctWordMap.put(wrongWord, sensitiveWord.getCorrectWord());
//            errorTypeMap.put(wrongWord, sensitiveWord.getErrorType());
//        }
//        return builder.build();
//    }
//
//    public List<TrsResults> detect(Trie trie, String content,
//                              Map<String, String> correctWordMap, Map<String, String> errorTypeMap) {
////        Set<TrsSensitiveWords> resultSet = new HashSet<>();
//        List<TrsResults> resultSet = new ArrayList<>();
//        resultSet.addAll(detectContent(trie, content, correctWordMap, errorTypeMap));
//        resultSet.addAll(detectSegmentedContent(trie, content, correctWordMap, errorTypeMap));
//        return resultSet;
//    }
//
//
//    private List<TrsResults> detectSegmentedContent(Trie trie, String content,
//                                               Map<String, String> correctWordMap, Map<String, String> errorTypeMap) {
//        List<TrsResults> results = new ArrayList<>();
//
//        // 先对文章进行分词
//        List<String> words = segmentText(content);
//        // 逐个分词进行敏感词匹配
//        for (String word : words) {
//            for (Emit emit : trie.parseText(word)) {
//                String wrongWord = emit.getKeyword();
//                // 如果匹配到的词在白名单中，则跳过
//                if (isInWhitelist(content, emit.getStart(), emit.getEnd() + 1)) {
//                    continue;
//                }
//                // 只匹配独立的词，确保不是误匹配
//                Matcher matcher = Pattern.compile("\\b" + Pattern.quote(wrongWord) + "\\b").matcher(word);
//                if (matcher.find()) {
//                    // 确定分词的起始和结束位置
//                    int start = content.indexOf(word);
//                    int end = start + word.length();
//
//                    TrsResults r = new TrsResults();
//                    r.setWrongWord(wrongWord);
//                    r.setCorrectWord(correctWordMap.getOrDefault(wrongWord, "未知"));
//                    r.setErrorType(errorTypeMap.getOrDefault(wrongWord, "未知"));
//                    r.setContext(extractContext(content, start, end));
//                    r.setStatus("待处理");
//                    results.add(r);
//
//                }
//            }
//        }
//        return results;
//    }
//
//    private  List<TrsResults> detectContent(Trie trie, String content,
//                                      Map<String, String> correctWordMap, Map<String, String> errorTypeMap) {
//        List<TrsResults> results = new ArrayList<>();
//        for (Emit emit : trie.parseText(content)) {
//            String wrongWord = emit.getKeyword();
//            // 如果匹配到的词在白名单中，则跳过
//            if (isInWhitelist(content, emit.getStart(), emit.getEnd() + 1)) {
//                continue;
//            }
//            // 只匹配独立的词，确保不是误匹配
//            Matcher matcher = Pattern.compile("\\b" + Pattern.quote(wrongWord) + "\\b").matcher(content);
//            if (matcher.find()) {
//                TrsResults r = new TrsResults();
//                r.setWrongWord(wrongWord);
//                r.setCorrectWord(correctWordMap.getOrDefault(wrongWord, "未知"));
//                r.setErrorType(errorTypeMap.getOrDefault(wrongWord, "未知"));
//                r.setContext(extractContext(content, emit.getStart(), emit.getEnd()));
//                r.setStatus("待处理");
//                results.add(r);
//            }
//        }
//
//        return results;
//    }
//
//    // 提取上下文（示例：前后 20 字符）
//    private  String extractContext(String text, int start, int end) {
//        int contextSize = 20;
//        int contextStart = Math.max(0, start - contextSize);
//        int contextEnd = Math.min(text.length(), end + contextSize);
//        return text.substring(contextStart, contextEnd);
//    }
//    public List<String> segmentText(String text) {
//        List<Term> termList = HanLP.segment(text);
//        List<String> words = new ArrayList<>();
//        for (Term term : termList) {
//            words.add(term.word);
//        }
//        return words;
//    }
//
//    private Set<String> whitelistPhrases = new HashSet<>();
//    public void loadWhitelist() {
//        // 这里可以从数据库或配置文件加载白名单
//        /*whitelistPhrases.add("内蒙古自治区");
//        whitelistPhrases.add("中国银行");
//        whitelistPhrases.add("中华人民共和国");*/
//        TrsSensitiveWords trsSensitiveWords = new TrsSensitiveWords();
//        trsSensitiveWords.setFlag(0);
//        trsSensitiveWordsMapper.selectTrsSensitiveWordsListBy(new TrsSensitiveWords()).forEach(sensitiveWord -> {
//            whitelistPhrases.add(sensitiveWord.getWrongWord());
//        });
//    }
//    private boolean isInWhitelist(String text, int start, int end) {
//        for (String phrase : whitelistPhrases) {
//            int phraseStart = start - (phrase.length() - (end - start)); // 计算完整短语的起点
//            if (phraseStart >= 0 && phraseStart + phrase.length() <= text.length()) {
//                String subText = text.substring(phraseStart, phraseStart + phrase.length());
//                if (whitelistPhrases.contains(subText)) {
//                    return true; // 如果匹配到白名单短语，则跳过
//                }
//            }
//        }
//        return false;
//    }
//
//}
