package com.ema.common.utils;

import cn.hutool.core.collection.CollUtil;
import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import com.ema.common.exceptions.MyAssert;
import lombok.Builder;
import lombok.Data;

import java.util.List;

@Data
@Builder
public class SensitiveWordUtil {

    // 敏感词(不能为空)
    private List<String> denyWords;
    // 非敏感词(可以为空)
    private List<String> allowWords;

    // 忽略大小写
    private boolean ignoreCase = true;
    // 忽略半角圆角
    private boolean ignoreWidth = true;
    // 忽略数字的写法
    private boolean ignoreNumStyle = true;
    // 忽略中文的书写格式：简繁体
    private boolean ignoreChineseStyle = true;
    // 忽略英文的书写格式
    private boolean ignoreEnglishStyle = true;
    // 忽略重复词
    private boolean ignoreRepeat = true;
    // 是否启用邮箱检测
    private boolean enableEmailCheck = false;
    // 是否启用链接检测
    private boolean enableUrlCheck = false;
    // 是否启用数字检测
    private boolean enableNumCheck = false;
    // 数字检测，自定义指定长度
    private int numCheckLen = 11;

    /**
     * 初始化敏感词库
     *
     * @return
     */
    public SensitiveWordBs init() {

        MyAssert.isTrue(CollUtil.isNotEmpty(denyWords), "敏感词不能为空");

        return SensitiveWordBs.newInstance()
                // 忽略大小写
                .ignoreCase(ignoreCase)
                // 忽略半角圆角
                .ignoreWidth(ignoreWidth)
                // 忽略数字的写法
                .ignoreNumStyle(ignoreNumStyle)
                // 忽略中文的书写格式：简繁体
                .ignoreChineseStyle(ignoreChineseStyle)
                // 忽略英文的书写格式
                .ignoreEnglishStyle(ignoreEnglishStyle)
                // 忽略重复词
                .ignoreRepeat(ignoreRepeat)
                // 是否启用邮箱检测
                .enableEmailCheck(enableEmailCheck)
                // 是否启用链接检测
                .enableUrlCheck(enableUrlCheck)
                // 是否启用数字检测
                .enableNumCheck(enableNumCheck)
                // 数字检测，自定义指定长度
                .numCheckLen(numCheckLen)
                // 配置自定义敏感词
                .wordDeny(() -> denyWords)
                // 配置非敏感词库
                .wordAllow(() -> allowWords)
                .init();
    }

// 简单使用示例
//    public static void main(String[] args) {
//        SensitiveWordBs wordBs = SensitiveWordUtil.builder().denyWords(CollUtil.toList("五星红旗", "毛主席")).build().init();
//        List<String> list = wordBs.findAll("五星红旗迎风飘扬，毛主席的画像屹立在天安门前五星红旗。");
//        System.out.println(list);
//    }

//========================  实际使用建议使用@Bean初始化  =========================
//    初始化1：定义一个用于“用户评论”的敏感词过滤器
//    @Bean("commentSensitiveWord")
//    public SensitiveWordBs commentSensitiveWordBs() {
//        ArrayList<String> denyWords = CollUtil.toList("日本", "美国");
//        return SensitiveWordUtil.builder()
//                .denyWords(denyWords)
//                .build().init();
//    }

//    初始化1：义一个用于“内容审核”的敏感词过滤器
//    @Bean("contentAuditSensitiveWord")
//    public SensitiveWordBs contentAuditSensitiveWordBs() {
//        ArrayList<String> denyWords = CollUtil.toList("五星红旗", "毛主席");
//        return SensitiveWordUtil.builder()
//                .denyWords(denyWords)
//                .build().init();
//    }

//     方式：使用 @Resource 指定 Bean 名称
//     @Resource(name = "contentAuditSensitiveWord")
//     private SensitiveWordBs contentAuditSensitiveWordBs;


}
