
package org.tio.sitexxx.service.service.base;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.dfa.WordTree;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tio.utils.jfinal.P;

import java.io.*;
import java.util.List;

/**
 * 敏感词
 * @author tanyaowu
 * 2016年5月29日 下午2:50:41
 */
public class SensitiveWordsService {
	public static final WordTree wordTree = new WordTree();
	private static Logger log = LoggerFactory.getLogger(SensitiveWordsService.class);

	public static void init() {
		wordTree.clear();

		// 获取根目录路径
		String rootDirStr = FileUtil.getAbsolutePath("classpath:config/sensitive/");

		// 尝试从文件系统获取路径
		File rootDir = new File(rootDirStr);

		// 如果路径不存在且文件是在 JAR 包中，尝试从 JAR 包内加载
		if (!rootDir.exists()) {
			// 如果路径是 JAR 内部的路径，则尝试读取 JAR 中的资源
			InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config/sensitive/");
			if (inputStream == null) {
				log.warn("文件[{}]不存在", rootDir.getAbsolutePath());
				return;
			}

			// 处理 JAR 中的文件
			try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
				String line;
				int count = 0;
				while ((line = reader.readLine()) != null) {
					wordTree.addWord(line);
					count++;
				}
				log.warn("词库中一共有{}个敏感词", count);
				return; // 退出方法，避免重复执行
			} catch (IOException e) {
				log.error("读取 JAR 中资源失败", e);
			}
		}

		// 如果是文件系统中的目录，则继续处理
		File[] files = rootDir.listFiles();
		int count = 0;
		if (files != null) {
			StringBuilder sb = new StringBuilder(256);
			for (File file : files) {
				sb.append(file.getAbsolutePath()).append(System.lineSeparator());
				List<String> lines = FileUtil.readLines(file, "utf-8");
				for (String line : lines) {
					wordTree.addWord(line);
					count++;
				}
			}
			// log.warn("敏感词库文件:{}", sb);
		}
		log.warn("词库中一共有{}个敏感词", count);
	}

	/**
	 * 是否包含敏感词
	 * @param text
	 * @return true: 表示有敏感词， false：没有敏感词
	 * @author: tanyaowu
	 */
	public static boolean isMatch(String text) {
		return wordTree.isMatch(text);
	}

	/**
	 * 搜索并替换全部敏感词
	 * @param initText
	 * @param replaceText
	 * @return
	 * @author: tanyaowu
	 */
	public static String findAndReplace(String initText, String replaceText) {
		return findAndReplaceWithLog(initText, replaceText, null);
	}

	/**
	 * 用replaceText替换initText中的敏感词
	 * @param initText
	 * @param replaceText
	 * @param logstr
	 * @return
	 * @author tanyaowu
	 */
	public static String findAndReplaceWithLog(String initText, String replaceText, Object logstr) {
		List<String> list = wordTree.matchAll(initText);
		if (list != null && list.size() > 0) {
			String ret = initText;
			for (String word : list) {
				String xx = StrUtil.repeat(replaceText, word.length());
				ret = StrUtil.replace(ret, word, xx);
			}
			if (logstr != null) {
				log.warn("{}, 找到敏感词，原文:【{}】，替换后的:【{}】", logstr, initText, ret);
			} else {
				log.warn("找到敏感词，原文:【{}】，替换后的:【{}】", initText, ret);
			}
			return ret;
		}
		return initText;
	}

	/**
	 * 搜索并替换全部敏感词
	 * @param initText
	 * @return
	 * @author: tanyaowu
	 */
	public static String findAndReplace(String initText) {
		return findAndReplace(initText, P.get("sensitive.words.replace.text"));
	}
}
