package com.erp.category.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 分类实体类 - 支持层级结构的分类管理
 * 
 * 设计说明：
 * - 使用邻接表模型（parent_id）存储层级关系
 * - path字段存储完整路径，用于快速查询子树（如：/1/3/5/）
 * - level字段表示层级深度（根分类为1，子分类为2，以此类推）
 * 
 * @author ERP System
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("categories")
public class Category {
    
    @TableId(type = IdType.AUTO)
    private Long id;
    
    /**
     * 租户ID - 支持多租户隔离
     */
    private Long tenantId;
    
    /**
     * 分类名称
     */
    private String name;
    
    /**
     * 分类编码 - 唯一标识，用于业务关联
     */
    private String code;
    
    /**
     * 父分类ID - null表示根分类
     */
    @TableField("parent_id")
    private Long parentId;
    
    /**
     * 层级深度 - 根分类为1，子分类为2，以此类推
     */
    private Integer level;
    
    /**
     * 完整路径 - 如 /1/3/5/，便于查询子树
     */
    private String path;
    
    /**
     * 排序号 - 同级分类间的排序
     */
    private Integer sortOrder;
    
    /**
     * 分类图标 - URL或图标名称
     */
    private String icon;
    
    /**
     * 分类描述
     */
    private String description;
    
    /**
     * 状态 - 1:启用, 0:禁用
     */
    private Integer status;
    
    /**
     * 是否叶子节点 - 1:是, 0:否
     */
    @TableField("is_leaf")
    private Boolean isLeaf;
    
    /**
     * 子分类数量 - 缓存字段，避免频繁COUNT
     */
    @TableField("children_count")
    private Integer childrenCount;
    
    /**
     * 商品数量 - 该分类下的商品数（关联goods表）
     */
    @TableField("goods_count")
    private Integer goodsCount;
    
    // ==================== 非数据库字段 ====================
    
    /**
     * 子分类列表（仅用于返回树形结构，非数据库存储）
     */
    @TableField(exist = false)
    private List<Category> children = new ArrayList<>();
    
    // ==================== 时间戳字段 ====================
    
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createdAt;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;
    
    @TableLogic
    private LocalDateTime deletedAt;
    
    // ==================== 辅助方法 ====================
    
    /**
     * 判断是否为根分类
     */
    public boolean isRoot() {
        return parentId == null || parentId == 0L;
    }
    
    /**
     * 判断是否启用
     */
    public boolean isEnabled() {
        return status != null && status == 1;
    }
    
    /**
     * 判断是否为叶子节点（无子分类）
     */
    public boolean isLeafNode() {
        return Boolean.TRUE.equals(isLeaf);
    }
    
    /**
     * 获取父分类ID（如果为根分类返回0）
     */
    public Long getParentIdOrZero() {
        return parentId == null ? 0L : parentId;
    }
}
