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
 * 
 * 按费率模式节点（node_type='rate_mode'）配置变量设置
 * 分为四个类别：分部分项、措施项目、其他项目、单位汇总
 */
@TableName(value = "yhy_quota_variable_setting", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
public class QuotaVariableSettingDO extends BaseDO {

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

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

    /**
     * 关联费率模式节点（yhy_quota_catalog_item.id，node_type='rate_mode'）
     */
    private Long catalogItemId;

    /**
     * 类别
     * @see CategoryEnum
     */
    private String category;

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

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

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

    /**
     * 计算基数（JSONB）
     * 
     * 格式与定额取费一致：
     * {
     *   "formula": "DRGF+HDRGF/DCLF-(DRGF*DCLF+12)",
     *   "variables": {
     *     "DRGF": {
     *       "categoryId": 1,
     *       "priceField": "tax_excl_base_price"
     *     }
     *   }
     * }
     */
    @TableField(typeHandler = PostgreSQLJsonbTypeHandler.class)
    private Map<String, Object> calcBase;

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

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

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

    /**
     * 获取 calcBase 中的变量映射
     */
    @SuppressWarnings("unchecked")
    public Map<String, Object> getCalcBaseVariables() {
        if (calcBase == null) {
            return null;
        }
        return (Map<String, Object>) calcBase.get("variables");
    }

    // ==================== 枚举常量 ====================

    /**
     * 类别枚举
     */
    public static class CategoryEnum {
        /** 分部分项 */
        public static final String DIVISION = "division";
        /** 措施项目 */
        public static final String MEASURE = "measure";
        /** 其他项目 */
        public static final String OTHER = "other";
        /** 单位汇总 */
        public static final String UNIT_SUMMARY = "unit_summary";
    }
}
