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.math.BigDecimal;
import java.util.Map;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 统一取费设置 DO
 * 
 * 树结构，支持父子定额关系：
 * - 父定额（node_type='parent'）：在工作台显示，配置总参数
 * - 子定额（node_type='child'）：不在工作台显示，下方有子目工料机
 */
@TableName(value = "yhy_quota_unified_fee_setting", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
public class QuotaUnifiedFeeSettingDO 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 parentId;

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

    /**
     * 编号
     */
    private String code;

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

    /**
     * 取费章节
     */
    private String feeChapter;

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

    /**
     * 本清单比例%
     */
    private BigDecimal thisListPercentage;

    /**
     * 指定清单比例%
     */
    private BigDecimal specifiedListPercentage;

    /**
     * 指定清单编码
     */
    private String specifiedListCode;

    /**
     * 节点类型
     * - parent：父定额（在工作台显示）
     * - child：子定额（不在工作台显示）
     */
    private String nodeType;

    /**
     * 单位
     */
    private String unit;

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

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

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

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

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

    /**
     * 是否为根节点
     */
    public boolean isRoot() {
        return parentId == null;
    }

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

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