import Vue from 'vue'
import Router from 'vue-router'
import Store from './store'
import Layout from './views/Layout.vue'
import fileNotFound from './views/errors/fileNotFound.vue'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
NProgress.configure({ showSpinner: false })

Vue.use(Router);


const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location, onResolve, onReject) {
    if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
    return originalPush.call(this, location).catch(err => err)
}

const router = new Router({
    routes: [
        builder('/authentication', 'login/authentication'),
        builder('/login', 'login/login'),
        builder('/sso', 'SSO'),
        {
            path: '/',
            name: 'layout',
            component: Layout,
            meta: {
                requiresAuth: true
            },
            children: [
                ...restBuilder('oper/log', 'system/log'), // 系统管理-操作日志
                ...restBuilder('validcode', 'system/validcode'), // 接入管理-接入信息
                ...restBuilder('menu', 'system/menu'), // 系统管理--菜单管理
                ...restBuilder('resource', 'system/resource'), // 系统管理--资源管理
                ...restBuilder('role', 'system/role'), // 系统管理--角色管理
                ...restBuilder('user', 'system/user'), // 用户管理 -- 管理用户
                ...restBuilder('param', 'system/param'), // 系统管理--参数管理
                ...restBuilder('task', 'system/task'), // 系统管理--任务管理

                //部门
                ...restBuilder('dept', 'dept'),//部门

                ...restBuilder('staff', 'staff'),//花名册 员工信息
                ...restBuilder('staff/care', 'staff/care'),// 员工关怀信息
                ...restBuilder('care/template', 'care/template'),// 关怀问候信息
                ...restBuilder('staff/black', 'staff/black'),// 员工黑名单信息


                ...restBuilder('job', 'job'),// 职位信息
                ...restBuilder('staff/adjust/log', 'staff/adjust/log'),// 员工调岗信息
                ...restBuilder('staff/regular', 'staff/regular'),// 员工转正信息
                ...restBuilder('staff/leave', 'staff/leave'),// 员工离职信息
                ...restBuilder('staff/contract', 'staff/contract'),// 员工合同信息


                ...restBuilder('attendance/record/hik', 'attendance/record/hik'),// 海康考勤
                ...restBuilder('attendance/record/error', 'attendance/record/error'),// 考勤打卡记录异常信息
                ...restBuilder('attendance/stat', 'attendance/stat'),// 考勤汇总信息
                ...restBuilder('attendance/staff/stat', 'attendance/staff/stat'),// 考勤人员汇总信息


                ...restBuilder('attendance/record', 'attendance/record'),// 考勤打卡记录信息
                ...restBuilder('attendance/record/detail', 'attendance/record/detail'),// 考勤打卡记录详细信息
                ...restBuilder('attendance/group', 'attendance/group'),// 考勤组信息
                ...restBuilder('attendance/class', 'attendance/class'),// 考勤班次信息
                ...restBuilder('attendance/leave/record', 'attendance/leave/record'),// 请假记录信息
                ...restBuilder('attendance/vacation/balance', 'attendance/vacation/balance'),// 员工假期余额信息


                //以下为基础路由配置
                builder('blank', 'blank'),
                builder('', 'Home'),
                builder('index', 'Home'),
                builder('login/updatePwd', 'login/updatePwd'),
                builder('403', 'errors/403'),
                builder('*', 'errors/404'),
            ]
        },
    ]
})

/**
 * rest路由生成器
 *
 * @param {string} path 路径
 * @param {string} [component=path] 文件地址
 * @returns {array} [] reset路由数组,包含list/edit/add/view
 */
function restBuilder(path, component = path) {
    let arr = [];
    arr.push(builder(`${path}/list`, `${component}/list`));
    arr.push(builder(`${path}/edit`, `${component}/show`));
    arr.push(builder(`${path}/add`, `${component}/show`));
    arr.push(builder(`${path}/view`, `${component}/view`));
    return arr;
}

/**
 * 路由生成器
 *
 * @param {string} path 路径
 * @param {string} [component=path] 文件地址
 * @param {boolean} [requiresAuth=false] 是否登录后才能访问
 * @returns {any} {} 路由对象
 */
function builder(path, component = path, requiresAuth = false) {
    return {
        path: path,
        name: path || 'homepage',
        component: getComponent(component),
        meta: {
            requiresAuth: requiresAuth
        },
    }
}

function getComponent(fileName) {
    try {
        return require('./views/' + fileName).default
    } catch (error) {
        return fileNotFound;
    }
}
//检查是否跳转到sso地址
function ssoCheck(to, from, next) {
    console.log("to", to)
    console.log("from", from)
    console.log("next", next)
    let redirect = (to.path === '/login/updatePwd') ? '/#/updatePwd' : ''
    redirect = (redirect === '' && to.path === '/login') ? (location.protocol + '//' + location.host + '/#' + from.fullPath) : redirect
    if (redirect != '') {
        next(false)
        window.location.href = '//' + location.host + '/m/login/logout?redirect=' + encodeURIComponent(redirect)
        return true;
    }
    return false;
}

router.afterEach(() => {
    document.body.scrollTop = 0
    document.documentElement.scrollTop = 0
    NProgress.done()
})

// 路由鉴权
router.beforeEach((to, from, next) => {
    // if (ssoCheck(to, from, next)) { //sso鉴权检查
    //   return
    // }
    NProgress.start()
    if (to.matched.some(record => record.meta.requiresAuth)) {
        if (Store.state.isLogin) {
            next();
        } else {
            next({
                path: '/authentication',
                query: {
                    redirect: to.fullPath
                }
            })
        }
    } else {
        next();
    }
})


export default router;