import type { StyleValue } from "vue"
import type { RouteRecordRaw, RouteMeta, NavigationGuard } from 'vue-router'

type RecursiveRequired<T> = {
  [P in keyof T]-?: RecursiveRequired<T[P]>
}
type RecursivePartial<T> = {
  [P in keyof T]?: RecursivePartial<T[P]>
}

declare namespace Settings {
  interface app {
    /**
     * 颜色方案
     * @默认值 `''` 跟随系统
     * @可选值 `'light'` 明亮模式
     * @可选值 `'dark'` 暗黑模式
     */
    colorScheme?: '' | 'light' | 'dark'
    /**
     * Element Plus 组件默认尺寸
     * @默认值 `'default'` 默认
     * @可选值 `'large'` 大号
     * @可选值 `'small'` 小号
     */
    elementSize?: 'default' | 'large' | 'small'
    /**
     * 是否将 iconify 图标集中的 Element Plus 图标下载到本地，以便在离线环境下使用
     * @默认值 `false`
     */
    iconifyOfflineUse?: boolean
    /**
     * 是否开启logo
     * @默认值 `false`
     */
    enableLogo?:boolean
    /**
     * 是否开启权限功能
     * @默认值 `false`
     */
    enablePermission?: boolean
    /**
     * 是否开启载入进度条
     * @默认值 `true`
     */
    enableProgress?: boolean
    /**
     * 是否开启动态标题
     * @默认值 `false`
     */
    enableDynamicTitle?: boolean
    /**
     * 路由数据来源
     * @默认值 `'frontend'` 前端
     * @可选值 `'backend'` 后端
     * @可选值 `'filesystem'` 文件系统
     */
    routeBaseOn?: 'frontend' | 'backend' | 'filesystem'
  }
  interface dashboard {
    /**
     * 是否开启控制台页面
     * @默认值 `true`
     */
    enable?: boolean
    /**
     * 控制台名称
     * @默认值 `'控制台'`
     */
    title?: string
  }
  interface layout {
    /**
     * 是否开启移动端适配，开启后当页面宽度小于 992px 时自动切换为移动端展示
     * @默认值 `false`
     */
    enableMobileAdaptation?: boolean
  }
  interface menu {
    /**
     * 导航栏数据来源，当 `app.routeBaseOn: 'filesystem'` 时生效
     * @默认值 `'frontend'` 前端
     * @可选值 `'backend'` 后端
     */
    baseOn?: 'frontend' | 'backend'
    /**
     * 导航栏模式
     * @默认值 `'side'` 侧边栏模式（有主导航）
     * @可选值 `'head'` 混合模式(顶部为主导航，副导航在侧边)
     * @可选值 `'single'` 侧边栏模式（无主导航）
     * @可选值 `'top'` 顶部模式（无主导航）
     */
    menuMode?: 'side' | 'head' | 'single' | 'top'
    /**
     * 切换主导航是否跳转页面
     * @默认值 `false`
     */
    switchMainMenuAndPageJump?: boolean
    /**
     * 次导航是否只保持一个子项的展开
     * @默认值 `true`
     */
    subMenuUniqueOpened?: boolean
    /**
     * 次导航是否收起
     * @默认值 `false`
     */
    subMenuCollapse?: boolean
    /**
     * 是否开启次导航的展开/收起按钮
     * @默认值 `false`
     */
    enableSubMenuCollapseButton?: boolean
    /**
     * 是否开启主导航切换快捷键
     * @默认值 `false`
     */
    enableHotkeys?: boolean
    /**
     * 主导航是否显示icon
     * @默认值 `false`
     */
     showIcon?: boolean
     /**
     * 主导航选中样式: round圆角，square直角
     * @可选值 round 圆角
     * @可选值 square 直角
     */
    hoverStyle?: 'round' | 'square'
  }
  interface topbar {
    /**
     * 是否固定顶栏
     * @默认值 `true`
     */
    fixed?: boolean
  }
  interface toolbar {
    /**
     * 是否开启全屏
     * @默认值 `false`
     */
    enableFullscreen?: boolean
    /**
     * 是否开启页面刷新
     * @默认值 `false`
     */
    enablePageReload?: boolean
    /**
     * 是否开启颜色主题
     * @默认值 `false`
     */
    enableColorScheme?: boolean
    /**
     * 是否开启应用配置，强烈建议在生产环境中关闭
     * @默认值 `false`
     */
    enableAppSetting?: boolean
  }
  interface breadcrumb {
    /**
     * 是否开启面包屑导航
     * @默认值 `true`
     */
    enable?: boolean
  }
  interface navSearch {
    /**
     * 是否开启导航搜索
     * @默认值 `true`
     */
    enable?: boolean
    /**
     * 是否开启导航搜索快捷键
     * @默认值 `true`
     */
    enableHotkeys?: boolean
  }
  interface copyright {
    /**
     * 是否开启底部版权，同时在路由 meta 对象里可以单独设置某个路由是否显示底部版权信息
     * @默认值 `true`
     */
    enable?: boolean
    /**
     * 网站运行日期
     * @默认值 `'2020-2022'`
     */
    dates?: string
    /**
     * 公司名称
     * @默认值 `'Fantastic-admin'`
     */
    company?: string
    /**
     * 网站地址
     * @默认值 `'https://hooray.gitee.io/fantastic-admin/'`
     */
    website?: string
    /**
     * 网站备案号
     * @默认值 `''`
     */
    beian?: string
  }
  interface all {
    /** 应用设置 */
    app?: app
    /** 控制台设置 */
    dashboard?: dashboard
    /** 布局设置 */
    layout?: layout
    /** 导航栏设置 */
    menu?: menu
    /** 顶栏设置 */
    topbar?: topbar
    /** 工具栏设置 */
    toolbar?: toolbar
    /** 面包屑导航设置 */
    breadcrumb?: breadcrumb
    /** 导航搜索设置 */
    navSearch?: navSearch
    /** 底部版权设置 */
    copyright?: copyright
  }
}

declare module 'vue-router' {
  interface RouteMeta {
    title: string | Function
    i18n?: string
    icon?: string
    activeIcon?: string
    defaultOpened?: boolean
    auth?: string | string[]
    sidebar?: boolean
    breadcrumb?: boolean
    activeMenu?: string
    cache?: boolean | string | string[]
    breadcrumbNeste?: Route.breadcrumb[]
  }
}

declare namespace Route {
  interface recordRaw extends Omit<RouteRecordRaw, 'meta' | 'children'> {
    meta: RouteMeta
    children?: recordRaw[]
  }
  interface recordMainRaw {
    meta: {
      title?: string | Function
      icon?: string
      auth?: string
    }
    children: recordRaw[]
  }
  interface breadcrumb {
    path: string
    title: string | Function
    hide: boolean
  }
}

declare namespace Menu {
  /** 原始 */
  interface recordRaw {
    path?: string
    meta: {
      title: string
      icon?: string
      defaultOpened?: boolean
      auth?: string
      sidebar?: boolean
    }
    children?: recordRaw[]
  }
  /**按钮菜单对象 */
  interface menu{
    url:string,
    name:string,
    icon:string
  }
  /** 主导航 */
  interface recordMainRaw {
    meta: {
      title?: string
      icon?: string
      auth?: string
    }
    children: recordRaw[]
  }
}
