declare namespace Api {
  /**
   * namespace SystemManage
   *
   * backend api module: "systemManage"
   */
  namespace SystemManage {
    type DepartmentModel = {
      /**
       * 子部门
       */
      children?: DepartmentModel[];
      /**
       * 创建时间
       */
      createTime?: string;
      /**
       * 部门ID
       */
      deptId?: number;
      /**
       * 部门名称
       */
      deptName?: string;
      /**
       * 部门描述
       */
      description?: string;
      /**
       * 部门层级
       */
      level?: number;
      /**
       * 父级部门ID
       */
      parentId?: number;
      /**
       * 排序
       */
      seq?: number;
      /**
       * 状态 1:正常 0:禁用
       */
      status?: number;
      /**
       * 更新时间
       */
      updateTime?: string;
      /**
       * 部门负责人(用户ID)
       */
      leaderUserId?: number;
      leaderUserName?: number;
      /**
       * 邮箱
       */
      email?: string;
      /**
       * 联系电话（加密存储）
       */
      phone?: string;
      [property: string]: any;
    };
    type UserModel = {
      id?: number;
      username: string;
      password: string;
      email: string;
      mobile: string;
      status: number;
      roleIdList: string;
      depts: DepartmentModel[];
    };
    type CommonSearchParams = Pick<Common.PaginatingCommonParams, 'current' | 'size'>;
    type RoleMenuList = {
      roleId?: number;
      remark: string;
      roleName: string;
      menuIdList: number[];
    };
    /** role */
    type Role = Common.CommonRecord<{
      /** role name */
      roleName: string;
      /** role code */
      roleCode: string;
      /** role description */
      roleDesc: string;
      roleId: number;
    }>;

    /** role search params */
    type RoleSearchParams = CommonType.RecordNullable<
      Pick<Api.SystemManage.Role, 'roleName' | 'roleCode' | 'status'> & CommonSearchParams
    >;

    /** role list */
    type RoleList = Common.PaginatingQueryRecord<Role>;

    /** all role */
    type AllRole = Pick<Role, 'id' | 'roleName' | 'roleCode'>;

    /**
     * user gender
     *
     * - "1": "male"
     * - "2": "female"
     */
    type UserGender = '1' | '2';

    /** user */
    type User = Common.CommonRecord<{
      /**
       * 用户头像地址
       */
      avatar?: string;
      /**
       * 创建时间
       */
      createTime?: Date;
      /**
       * 部门名称
       */
      deptName?: string;
      /**
       * 用户邮箱
       */
      email?: string;
      /**
       * 性别
       */
      genderLabel?: string;
      /**
       * 用户ID
       */
      id?: number;
      /**
       * 手机号
       */
      mobile?: string;
      /**
       * 用户昵称
       */
      nickname?: string;
      /**
       * 角色名称，多个使用英文逗号(,)分割
       */
      roleNames?: string;
      /**
       * 用户状态(1:启用;0:禁用)
       */
      status?: number;
      /**
       * 用户名
       */
      username?: string;
    }>;

    /** user search params */
    type UserSearchParams = CommonType.RecordNullable<
      Pick<Api.SystemManage.User, 'userName' | 'userGender' | 'nickName' | 'userPhone' | 'userEmail' | 'status'> &
        CommonSearchParams
    >;

    /** user list */
    type UserList = Common.PaginatingQueryRecord<User>;
    type userList = {
      /**
       * 用户头像地址
       */
      avatar?: string;
      /**
       * 创建时间
       */
      createTime?: Date;
      /**
       * 部门名称
       */
      deptName?: string;
      /**
       * 用户邮箱
       */
      email?: string;
      /**
       * 性别
       */
      genderLabel?: string;
      /**
       * 用户ID
       */
      id?: number;
      /**
       * 手机号
       */
      mobile?: string;
      /**
       * 用户昵称
       */
      nickname?: string;
      /**
       * 角色名称，多个使用英文逗号(,)分割
       */
      roleNames?: string;
      /**
       * 用户状态(1:启用;0:禁用)
       */
      status?: string;
      /**
       * 用户名
       */
      username?: string;
    };

    /**
     * menu type
     *
     * - "1": directory
     * - "2": menu
     */
    // type MenuType = '1' | '2';
    // type MenuType = '0' | '1' | '2';
    type MenuType = 'CATALOG' | 'MENU' | 'BUTTON';

    type MenuButton = {
      /**
       * button code
       *
       * it can be used to control the button permission
       */
      code: string;
      /** button description */
      desc: string;
    };

    /**
     * icon type
     *
     * - "1": iconify icon
     * - "2": local icon
     */
    type IconType = '1' | '2';

    type MenuPropsOfRoute = Pick<
      import('vue-router').RouteMeta,
      | 'i18nKey'
      | 'keepAlive'
      | 'constant'
      | 'order'
      | 'href'
      | 'hideInMenu'
      | 'activeMenu'
      | 'multiTab'
      | 'fixedIndexInTab'
      | 'query'
    >;

    type Menu = Common.CommonRecord<{
      component: string;
      icon: string;
      id: number;
      name: string;
      parentId: number;
      path: string;
      perm: string;
      redirect: string;
      sort: number;
      type: string;
      /**
       * 是否显示菜单
       */
      visible: number;
      /** children menu */
      children?: Menu[] | null;
    }> &
      MenuPropsOfRoute;

    /** menu list */
    type MenuList = Common.PaginatingQueryRecord<Menu>;

    type MenuTree = {
      value: number;
      label: string;
      children?: MenuTree[];
    };
    enum MenuTypeEnum {
      /**
       * 目录
       */
      CATALOG = 'CATALOG',
      /**
       * 菜单
       */
      MENU = 'MENU',

      /**
       * 按钮
       */
      BUTTON = 'BUTTON',
      /**
       * 外链
       */
      EXTLINK = 'EXTLINK'
    }

    type AddMenu = {
      /**
       * 菜单ID
       */
      id?: string;
      /**
       * 父菜单ID
       */
      parentId?: number;
      /**
       * 菜单名称
       */
      name?: string;
      /**
       * 菜单是否可见(1:是;0:否;)
       */
      visible: number;
      icon?: string;
      /**
       * 排序
       */
      sort: number;
      /**
       * 组件路径
       */
      component?: string;
      /**
       * 路由路径
       */
      path?: string;
      /**
       * 跳转路由路径
       */
      redirect?: string;

      /**
       * 菜单类型
       */
      type: MenuTypeEnum;

      /**
       * 权限标识
       */
      perm?: string;

      /**
       * 【菜单】是否开启页面缓存
       */
      keepAlive?: number;

      /**
       * 【目录】只有一个子路由是否始终显示
       */
      alwaysShow?: number;
    };
  }
}
