package com.dora.entity;

import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * 微信关键词回复配置实体
 * 
 * @author dora
 * @date 2024/12/01
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class WechatKeywordReply {

    /**
     * 关键词回复ID
     */
    private Long id;

    /**
     * 关键词
     */
    private String keyword;

    /**
     * 匹配类型：exact-精确匹配，fuzzy-模糊匹配，regex-正则匹配
     */
    private String matchType;

    /**
     * 关联的消息模板ID
     */
    private Long templateId;

    /**
     * 是否启用：0-禁用，1-启用
     */
    private Integer isEnabled;

    /**
     * 优先级，数字越大优先级越高
     */
    private Integer priority;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 关联的消息模板（非数据库字段）
     */
    private WechatMessageTemplate messageTemplate;

    /**
     * 匹配类型枚举
     */
    public enum MatchType {
        EXACT("exact", "精确匹配"),
        FUZZY("fuzzy", "模糊匹配"),
        REGEX("regex", "正则匹配");

        private final String code;
        private final String description;

        MatchType(String code, String description) {
            this.code = code;
            this.description = description;
        }

        public String getCode() {
            return code;
        }

        public String getDescription() {
            return description;
        }

        public static MatchType fromCode(String code) {
            for (MatchType type : values()) {
                if (type.code.equals(code)) {
                    return type;
                }
            }
            return EXACT; // 默认精确匹配
        }
    }

    /**
     * 检查关键词配置是否有效
     */
    public boolean isValid() {
        return keyword != null && !keyword.trim().isEmpty() 
            && templateId != null && templateId > 0;
    }

    /**
     * 是否启用
     */
    public boolean isEnabled() {
        return isEnabled != null && isEnabled == 1;
    }

    /**
     * 获取优先级，默认为0
     */
    public int getPriorityValue() {
        return priority != null ? priority : 0;
    }

    /**
     * 检查关键词是否匹配
     */
    public boolean matches(String userInput) {
        if (userInput == null || userInput.trim().isEmpty()) {
            return false;
        }

        String input = userInput.trim();
        MatchType type = MatchType.fromCode(matchType);

        switch (type) {
            case EXACT:
                return keyword.equals(input);
            case FUZZY:
                return input.contains(keyword) || keyword.contains(input);
            case REGEX:
                try {
                    return input.matches(keyword);
                } catch (Exception e) {
                    // 正则表达式错误，降级为精确匹配
                    return keyword.equals(input);
                }
            default:
                return keyword.equals(input);
        }
    }
}
