package com.ycwl.basic.product.capability;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 商品类型能力配置实体
 * 统一管理商品类型的各项能力和行为特征
 *
 * 设计目标：
 * 1. 消除代码中的硬编码，将商品类型相关的业务规则配置化
 * 2. 提供统一的商品类型能力查询接口
 * 3. 支持通过配置快速扩展新商品类型
 */
@Data
@TableName(value = "product_type_capability", autoResultMap = true)
public class ProductTypeCapability {

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

    /**
     * 商品类型代码（唯一）
     * 如：VLOG_VIDEO, PHOTO_PRINT 等
     */
    private String productType;

    /**
     * 显示名称
     * 用于前端展示和支付页面
     */
    private String displayName;

    /**
     * 商品分类
     * 如：VIDEO（视频类）, PRINT（打印类）, PHOTO_SET（照片集类）
     */
    private String category;

    // ========== 定价相关 ==========

    /**
     * 定价模式
     * FIXED: 固定价格
     * QUANTITY_BASED: 基于数量（价格 = 单价 × 数量）
     * TIERED: 分层定价
     */
    private String pricingMode;

    /**
     * 是否支持阶梯定价
     */
    private Boolean supportsTierPricing;

    // ========== 购买限制 ==========

    /**
     * 是否允许重复购买
     */
    private Boolean allowDuplicatePurchase;

    /**
     * 重复购买检查策略
     * NO_CHECK: 不检查
     * CHECK_BY_VIDEO_ID: 按视频ID检查
     * CHECK_BY_SET_ID: 按套餐ID检查
     * CUSTOM: 自定义策略
     */
    private String duplicateCheckStrategy;

    // ========== 优惠能力 ==========

    /**
     * 是否可使用优惠券
     */
    private Boolean canUseCoupon;

    /**
     * 是否可使用券码
     */
    private Boolean canUseVoucher;

    /**
     * 是否可使用一口价优惠
     */
    private Boolean canUseOnePrice;

    /**
     * 是否可参与打包优惠
     */
    private Boolean canUseBundle;

    // ========== 扩展属性 ==========

    /**
     * 扩展属性（JSON 格式）
     * 用于存储特定商品类型的额外配置
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private Map<String, Object> metadata;

    /**
     * 是否启用
     */
    private Boolean isActive;

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

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

    // ========== 便捷方法 ==========

    /**
     * 获取定价模式枚举
     */
    public PricingMode getPricingModeEnum() {
        return PricingMode.fromCode(this.pricingMode);
    }

    /**
     * 获取重复检查策略枚举
     */
    public DuplicateCheckStrategy getDuplicateCheckStrategyEnum() {
        return DuplicateCheckStrategy.fromCode(this.duplicateCheckStrategy);
    }

    /**
     * 设置定价模式枚举
     */
    public void setPricingModeEnum(PricingMode mode) {
        this.pricingMode = mode != null ? mode.getCode() : null;
    }

    /**
     * 设置重复检查策略枚举
     */
    public void setDuplicateCheckStrategyEnum(DuplicateCheckStrategy strategy) {
        this.duplicateCheckStrategy = strategy != null ? strategy.getCode() : null;
    }
}
