import Vue from "vue";

import VueRouter from "vue-router";
import routes from './routes'

//引入仓库啊
import store from "@/store/index.js";

// 使用插件
Vue.use(VueRouter);

// 引入路由白名单
import { pathArr } from './white'
console.log(pathArr);

const router = new VueRouter({
	routes,
	scrollBehavior(to, from, savedPosition) {
		// 始终滚动到顶部
		return { y: 0 }
	}
});

// 1.先备份
let orginPush = VueRouter.prototype.push;
let orginReplace = VueRouter.prototype.replace;



//第一个参数:告诉原来push方法，你往哪里跳转（传递哪些参数)
//第二个参数:成功回调
//第三个参数:失败回调
//不痛点: call与apply传递参数: call传递参数用逗号隔开，apply方法执行，传递数组

// 这里使用call的原因是
// orginPush中this指向是windows，call来篡改函数的上下文
VueRouter.prototype.push = function (location, resolve, reject) {
	// 如果用户穿了成功和失败回调函数
	if (resolve && reject) {
		// 当前this指向VueRouter
		// 将当前this对象应用oraginPush对象的方法
		// VueRouter使用orginPush的VueRouter.prototype.push方法
		orginPush.call(this, location, resolve, reject);
	} else {
		// 要是没穿 我就来穿
		// console.log(this);
		orginPush.call(
			this,
			location,
			() => { },
			() => { }
		);
	}
};

VueRouter.prototype.replace = function (location, resolve, reject) {
	if (resolve && reject) {
		orginReplace.call(this, location, resolve, reject);
	} else {
		orginReplace.call(
			this,
			location,
			() => { },
			() => { }
		);
	}
};

// 全局前置守卫 跳转路由之前会排查
// 1.用户登陆了, 就不应该能再进入登录页
// 2.用户没登陆, 不能进入`购物车`页面
router.beforeEach(async (to, from, next) => {
	//to:可以获取到你要跳转到那个路由信息
	//fom:可以获取到你从哪个路由而来的信息
	//next:放行函数 

	// 从本地存储中获取token
	const token = localStorage.getItem("TOKEN")
	// 从vuex中获取用户信息
	const peoplemessage = store.state.login.peoplemessage.name

	// 登录成功
	if (token) {
		// 跳转到login登录页
		if (to.path == '/login' || to.path == '/register') {
			next(false) //强制停留在当前页
		} else {
			// 查看是否有用户信息
			if (peoplemessage) {
				next()
			} else {
				// 使用try..catch判断获取用户信息是否成功
				try {
					// 没有就派发action获取存储用户信息 , 再跳转页面
					await store.dispatch("getpeoplemessage")
					next()
				}
				// 获取用户信息失败 
				catch (error) {
					// token失效(一个月)
					// 1.清除旧的token
					// 派发`退出登录`的action  这个action已经写好了清除本地token以及vuex存储的用户信息,token
					await store.dispatch("removelogin")
					next('/login')
				}
			}

		}
	}
	// 登录未成功
	else {
		// 想要跳转白名单的页面 强制跳转到login登录页

		// to.path是你将要跳转的路由
		// 在pathArr中要是有你将要跳转的路径,就强制跳转到登录页
		if (pathArr.indexOf(to.path) !== -1) {
			console.log(to.path);
			// 通过路由`redirect`通过query存储未去成的信息, 存储于地址栏中  
			next(`/login?redirect=${to.path} `)
		}
		next()
	}
})

export default router;



