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.util.Map;

/**
 * 定额取费项 DO
 * 
 * 两层结构：
 * 【第一层】引用定额费率的模式节点（node_type='rate_mode'）
 * 【第二层】取费项列表（本表）
 */
@TableName(value = "yhy_quota_fee_item", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
public class QuotaFeeItemDO extends BaseDO {

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

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

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

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

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

    /**
     * 计算基数（JSONB）
     * 
     * 格式：
     * {
     *   "formula": "除税基价 + 含税基价 - 除税编制 * 含税编制",
     *   "variables": {
     *     "除税基价": "tax_excl_base_price",
     *     "含税基价": "tax_incl_base_price",
     *     "除税编制": "tax_excl_compile_price",
     *     "含税编制": "tax_incl_compile_price"
     *   }
     * }
     * 
     * 价格代码说明：
     * - tax_excl_base_price: 除税基价
     * - tax_incl_base_price: 含税基价
     * - tax_excl_compile_price: 除税编制价
     * - tax_incl_compile_price: 含税编制价
     */
    @TableField(typeHandler = PostgreSQLJsonbTypeHandler.class)
    private Map<String, Object> calcBase;

    /**
     * 费率代号（%）
     * 如："15"、"18.5"
     */
    private String rateCode;

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

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

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

    /**
     * 排序字段（决定显示顺序）
     */
    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");
    }

    /**
     * 获取变量映射
     */
    @SuppressWarnings("unchecked")
    public Map<String, String> getVariables() {
        if (calcBase == null) {
            return null;
        }
        return (Map<String, String>) 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";
}
