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

import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
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 lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Map;

/**
 * 定额目录条目 DO
 * 
 * 对应表 yhy_catalog_item（复用资源库条目表）
 * 
 * 三层结构：
 * - 第一层：定额目录树（省市/定额专业），通过 attributes.node_type 区分
 * - 第二层：工料机专业节点（通过 categoryTreeId 绑定）
 * - 第三层：定额子目树（目录/内容），通过 attributes.content_type 区分
 * 
 * @author yhy
 */
@TableName(value = "yhy_catalog_item", autoResultMap = true)
@KeySequence("yhy_catalog_item_id_seq")
@Data
@EqualsAndHashCode(callSuper = true)
public class QuotaCatalogItemDO extends TenantBaseDO {

    /**
     * 主键
     */
    @TableId
    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;

    /**
     * 扩展属性（JSONB）
     * 
     * 第一层属性：
     * - node_type: "province"（省市）| "specialty"（定额专业）
     * - specialty_locked: true/false（是否已绑定工料机专业）
     * - bind_time: "2024-12-08T10:30:00Z"（绑定时间）
     * 
     * 第三层属性：
     * - content_type: "directory"（目录）| "content"（内容）
     * - allow_children: true/false（是否允许添加子节点）
     */
    @TableField(typeHandler = PostgreSQLJsonbTypeHandler.class)
    private Map<String, Object> attributes;

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

    /**
     * 获取节点类型（第一层）
     */
    public String getNodeType() {
        return attributes != null ? (String) attributes.get("node_type") : null;
    }

    /**
     * 设置节点类型（第一层）
     */
    public void setNodeType(String nodeType) {
        if (attributes == null) {
            attributes = new java.util.HashMap<>();
        }
        attributes.put("node_type", nodeType);
    }

    /**
     * 是否已绑定工料机专业（第一层）
     */
    public Boolean isSpecialtyLocked() {
        return attributes != null ? (Boolean) attributes.get("specialty_locked") : false;
    }

    /**
     * 设置绑定状态（第一层）
     */
    public void setSpecialtyLocked(Boolean locked) {
        if (attributes == null) {
            attributes = new java.util.HashMap<>();
        }
        attributes.put("specialty_locked", locked);
    }

    /**
     * 获取内容类型（第三层）
     */
    public String getContentType() {
        return attributes != null ? (String) attributes.get("content_type") : null;
    }

    /**
     * 设置内容类型（第三层）
     */
    public void setContentType(String contentType) {
        if (attributes == null) {
            attributes = new java.util.HashMap<>();
        }
        attributes.put("content_type", contentType);
    }

    /**
     * 是否允许添加子节点（第三层）
     */
    public Boolean isAllowChildren() {
        return attributes != null ? (Boolean) attributes.get("allow_children") : true;
    }

    /**
     * 设置是否允许子节点（第三层）
     */
    public void setAllowChildren(Boolean allow) {
        if (attributes == null) {
            attributes = new java.util.HashMap<>();
        }
        attributes.put("allow_children", allow);
    }
}
