const RouterPlugin = function() {
  this.$router = null
  this.$store = null
}
RouterPlugin.install = function(router, store) {
  this.$router = router
  this.$store = store
  function isURL(s) {
    return /^http[s]?:\/\/.*/.test(s)
  }
  function objToform(obj) {
    const result = []
    Object.keys(obj).forEach(ele => {
      result.push(`${ele}=${obj[ele]}`)
    })
    return result.join('&')
  }
  this.$router.$avueRouter = {
    // 全局配置
    $website: this.$store.getters.website,
    routerList: [],
    group: '',
    safe: this,
    // 设置标题
    setTitle: function(title) {
      title = title ? `${title}——${this.$website.title}` : this.$website.title
      document.title = title
    },
    closeTag: (value) => {
      const tag = value || this.$store.getters.tag
      this.$store.commit('DEL_TAG', tag)
    },
    // 处理路由
    getPath: function(params) {
      const { src } = params
      let result = src || '/'
      if (src.includes('http') || src.includes('https')) {
        result = `/myiframe/urlPath?${objToform(params)}`
      }
      return result
    },
    // 正则处理路由
    vaildPath: function(list, path) {
      let result = false
      list.forEach(ele => {
        if (new RegExp('^' + ele + '.*', 'g').test(path)) {
          result = true
        }
      })
      return result
    },
    // 设置路由值
    getValue: function(route) {
      let value = ''
      if (route.query.src) {
        value = route.query.src
      } else {
        value = route.path
      }
      return value
    },
    // 动态路由
    formatRoutes: function(aMenu = [], first) {
      const aRouter = []
      // console.log(aMenu,first,'这里是动态路由');
      // 通过接口获取路由地址 aMenu 和 first
      // 定义基础配置
      // 菜单的基础属性 包括label 标题 path 地址 icon 和子集
      const propsConfig = this.$website.menu.props
      // 获取默认配置

      const propsDefault = {
        label: propsConfig.label || 'label',
        path: propsConfig.path || 'path',
        icon: propsConfig.icon || 'icon',
        children: propsConfig.children || 'children',
        meta: propsConfig.meta || 'meta'
      }
      // console.log(propsConfig,propsDefault,'参数一');
      // console.log(this.routerList,'123');
      // 当路由地址为空时返回
      if (aMenu.length === 0) return
      // 循环地址数组
      for (let i = 0; i < aMenu.length; i++) {
        const oMenu = aMenu[i]
        // console.log(oMenu[propsDefault.path],'这里是地址');
        // 在这里时还可以进行下一步，但是this.routerList[]值不知何处取得
        // console.log(this.routerList.includes(oMenu[propsDefault.path]));
        // 判断路由地址的是否包括routerList[building] 如果没有则返回 为去重操作？
        if (this.routerList.includes(oMenu[propsDefault.path])) return
        // console.log(3);
        // 定义地址
        const path = (() => {
          // 此为获得的路由地址
          // console.log(oMenu[propsDefault.path]);
          if (!oMenu[propsDefault.path]) {
            // 如果没有返回
            return
          } else if (first) {
            // 当他为 first 也就是true 的时候 返回替换过的路径，将index替换为''
            return oMenu[propsDefault.path].replace('/index', '')
          } else {
            // 如果为false 的时候 直接返回路由地址
            return oMenu[propsDefault.path]
          }
        })()

        //特殊处理组件
        // 定义子组件名称为 views 加上地址
        const component = 'views' + oMenu.path
        // 设置名称
        const name = oMenu[propsDefault.label]
        // 设置icon
        const icon = oMenu[propsDefault.icon]
        // 设置子组件
        const children = oMenu[propsDefault.children]
        // 定义查看是否有暂存区
        const meta = {
          keepAlive: Number(oMenu['keepAlive']) === 1
        }
        // 定义他是否有子集
        const isChild = children.length !== 0
        // 第一一个路由地址
        const oRouter = {
          path: path,
          component(resolve) {
            // 判断是否为首路由
            if (first) {
              require(['../page/index'], resolve)

              // 判断是否为多层路由
            } else if (isChild && !first) {
              require(['../page/index/layout'], resolve)

              // 判断是否为最终的页面视图
            } else {
              require([`../${component}.vue`], resolve)
            }
          },
          name: name,
          icon: icon,
          meta: meta,
          // 路由重定向
          redirect: (() => {
            if (!isChild && first && !isURL(path)) return `${path}/index`
            else return ''
          })(),
          // 处理是否为一级路由
          children: !isChild ? (() => {
            if (first) {
              if (!isURL(path)) oMenu[propsDefault.path] = `${path}/index`
              return [{
                component(resolve) { require([`../${component}.vue`], resolve) },
                icon: icon,
                name: name,
                meta: meta,
                path: 'index'
              }]
            }
            return []
          })() : (() => {
            return this.formatRoutes(children, false)
          })()
        }
        // 将路由地址放入aRouter
        aRouter.push(oRouter)
      }
      // 如果他为true 的时候
      if (first) {
        // 当他的地址不为第一个路径时
        if (!this.routerList.includes(aRouter[0][propsDefault.path])) {
          this.safe.$router.addRoutes(aRouter)
          // 将用户地址放入routerList
          this.routerList.push(aRouter[0][propsDefault.path])
        }
      } else {
        // 如果不是则返回
        return aRouter
      }
      // 在这里将数据重新赋值为空 就可以了 关键不知道为啥，案例来说可以？
      this.routerList=[]
      this.safe.$router.options.routes = this.safe.$router.options.routes.concat(aRouter)
      // console.log(aRouter,'内容');
    }

    
  }
}
// console.log(RouterPlugin,'配置');
export default RouterPlugin
