import Vue from "vue"
import Cookies from "js-cookie"
import Element from "element-ui"
import "./assets/styles/element-variables.scss"
import "@/assets/styles/index.scss" // global css
import "@/assets/styles/ruoyi.scss" // ruoyi css
import App from "./App"
import store from "./store"
import router from "./router"
import directive from "./directive" // directive
import plugins from "./plugins" // plugins
import Print from "vue-print-nb"
import "./assets/icons" // icon
import "./permission" // permission control
import "./tongji" // 百度统计
import { getDicts } from "@/api/system/dict/data"
import { getConfigKey } from "@/api/infra/config"
import { parseTime, resetForm, addDateRange, addBeginAndEndTime, addBeginAndEndTimeNew, handleTree } from "@/utils/ruoyi"
import { removeEmpty } from "@/utils/index"
import Pagination from "@/components/Pagination"
// 自定义表格工具扩展
import RightToolbar from "@/components/RightToolbar"
import DictSelector from "@/components/DictSelector"
// 代码高亮插件
// import hljs from 'highlight.js'
// import 'highlight.js/styles/github-gist.css'
import { DICT_TYPE, getDictDataLabel, getDictDatas, getDictDatas2 } from "@/utils/dict"
import i18n from "./i18n"

// 全局方法挂载
Vue.prototype.getDicts = getDicts
Vue.prototype.getConfigKey = getConfigKey
Vue.prototype.parseTime = parseTime
Vue.prototype.resetForm = resetForm
Vue.prototype.addDateRange = addDateRange
Vue.prototype.addBeginAndEndTime = addBeginAndEndTime
Vue.prototype.addBeginAndEndTimeNew = addBeginAndEndTimeNew
Vue.prototype.getDictDatas = getDictDatas
Vue.prototype.getDictDatas2 = getDictDatas2
Vue.prototype.getDictDataLabel = getDictDataLabel
Vue.prototype.DICT_TYPE = DICT_TYPE
Vue.prototype.handleTree = handleTree
Vue.prototype.removeEmpty = removeEmpty

Date.prototype.format = function (format) {
  var date = {
    "M+": this.getMonth() + 1,
    "d+": this.getDate(),
    "h+": this.getHours(),
    "m+": this.getMinutes(),
    "s+": this.getSeconds(),
    "q+": Math.floor((this.getMonth() + 3) / 3),
    "S+": this.getMilliseconds()
  }
  if (/(y+)/i.test(format)) {
    format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length))
  }
  for (var k in date) {
    if (new RegExp("(" + k + ")").test(format)) {
      format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? date[k] : ("00" + date[k]).substr(("" + date[k]).length))
    }
  }
  return format
}

// 全局组件挂载
Vue.component("DictTag", DictTag)
Vue.component("DocAlert", DocAlert)
Vue.component("Pagination", Pagination)
Vue.component("RightToolbar", RightToolbar)
Vue.component("DictSelector", DictSelector)
// 字典标签组件
import DictTag from "@/components/DictTag"
import DocAlert from "@/components/DocAlert"
// 头部标签插件
import VueMeta from "vue-meta"

Vue.use(directive)
Vue.use(plugins)
Vue.use(VueMeta)
Vue.use(Print)
// Vue.use(hljs.vuePlugin);

// bpmnProcessDesigner 需要引入
import MyPD from "@/components/bpmnProcessDesigner/package/index.js"
Vue.use(MyPD)
import "@/components/bpmnProcessDesigner/package/theme/index.scss"
import "bpmn-js/dist/assets/diagram-js.css"
import "bpmn-js/dist/assets/bpmn-font/css/bpmn.css"
import "bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css"
import "bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css"

// Form Generator 组件需要使用到 tinymce
import Tinymce from "@/components/tinymce/index.vue"
Vue.component("tinymce", Tinymce)
import "@/icons"
import axios from "axios"
Vue.prototype.$axios = axios
import "@/styles/index.scss"
import "@/styles/custom.scss"

/**
 * If you don't want to use mock-server
 * you want to use MockJs for mock api
 * you can execute: mockXHR()
 *
 * Currently MockJs will be used in the production environment,
 * please remove it before going online! ! !
 */

Vue.use(Element, {
  size: Cookies.get("size") || "medium", // set element-ui default size
  i18n: (key, value) => i18n.t(key, value)
})
// 重定向路由（关闭当前标签）
Vue.prototype.$redirect = (path) => {
  let currentView = router.history.current
  router.replace(path)
  store.dispatch("tagsView/delView", currentView)
}
window.ElementUI = Element

// 显示表单错误信息
Vue.prototype.$showFormValidateErrors = (errors) => {
  let vm = new Vue()
  let createElement = vm.$createElement
  let fieldList = Object.values(errors)
  Element.Notification({
    title: i18n.$t("表单错误"),
    type: "warning",
    duration: 3000,
    message: createElement(
      "div",
      fieldList.map(function (errorList) {
        return createElement(
          "div",
          errorList.map((item) => {
            return createElement("div", item.message)
          })
        )
      })
    )
  })
}

Vue.config.productionTip = false

new Vue({
  el: "#app",
  router,
  store,
  i18n,
  render: (h) => h(App)
})
