import Vue from 'vue'
import App from './App'
import 'element-ui/lib/theme-chalk/index.css'
import VueRouter from 'vue-router'
import store from './vuex/store'
import Vuex from 'vuex'
import axios from 'axios'
import rout from './routes'
import Mock from './mock'
import i18n from './lang'
import 'font-awesome/css/font-awesome.min.css'
import ElementUI from 'element-ui'
import $ from 'jquery'

//定义一个全局过滤器实现日期格式化
Vue.filter('datefmt', function (input, fmtstring) {

    return moment(input).format(fmtstring)

});

import * as socketApi from './api/socket'

Vue.prototype.socketApi = socketApi

Vue.config.productionTip = false
Mock.bootstrap();
Vue.use(ElementUI)
Vue.use(VueRouter)
Vue.use(Vuex)
Vue.prototype.$axios = axios;

//NProgress.configure({ showSpinner: false });
console.log("mainjs:");
console.log(rout.routes);
const router = new VueRouter({
    routes: rout.routes
});
Vue.prototype.$rout = router;

//本地存储系统初始化的router路由,用来处理用户退出后,把路由数据初始化
sessionStorage.setItem('sysMenu', JSON.stringify(rout.routes));

router.beforeEach((to, from, next) => {
    //NProgress.start();
    if (to.path == '/login') {
        sessionStorage.removeItem('user');
        sessionStorage.removeItem('menu');
        sessionStorage.removeItem('token');
    }
    let user = JSON.parse(sessionStorage.getItem('user'));
    if (sessionStorage.getItem('token')) {
        axios.defaults.headers.common['Authorization'] = sessionStorage.getItem('token');
    }
    if (!user && to.path != '/login' && !sessionStorage.getItem('menu') && !sessionStorage.getItem('token')) {
        next({path: '/login'})
    } else {
        next()
    }
});

var message = Vue.prototype.$message;
axios.defaults.baseURL = '/api';
axios.interceptors.response.use(
    res => {
        //对响应数据做些事
        if (res.data && res.status !== 200) {
            message({
                //  饿了么的消息弹窗组件,类似toast
                showClose: true,
                message: 'res.data.error.message.message ? res.data.error.message.message : res.data.error.message',
                type: "error"
            });
            return Promise.reject(res.data.error.message);
        }
        return res;
    },
    error => {
        // 用户登录的时候会拿到一个基础信息,比如用户名,token,过期时间戳
        // 直接丢sessionStorage
        if (!sessionStorage.getItem("token")) {
            // 若是接口访问的时候没有发现有鉴权的基础信息,直接返回登录页
            router.push({
                path: "/login"
            });
            message({
                //  饿了么的消息弹窗组件
                message: '缺少身份验证',
                type: "error"
            });
        } else {

            // 下面是接口回调的satus ,因为我做了一些错误页面,所以都会指向对应的报错页面
            if (error.response.status === 401) {
                message({
                    //  饿了么的消息弹窗组件
                    message: '授权超时,或未授权,请重新登录',
                    type: "error"
                });
            }

            // 下面是接口回调的satus ,因为我做了一些错误页面,所以都会指向对应的报错页面
            if (error.response.status === 403) {
                message({
                    //  饿了么的消息弹窗组件
                    message: '网络异常',
                    type: "error"
                });
            }
            if (error.response.status === 500) {
                message({
                    //  饿了么的消息弹窗组件
                    message: '网络异常',
                    type: "error"
                });
            }
            if (error.response.status === 502) {
                router.push({
                    path: "/error/502"
                });
            }
            if (error.response.status === 404) {
                message({
                    //  饿了么的消息弹窗组件
                    message: '访问页面不存在',
                    type: "error"
                });
            }
        }
        // 返回 response 里的错误信息
        let errorInfo = error.data.error ? error.data.error.message : error.data;
        return Promise.reject(errorInfo);
    }
);


//router.afterEach(transition => {
//NProgress.done();
//});

let vue = new Vue({
    //el: '#app',
    //template: '<App/>',
    router,
    store,
    i18n,
    //components: { App }
    render: h => h(App)
}).$mount('#app')