package com.erp.inventory.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * 库存预警规则实体
 * 配置库存预警规则，包括安全库存、最高库存等阈值
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = false)
@TableName("stock_warning_rules")
public class StockWarningRule {

    /**
     * 主键ID
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 规则名称
     */
    private String ruleName;

    /**
     * 规则类型：low_stock(低库存预警)、high_stock(高库存预警)、out_of_stock(缺货预警)
     */
    private String ruleType;

    /**
     * SKU编码（为空表示适用于所有SKU）
     */
    private String skuCode;

    /**
     * SKU名称（冗余字段）
     */
    private String skuName;

    /**
     * 仓库ID（为空表示适用于所有仓库）
     */
    private Long warehouseId;

    /**
     * 仓库名称（冗余字段）
     */
    private String warehouseName;

    /**
     * 安全库存下限（低于此值触发预警）
     */
    private Integer safetyStockMin;

    /**
     * 安全库存上限（高于此值触发预警）
     */
    private Integer safetyStockMax;

    /**
     * 预警阈值（用于低库存预警）
     */
    private Integer warningThreshold;

    /**
     * 最高库存上限（高于此值触发预警）
     */
    private Integer maxStockThreshold;

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

    /**
     * 通知方式：system(系统通知)、email(邮件)、dingtalk(钉钉)
     * 多个用逗号分隔，如：system,email,dingtalk
     */
    private String notificationMethods;

    /**
     * 通知邮箱（多个用逗号分隔）
     */
    private String notificationEmails;

    /**
     * 钉钉Webhook URL
     */
    private String dingtalkWebhook;

    /**
     * 钉钉Secret（加签密钥）
     */
    private String dingtalkSecret;

    /**
     * 重复预警间隔（分钟），0表示不重复
     */
    private Integer repeatIntervalMinutes;

    /**
     * 备注
     */
    private String remark;

    /**
     * 版本号
     */
    private Integer version;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;

    /**
     * 创建人ID
     */
    private Long createdBy;

    /**
     * 创建人名称
     */
    private String createdByName;

    // ==================== 枚举和常量 ====================

    /**
     * 规则类型枚举
     */
    public enum RuleType {
        LOW_STOCK("low_stock", "低库存预警"),
        HIGH_STOCK("high_stock", "高库存预警"),
        OUT_OF_STOCK("out_of_stock", "缺货预警");

        private final String code;
        private final String label;

        RuleType(String code, String label) {
            this.code = code;
            this.label = label;
        }

        public String getCode() {
            return code;
        }

        public String getLabel() {
            return label;
        }

        public static RuleType fromCode(String code) {
            for (RuleType type : values()) {
                if (type.code.equals(code)) {
                    return type;
                }
            }
            return null;
        }
    }

    /**
     * 通知方式枚举
     */
    public enum NotificationMethod {
        SYSTEM("system", "系统通知"),
        EMAIL("email", "邮件通知"),
        DINGTALK("dingtalk", "钉钉通知");

        private final String code;
        private final String label;

        NotificationMethod(String code, String label) {
            this.code = code;
            this.label = label;
        }

        public String getCode() {
            return code;
        }

        public String getLabel() {
            return label;
        }

        public static NotificationMethod fromCode(String code) {
            for (NotificationMethod method : values()) {
                if (method.code.equals(code)) {
                    return method;
                }
            }
            return null;
        }
    }
}
