import { loadingText, messageDuration, title } from "@/config/settings"
import * as lodash from "lodash"
import { Loading, Message, MessageBox, Notification } from "element-ui"
import store from "@/store"
import { getAccessToken } from "@/utils/accessToken"
import Handle from "./index"

const accessToken = store.getters["user/accessToken"]
const layout = store.getters["settings/layout"]

const install = (Vue, opts = {}) => {
  /* 全局accessToken */
  Vue.prototype.$baseAccessToken = () => {
    return accessToken || getAccessToken()
  }
  /* 全局标题 */
  Vue.prototype.$baseTitle = (() => {
    return title
  })()
  /* 全局加载层 */
  Vue.prototype.$baseLoading = (index, text, callback) => {
    let loading
    if (!index) {
      loading = Loading.service({
        lock: true,
        text: text || loadingText,
        background: "hsla(0,0%,100%,.8)",
      })
    } else {
      loading = Loading.service({
        lock: true,
        text: text || loadingText,
        spinner: "vab-loading-type" + index,
        background: "hsla(0,0%,100%,.8)",
      })
    }
    if (callback) {
      callback(loading)
    } else {
      setTimeout(() => {
        loading.close()
      }, messageDuration)
    }
  }
  /* 全局多彩加载层 */
  Vue.prototype.$baseColorfullLoading = (index, text, callback) => {
    let loading
    if (!index) {
      loading = Loading.service({
        lock: true,
        text: text || loadingText,
        spinner: "dots-loader",
        background: "hsla(0,0%,100%,.8)",
      })
    } else {
      switch (index) {
        case 1:
          index = "dots"
          break
        case 2:
          index = "gauge"
          break
        case 3:
          index = "inner-circles"
          break
        case 4:
          index = "plus"
          break
      }
      loading = Loading.service({
        lock: true,
        text: text || loadingText,
        spinner: index + "-loader",
        background: "hsla(0,0%,100%,.8)",
      })
    }
    if (callback) {
      callback(loading)
    } else {
      setTimeout(() => {
        loading.close()
      }, messageDuration)
    }
  }
  /* 全局Message */
  Vue.prototype.$baseMessage = (message, type) => {
    Message({
      offset: 60,
      showClose: true,
      message: message,
      type: type,
      dangerouslyUseHTMLString: true,
      duration: messageDuration,
    })
  }

  /* 全局Alert */
  Vue.prototype.$baseAlert = (content, title, callback) => {
    MessageBox.alert(content, title || "温馨提示", {
      confirmButtonText: "确定",
      dangerouslyUseHTMLString: true,
      callback: (action) => {
        if (callback) {
          callback()
        }
      },
    })
  }

  /* 全局Confirm */
  Vue.prototype.$baseConfirm = (content, title, callback1, callback2) => {
    MessageBox.confirm(content, title || "温馨提示", {
      confirmButtonText: "确定",
      cancelButtonText: "取消",
      closeOnClickModal: false,
      type: "warning",
    })
      .then(() => {
        if (callback1) {
          callback1()
        }
      })
      .catch(() => {
        if (callback2) {
          callback2()
        }
      })
  }

  /* 全局Notification */
  Vue.prototype.$baseNotify = (message, title, type, position) => {
    Notification({
      title: title,
      message: message,
      position: position || "top-right",
      type: type || "success",
      duration: messageDuration,
    })
  }

  /* 全局TableHeight */
  Vue.prototype.$baseTableHeight = (formType) => {
    let height = window.innerHeight
    let paddingHeight = 400
    const formHeight = 50

    if (layout === "vertical") {
      paddingHeight = 340
    }

    if ("number" == typeof formType) {
      height = height - paddingHeight - formHeight * formType
    } else {
      height = height - paddingHeight
    }
    return height
  }

  /* 全局map图层 */
  // Vue.prototype.$baseMap = () => {
  //   return new maptalks.Map("map", {
  //     center: [116.41348403785, 39.910843952376],
  //     zoom: 12,
  //     minZoom: 1,
  //     maxZoom: 19,
  //     spatialReference: {
  //       projection: "baidu",
  //     },
  //     attribution: {
  //       content: "&copy; vue-admin-beautiful",
  //     },
  //     baseLayer: new maptalks.TileLayer("base", {
  //       cssFilter: "sepia(100%) invert(90%)",
  //       urlTemplate:
  //         "http://online{s}.map.bdimg.com/onlinelabel/?qt=tile&x={x}&y={y}&z={z}&styles=pl&scaler=1&p=1",
  //       subdomains: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
  //       attribution:
  //         '&copy; <a target="_blank" href="http://map.baidu.com">Baidu</a>',
  //     }),
  //   });
  // };

  /* 全局lodash */
  Vue.prototype.$baseLodash = lodash
  /* 全局事件总线 */
  Vue.prototype.$baseEventBus = new Vue()
  //  utils methods
  Vue.prototype.$handle = Handle
  Vue.prototype.deepClone = lodash.cloneDeep
}

if (typeof window !== "undefined" && window.Vue) {
  install(window.Vue)
}

export default install
