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_fee_item", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
public class QuotaFeeItemDO 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（任意层级节点，可为空）
     * 用于与定额费率项建立一对一关系
     */
    private Long rateItemId;

    /**
     * 自定义序号（字符串，显示用，不参与排序）
     * 如："一"、"1.1"、"(1)"
     */
    private String customCode;

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

    /**
     * 计算基数（JSONB）
     * 
     * 格式：
     * {
     *   "formula": "DRGF+HDRGF/DCLF-(DRGF*DCLF+12)",
     *   "variables": {
     *     "DRGF": {
     *       "categoryId": 1,
     *       "priceField": "tax_excl_base_price"
     *     },
     *     "HDRGF": {
     *       "categoryId": 1,
     *       "priceField": "tax_incl_base_price"
     *     },
     *     "DCLF": {
     *       "categoryId": 3,
     *       "priceField": "tax_excl_base_price"
     *     }
     *   }
     * }
     * 
     * 价格字段类型说明：
     * - tax_excl_base_price: 除税基价
     * - tax_incl_base_price: 含税基价
     * - tax_excl_compile_price: 除税编制价
     * - tax_incl_compile_price: 含税编制价
     * 
     * variables 中的每个变量包含：
     * - categoryId: 类别ID（对应 yhy_resource_category 表的 id）
     * - priceField: 价格字段类型（上述4个值之一）
     */
    @TableField(typeHandler = PostgreSQLJsonbTypeHandler.class)
    private Map<String, Object> calcBase;

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

    /**
     * 费用归属
     * 如："间接费"、"直接费"
     */
    private String feeCategory;

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

    /**
     * 排序字段（决定显示顺序）
     */
    private Integer sortOrder;

    /**
     * 是否隐藏（true=隐藏，false=显示）
     */
    private Boolean hidden;

    /**
     * 是否为变量（true=变量，false=非变量）
     */
    private Boolean variable;

    /**
     * 系统行标识
     * ZHDJ=综合单价（系统必须行，不可删除）
     */
    private String systemCode;

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

    /**
     * 是否为系统行（不可删除）
     */
    public boolean isSystemRow() {
        return systemCode != null && !systemCode.isEmpty();
    }

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

    /**
     * 获取公式
     */
    @SuppressWarnings("unchecked")
    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 final String PRICE_CODE_TAX_EXCL_BASE = "tax_excl_base_price";
    public static final String PRICE_CODE_TAX_INCL_BASE = "tax_incl_base_price";
    public static final String PRICE_CODE_TAX_EXCL_COMPILE = "tax_excl_compile_price";
    public static final String PRICE_CODE_TAX_INCL_COMPILE = "tax_incl_compile_price";

    /**
     * 系统行代码：综合单价
     */
    public static final String SYSTEM_CODE_ZHDJ = "ZHDJ";

    /**
     * 综合单价行的排序值（确保始终排在最后）
     */
    public static final Integer SYSTEM_ROW_SORT_ORDER = Integer.MAX_VALUE;
}
