import Storage from './../store/storage.js';

const ENV = require('./../.env.js')

const HttpCodes = {
	UNAUTHORIZED: 401, //登录失效
}

class request {
	static request(method, url, data = null, that = null) {
		let promise = new Promise(function(resolve, reject) {
			let _url
			if (process.env.NODE_ENV !== 'production') {
				_url = ENV.APP_DEV_URL + url
			} else {
				_url = ENV.APP_PROD_URL + url
			}
			const param = {
				url: _url,
				method: method,
				data: data,
				header: {
					'Authorization': 'Bearer ' + Storage.getToken(),
					'Content-Type': 'application/json',
				},
				success(res) {
					if (res.statusCode === 200) {
						if (res.data.code === 200) {
							resolve(res.data)
						} else if (res.data.code == 401) {
							uni.reLaunch({
								url: '/pages/login'
							})
						} else if (res.data.code == 6401) {
							uni.request({
								url: ENV.APP_PROD_URL + '/api/refresh_token',
								method: 'GET',
								header: {
									'Authorization': 'Bearer ' + Storage.getToken(),
									'Content-Type': 'application/json',
								},
							}).then(res => {
								if (res.data.code == 200) {
									Storage.setToken(res.data.token)
									param.header.Authorization = 'Bearer ' + res.data.token
									uni.request(param)
								} else if (res.data.code == 401) {
									Storage.removeToken()
									Storage.removeCache('userInfo')
									uni.redirectTo({
										url: '/pages/login'
									})
								}
							})
						} else {
							resolve(res.data)
						}
					} else {
						resolve(res)
					}
				},
				fail(res) {
					resolve(res)
				}
			}
			uni.request(param)
		}).catch((res) => {
			if (res.statusCode === 200) {
				if (res.data.code !== 200) {
					return res.data
				}
			} else {
				console.log('服务器错误：', res)
				return res;
			}
		})
		return promise
	}

	static get(url, data, that) {
		return this.request('GET', url, data, that)
	}

	static post(url, data, that) {
		return this.request('POST', url, data, that)
	}

	static put(url, data, that) {
		return this.request('PUT', url, data, that)
	}

	static delete(url, data, that) {
		return this.request('DELETE', url, data, that)
	}
}

export default request