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

import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
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.yhy.module.core.dal.typehandler.PostgreSQLJsonbTypeHandler;
import java.util.Map;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 统一取费单价 DO
 * 
 * 树结构，用于配置统一取费的单价计算规则
 */
@TableName(value = "yhy_quota_unified_fee", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
public class QuotaUnifiedFeeDO extends BaseDO {

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

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

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

    /**
     * 关联定额取费项ID（yhy_quota_fee_item.id）
     * 其他字段从定额取费动态获取，只有calcBase可编辑覆盖
     */
    private Long feeItemId;

    /**
     * 父节点ID
     */
    private Long parentId;

    /**
     * 自定义序号（字符串，显示用，不参与排序）
     */
    private String customCode;

    /**
     * 名称
     */
    private String name;

    /**
     * 计算基数（JSONB）
     * 
     * 格式与 QuotaFeeItemDO.calcBase 一致
     */
    @TableField(typeHandler = PostgreSQLJsonbTypeHandler.class)
    private Map<String, Object> calcBase;

    /**
     * 费率代号(%)
     */
    private String rateCode;

    /**
     * 代号
     */
    private String code;

    /**
     * 默认费用归属
     */
    private String feeCategory;

    /**
     * 基数说明
     */
    private String baseDescription;

    /**
     * 是否隐藏
     */
    private Boolean hidden;

    /**
     * 是否费用变量
     */
    private Boolean variable;

    /**
     * 节点类型
     * - parent：父节点
     * - child：子节点
     */
    private String nodeType;

    /**
     * 扩展属性（JSONB）
     */
    @TableField(typeHandler = PostgreSQLJsonbTypeHandler.class)
    private Map<String, Object> attributes;

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

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

    /**
     * 是否有计算基数
     */
    public boolean hasCalcBase() {
        return calcBase != null && !calcBase.isEmpty();
    }

    /**
     * 获取公式
     */
    @SuppressWarnings("unchecked")
    public String getFormula() {
        if (calcBase == null) {
            return null;
        }
        return (String) calcBase.get("formula");
    }

    /**
     * 是否为父节点
     */
    public boolean isParent() {
        return NODE_TYPE_PARENT.equals(nodeType);
    }

    /**
     * 是否为子节点
     */
    public boolean isChild() {
        return NODE_TYPE_CHILD.equals(nodeType);
    }

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

    public static final String NODE_TYPE_PARENT = "parent";
    public static final String NODE_TYPE_CHILD = "child";
}
