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

import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
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 com.yhy.module.core.framework.mybatis.typehandler.StringArrayTypeHandler;
import java.util.Map;
import lombok.AccessLevel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;

/**
 * 定额基价第一层 - 定额专业树 DO
 * 
 * 对应表 yhy_quota_catalog_item（独立表）
 * 
 * 树形结构：
 * - 地区节点（node_type='region'）
 * - 定额专业节点（node_type='specialty'）
 * 
 * @author yhy
 */
@TableName(value = "yhy_quota_catalog_item", autoResultMap = true)
@Data
@EqualsAndHashCode(callSuper = true)
public class QuotaCatalogItemDO extends TenantBaseDO {

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

    /**
     * 父节点ID（支持自关联树结构）
     */
    private Long parentId;

    /**
     * 工料机机类树节点ID（引用yhy_resource_category_tree）
     * 
     * 只有"定额专业"节点才会绑定此字段
     */
    private Long categoryTreeId;

    /**
     * 条目编码
     */
    private String code;

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

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

    /**
     * 层级路径，text[]，采用 String[] 映射
     */
    @TableField(typeHandler = StringArrayTypeHandler.class)
    private String[] path;
    
    /**
     * 排序
     */
    private Integer sortOrder;

    /**
     * 节点类型（region-地区节点, specialty-定额专业节点）
     */
    private String nodeType;

    /**
     * 定额专业是否已绑定工料机专业（绑定后不可修改）
     */
    @Getter(AccessLevel.NONE)
    private Boolean specialtyLocked;

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

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

    /**
     * 是否已绑定工料机专业
     */
    public Boolean isSpecialtyLocked() {
        return Boolean.TRUE.equals(specialtyLocked);
    }

    /**
     * 是否允许添加子节点
     */
    public Boolean isAllowChildren() {
        // 所有节点都可以添加子节点
        return true;
    }

    /**
     * 获取内容类型（定额专业树没有此概念）
     */
    public String getContentType() {
        return null;
    }
}
