package com.yhy.module.core.dal.dataobject.quota;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yhy.module.core.dal.typehandler.PostgreSQLJsonbTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;

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

/**
 * 定额费率项 DO
 * 
 * 支持三级树结构，每个节点可以是"目录"或"数值"类型
 * - 目录节点：可以添加子节点
 * - 数值节点：可以配置字段绑定或动态取值规则
 */
@TableName(value = "yhy_quota_rate_item", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
public class QuotaRateItemDO extends BaseDO {

    /**
     * 主键ID
     */
    private Long id;

    /**
     * 租户ID
     */
    private Long tenantId;

    /**
     * 关联到"模式"节点（yhy_catalog_item.id，node_type='rate_mode'）
     */
    private Long catalogItemId;

    /**
     * 父节点ID（支持三级树）
     */
    private Long parentId;

    /**
     * 自定义序号（显示用，不参与排序）
     * 如："一"、"1.1"、"1.1.1"
     */
    private String customCode;

    /**
     * 费率项名称
     */
    private String name;

    /**
     * 费率代号（%）
     * 如："A"、"B"、"C"
     */
    private String rateCode;

    /**
     * 是否填写
     * - false：使用静态绑定或默认值
     * - true：用户可填写，支持动态取值规则
     */
    private Boolean isEditable;

    /**
     * 默认值
     */
    private BigDecimal defaultValue;

    /**
     * 取值模式
     * - static：静态绑定（使用 yhy_quota_rate_field 的绑定）
     * - dynamic：动态规则（使用 settings.value_rules 计算）
     */
    private String valueMode;

    /**
     * 扩展设置（JSONB）
     * 
     * 静态模式：
     * {
     *   "remark": "备注"
     * }
     * 
     * 动态模式：
     * {
     *   "valueRules": {
     *     "tiers": [
     *       {"seq": 1, "threshold": 50, "compareType": "lte", "fieldValues": {"1": 0.224, "2": 0}},
     *       ...
     *     ],
     *     "increments": [
     *       {"seq": 7, "step": 100, "baseThreshold": 1000, "fieldIncrements": {"1": 0.036, "2": 0.002}}
     *     ]
     *   }
     * }
     */
    @TableField(typeHandler = PostgreSQLJsonbTypeHandler.class)
    private Map<String, Object> settings;

    /**
     * 节点类型
     * - directory：目录节点，可以添加子节点
     * - value：数值节点，可以配置绑定
     */
    private String nodeType;

    /**
     * 层级（1-3）
     */
    private Integer level;

    /**
     * 排序字段
     */
    private Integer sortOrder;

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

    /**
     * 是否为目录节点
     */
    public boolean isDirectory() {
        return "directory".equals(nodeType);
    }

    /**
     * 是否为数值节点
     */
    public boolean isValue() {
        return "value".equals(nodeType);
    }

    /**
     * 是否为静态取值模式
     */
    public boolean isStaticMode() {
        return "static".equals(valueMode) || valueMode == null;
    }

    /**
     * 是否为动态取值模式
     */
    public boolean isDynamicMode() {
        return "dynamic".equals(valueMode);
    }

    /**
     * 获取动态取值规则
     */
    @SuppressWarnings("unchecked")
    public Map<String, Object> getValueRules() {
        if (settings == null) {
            return null;
        }
        return (Map<String, Object>) settings.get("valueRules");
    }

    /**
     * 获取阶梯规则
     */
    @SuppressWarnings("unchecked")
    public List<Map<String, Object>> getTiers() {
        Map<String, Object> valueRules = getValueRules();
        if (valueRules == null) {
            return null;
        }
        return (List<Map<String, Object>>) valueRules.get("tiers");
    }

    /**
     * 获取增量规则
     */
    @SuppressWarnings("unchecked")
    public List<Map<String, Object>> getIncrements() {
        Map<String, Object> valueRules = getValueRules();
        if (valueRules == null) {
            return null;
        }
        return (List<Map<String, Object>>) valueRules.get("increments");
    }

    // ==================== 常量 ====================

    public static final String NODE_TYPE_DIRECTORY = "directory";
    public static final String NODE_TYPE_VALUE = "value";

    public static final String VALUE_MODE_STATIC = "static";
    public static final String VALUE_MODE_DYNAMIC = "dynamic";
}
