package com.erp.tenant.entity;

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

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

/**
 * 价格方案实体类
 */
@Data
@Builder
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@TableName("price_plans")
public class PricePlan {
    
    // ==================== 常量定义 ====================
    
    /** 周期类型：月付 */
    public static final String PERIOD_MONTHLY = "monthly";
    
    /** 周期类型：季付 */
    public static final String PERIOD_QUARTERLY = "quarterly";
    
    /** 周期类型：年付 */
    public static final String PERIOD_YEARLY = "yearly";
    
    /** 周期类型：试用 */
    public static final String PERIOD_TRIAL = "trial";
    
    /** 状态：启用 */
    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 description;
    
    /**
     * 价格（元）
     */
    private BigDecimal price;
    
    /**
     * 周期类型：monthly-月付，quarterly-季付，yearly-年付，trial-试用
     */
    private String periodType;
    
    /**
     * 试用天数
     */
    private Integer trialDays;
    
    /**
     * 功能列表（JSON格式）
     */
    private String features;
    
    /**
     * 配额限制（JSON格式）
     */
    private String quotaLimits;
    
    /**
     * 是否试用方案
     */
    private Boolean isTrial;
    
    /**
     * 是否启用
     */
    private Boolean isActive;
    
    /**
     * 是否默认方案
     */
    private Boolean isDefault;
    
    /**
     * 排序
     */
    private Integer sortOrder;
    
    // ==================== 时间戳字段 ====================
    
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
    
    // ==================== 辅助方法 ====================
    
    /**
     * 获取周期类型标签
     */
    public String getPeriodLabel() {
        return switch (periodType) {
            case PERIOD_MONTHLY -> "月";
            case PERIOD_QUARTERLY -> "季";
            case PERIOD_YEARLY -> "年";
            case PERIOD_TRIAL -> "试用";
            default -> "未知";
        };
    }
    
    /**
     * 判断是否启用
     */
    public boolean isActive() {
        return Boolean.TRUE.equals(isActive);
    }
    
    /**
     * 判断是否默认方案
     */
    public boolean isDefaultPlan() {
        return Boolean.TRUE.equals(isDefault);
    }
    
    /**
     * 判断是否试用方案
     */
    public boolean isTrialPlan() {
        return Boolean.TRUE.equals(isTrial);
    }
}
