package com.ema.admin.modules.system.vo;

import com.ema.common.utils.TreeNode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 菜单权限表 实体类。
 *
 * @author LIJIAN
 * @since 2026-03-23
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("菜单权限表")
public class SysMenuVo implements TreeNode<SysMenuVo, String>, Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 菜单ID
     */
    @ApiModelProperty("菜单ID")
    private String id;

    /**
     * 菜单名称
     */
    @ApiModelProperty("菜单名称")
    private String menuName;

    /**
     * 父菜单ID (0为顶级菜单)
     */
    @ApiModelProperty("父菜单ID (0为顶级菜单)")
    private String parentId;

    /**
     * 显示顺序
     */
    @ApiModelProperty("显示顺序")
    private Integer sort;

    /**
     * 前端路由地址
     */
    @ApiModelProperty("前端路由地址")
    private String path;

    /**
     * 前端组件路径
     */
    @ApiModelProperty("前端组件路径")
    private String component;

    /**
     * 权限标识 (例如: system:user:list)
     */
    @ApiModelProperty("权限标识 (例如: system:user:list)")
    private String perms;

    /**
     * 菜单图标
     */
    @ApiModelProperty("菜单图标")
    private String icon;

    /**
     * 是否为外链 (0否 1是)
     */
    @ApiModelProperty("是否为外链 (0否 1是)")
    private String isFrame;

    /**
     * 菜单类型 (M目录 C菜单 F按钮)
     */
    @ApiModelProperty("菜单类型 (M目录 C菜单 F按钮)")
    private String menuType;

    /**
     * 菜单状态 (0隐藏,1显示 )
     */
    @ApiModelProperty("菜单状态 (0隐藏,1显示 )")
    private String visible;

    /**
     * 菜单状态 ((0停用 1正常)
     */
    @ApiModelProperty("菜单状态 (0停用 1正常)")
    private String status;

    /**
     * 备注
     */
    @ApiModelProperty("备注")
    private String remark;

    @ApiModelProperty(value = "是否选中：0=否，1=是")
    private Integer isCheck;

    @ApiModelProperty(value = "下级权限")
    private List<SysMenuVo> children;


    /**
     * 添加子菜单
     *
     * @param child 要添加的子菜单VO对象
     */
    @Override
    public void addChild(SysMenuVo child) {
        if (children == null) {
            children = new ArrayList<>();
        }
        children.add(child);
    }

    @Override
    public void setChecked(boolean checked) {
        isCheck = checked ? 1 : 0;
    }

    /**
     * 实现Tree接口的compareTo方法，用于菜单的排序
     *
     * @param other 另一个菜单VO对象
     * @return 返回基于sort属性的比较结果
     */
    @Override
    public int compareTo(SysMenuVo other) {
        return this.sort == null || other.sort == null ? 0 : this.sort - other.sort;
    }

}
