import { createApp } from "vue";

import Cookies from "js-cookie";

import ElementPlus, { ElSelect } from "element-plus";
import locale from "element-plus/lib/locale/lang/zh-cn"; // 中文语言

import "@/assets/styles/index.scss"; // global css

import App from "./App";
import store from "./store";
import router from "./router";
import directive from "./directive"; // directive
import useUserStore from "/src/store/modules/user";

// 注册指令
import plugins from "./plugins"; // plugins
import { download, post, postFile, get, getFile, postUploadFile, postUploadAndDownloadFile } from "/src/utils/request";

// svg图标
import "virtual:svg-icons-register";
import SvgIcon from "/src/components/SvgIcon";
import elementIcons from "/src/components/SvgIcon/svgicon";

import "./permission"; // permission control

import { useDict } from "/src/utils/dict";

import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, selectDictLabels } from "/src/utils/ruoyi";
import { createPinia } from "pinia"; //引入pinia
import piniaPluginPersist from "pinia-plugin-persist"; //引入pinia数据持久化插件
import VueLazyLoad from "vue-lazyload";

// 按钮防抖
import preReClick from "./directive/preReClick.js";

import {
  dictKeyValue,
  dictValueLabel,
  moneyFormat,
  calculationWeek,
  getDict,
  getDictOne,
  getPdf,
  getPdfTransverseA4,
  translateIntoEnglish,
  random,
  deepClone,
  timeInterval,
  compareTime,
  downloadFile,
  NumberToChinese,
} from "/src/utils/util";
import "@/utils/table2excel";

// 分页组件
import Pagination from "/src/components/Pagination";
// 自定义树选择组件
import TreeSelect from "/src/components/TreeSelect";
// 多语言
import i18n from "/src/lang/index";

// 打印
import print from "vue3-print-nb";

const app = createApp(App);

// 全局方法挂载
app.config.globalProperties.useDict = useDict;
app.config.globalProperties.get = get;
app.config.globalProperties.post = post;
app.config.globalProperties.postFile = postFile;
app.config.globalProperties.postUploadFile = postUploadFile;
app.config.globalProperties.postUploadAndDownloadFile = postUploadAndDownloadFile;
app.config.globalProperties.getFile = getFile;
app.config.globalProperties.download = download;
app.config.globalProperties.parseTime = parseTime;
app.config.globalProperties.resetForm = resetForm;
app.config.globalProperties.handleTree = handleTree;
app.config.globalProperties.addDateRange = addDateRange;
app.config.globalProperties.selectDictLabel = selectDictLabel;
app.config.globalProperties.selectDictLabels = selectDictLabels;
app.config.globalProperties.t = i18n.global.t;
//字典回显
app.config.globalProperties.dictKeyValue = dictKeyValue;
app.config.globalProperties.dictValueLabel = dictValueLabel;
app.config.globalProperties.moneyFormat = moneyFormat;
app.config.globalProperties.calculationWeek = calculationWeek;
app.config.globalProperties.getDict = getDict;
app.config.globalProperties.getDictOne = getDictOne;
app.config.globalProperties.getPdf = getPdf;
app.config.globalProperties.getPdfTransverseA4 = getPdfTransverseA4;
app.config.globalProperties.translateIntoEnglish = translateIntoEnglish;
app.config.globalProperties.random = random;
app.config.globalProperties.deepClone = deepClone;
app.config.globalProperties.timeInterval = timeInterval;
app.config.globalProperties.compareTime = compareTime;
app.config.globalProperties.downloadFile = downloadFile;
app.config.globalProperties.NumberToChinese = NumberToChinese;

app.config.globalProperties.useUserStore = useUserStore;

// 全局组件挂载
app.component("Pagination", Pagination);
app.component("TreeSelect", TreeSelect);

app.use(router);
app.use(store);
app.use(plugins);

app.use(i18n);
app.use(elementIcons);
app.use(print);
app.component("svg-icon", SvgIcon);
app.use(createPinia().use(piniaPluginPersist)); //安装插件

app.use(VueLazyLoad, {
  preLoad: 1.3,
  error: "./assets/images/empty.png",
  attempt: 1,
  listenEvents: ["scroll"],
});

directive(app);

ElSelect.props.filterable = {
  type: Boolean,
  default: true,
};
ElSelect.props.clearable = {
  type: Boolean,
  default: true,
};
// 使用element-plus 并且设置全局的大小
app.use(ElementPlus, {
  locale: locale,
  // 支持 large、default、small
  size: Cookies.get("size") || "default",
});
app._context.components.ElDialog.props.closeOnClickModal.default = false;
app.use(preReClick);
app.mount("#app");