package com.erp.tenant.entity;

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

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 套餐实体类
 */
@Data
@Builder
@EqualsAndHashCode(callSuper = false)
@TableName("packages")
public class Package {
    
    // ==================== 常量定义 ====================
    
    /** 类型：按月付费 */
    public static final String TYPE_PER_MONTH = "month";
    
    /** 类型：按年付费 */
    public static final String TYPE_PER_YEAR = "year";
    
    /** 类型：永久授权 */
    public static final String TYPE_PERPETUAL = "perpetual";
    
    /** 状态：启用 */
    public static final int STATUS_ENABLED = 1;
    
    /** 状态：禁用 */
    public static final int STATUS_DISABLED = 0;
    
    // ==================== 主键字段 ====================
    
    @TableId(type = IdType.AUTO)
    private Long id;
    
    // ==================== 基本信息 ====================
    
    /**
     * 套餐名称
     */
    private String name;
    
    /**
     * 套餐编码（唯一标识）
     */
    private String code;
    
    /**
     * 套餐类型：month-月付，year-年付，perpetual-永久
     */
    private String type;
    
    /**
     * 价格（元）
     */
    private BigDecimal price;
    
    /**
     * 周期天数
     */
    @TableField("period_days")
    private Integer periodDays;
    
    /**
     * 排序
     */
    private Integer sort;
    
    /**
     * 是否默认套餐
     */
    @TableField("is_default")
    private Boolean isDefault;
    
    /**
     * 试用天数
     */
    @TableField("trial_days")
    private Integer trialDays;
    
    /**
     * 状态：0-禁用，1-启用
     */
    private Integer status;
    
    // ==================== 扩展信息 ====================
    
    /**
     * 功能列表（JSON格式）
     */
    private String features;
    
    /**
     * 限制列表（JSON格式）
     */
    private String limits;
    
    /**
     * 备注
     */
    private String remark;
    
    // ==================== 时间戳字段 ====================
    
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
    
    /**
     * 删除时间
     */
    @TableLogic
    private LocalDateTime deletedAt;
    
    // ==================== 辅助方法 ====================
    
    /**
     * 判断套餐是否启用
     */
    public boolean isActive() {
        return STATUS_ENABLED == status;
    }
    
    /**
     * 判断是否默认套餐
     */
    public boolean isDefaultPackage() {
        return Boolean.TRUE.equals(isDefault);
    }
    
    /**
     * 获取类型标签
     */
    public String getTypeLabel() {
        return switch (type) {
            case TYPE_PER_MONTH -> "月付";
            case TYPE_PER_YEAR -> "年付";
            case TYPE_PERPETUAL -> "永久";
            default -> "未知";
        };
    }
    
    /**
     * 判断是否支持试用
     */
    public boolean hasTrial() {
        return trialDays != null && trialDays > 0;
    }
}
