package com.dora.entity;

import lombok.Data;
import lombok.EqualsAndHashCode;

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

/**
 * 微信菜单配置实体
 * 
 * @author dora
 * @date 2024/12/01
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class WechatMenu {

    /**
     * 菜单ID
     */
    private Long id;

    /**
     * 父菜单ID，0表示顶级菜单
     */
    private Long parentId;

    /**
     * 菜单名称，最多16个字符
     */
    private String menuName;

    /**
     * 菜单类型
     * click: 点击推事件
     * view: 跳转URL
     * miniprogram: 小程序
     * scancode_push: 扫码推事件
     * scancode_waitmsg: 扫码推事件且弹出"消息接收中"提示框
     * pic_sysphoto: 弹出系统拍照发图
     * pic_photo_or_album: 弹出拍照或者相册发图
     * pic_weixin: 弹出微信相册发图器
     * location_select: 弹出地理位置选择器
     */
    private String menuType;

    /**
     * 菜单KEY值，click类型必须
     */
    private String menuKey;

    /**
     * 网页链接，view类型必须
     */
    private String menuUrl;

    /**
     * 媒体文件ID
     */
    private String mediaId;

    /**
     * 小程序appid，miniprogram类型必须
     */
    private String appid;

    /**
     * 小程序页面路径，miniprogram类型必须
     */
    private String pagepath;

    /**
     * 排序顺序
     */
    private Integer sortOrder;

    /**
     * 是否启用：0-禁用，1-启用
     */
    private Integer isEnabled;

    /**
     * 菜单描述
     */
    private String description;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 子菜单列表（非数据库字段，用于构建菜单树）
     */
    private List<WechatMenu> children;

    /**
     * 菜单层级（非数据库字段，用于显示）
     */
    private Integer level;

    /**
     * 是否为叶子节点（非数据库字段）
     */
    private Boolean isLeaf;

    /**
     * 菜单类型枚举
     */
    public enum MenuType {
        CLICK("click", "点击推事件"),
        VIEW("view", "跳转URL"),
        MINIPROGRAM("miniprogram", "小程序"),
        SCANCODE_PUSH("scancode_push", "扫码推事件"),
        SCANCODE_WAITMSG("scancode_waitmsg", "扫码推事件且弹出提示框"),
        PIC_SYSPHOTO("pic_sysphoto", "弹出系统拍照发图"),
        PIC_PHOTO_OR_ALBUM("pic_photo_or_album", "弹出拍照或者相册发图"),
        PIC_WEIXIN("pic_weixin", "弹出微信相册发图器"),
        LOCATION_SELECT("location_select", "弹出地理位置选择器");

        private final String code;
        private final String description;

        MenuType(String code, String description) {
            this.code = code;
            this.description = description;
        }

        public String getCode() {
            return code;
        }

        public String getDescription() {
            return description;
        }

        public static MenuType fromCode(String code) {
            for (MenuType type : values()) {
                if (type.code.equals(code)) {
                    return type;
                }
            }
            return null;
        }
    }

    /**
     * 检查菜单配置是否有效
     */
    public boolean isValid() {
        if (menuName == null || menuName.trim().isEmpty()) {
            return false;
        }
        
        if (menuName.length() > 16) {
            return false;
        }
        
        if (menuType == null || MenuType.fromCode(menuType) == null) {
            return false;
        }
        
        // 根据菜单类型检查必填字段
        MenuType type = MenuType.fromCode(menuType);
        switch (type) {
            case CLICK:
                return menuKey != null && !menuKey.trim().isEmpty();
            case VIEW:
                return menuUrl != null && !menuUrl.trim().isEmpty();
            case MINIPROGRAM:
                return appid != null && !appid.trim().isEmpty() 
                    && pagepath != null && !pagepath.trim().isEmpty();
            default:
                return true;
        }
    }

    /**
     * 是否为顶级菜单
     */
    public boolean isTopLevel() {
        return parentId == null || parentId == 0;
    }

    /**
     * 是否启用
     */
    public boolean isEnabled() {
        return isEnabled != null && isEnabled == 1;
    }
}
