import axios from 'axios'
import store from '@/store'
import cache from '@/utils/cache'
import { networkUrl } from './global_configuration'

// 请求数据
// 参数：url：链接地址
//     token: Token值
//     jason：请求参数
//     category：是否加密，true：加密，false：不加密
//     types：请求类型，1：post请求，2：get请求
export function AxiosRequestByBearer(url, token, jason, category, types, timeout) {
    let link = networkUrl()
    url = link + url
    if (types === 1) {
        return axios.post(url,
            // 参数列表
            jason,
            // 请求头配置
            {
                headers: {
                    'token': 'Bearer ' + token,
                    'Authorization': 'Bearer ' + token
                },
                timeout: timeout
            }
        ).then((res) => {
            return requestDataStatus(res)
        }).catch(error => {
            return errorStatus(error)
        })
    } else {
        return axios.get(url, {
            // 参数列表
            params: jason,
            // 请求头配置
            headers: { token: token }
        }).then((res) => {
            return requestDataStatus(res)
        }).catch(error => {
            return errorStatus(error)
        })
    }
}

// 请求数据
// 参数：url：链接地址
//     token: Token值
//     jason：请求参数
//     category：是否加密，true：加密，false：不加密
//     types：请求类型，1：post请求，2：get请求
export function AxiosRequestData(url, token, jason, category, types) {
    let link = networkUrl()
    url = link + url
    if (types === 1) {
        return axios.post(url,
            // 参数列表
            jason,
            // 请求头配置
            {
                headers: { 'token': token }
            }
        ).then((res) => {
            return requestDataStatus(res)
        }).catch(error => {
            return errorStatus(error)
        })
    } else {
        return axios.get(url, {
            // 参数列表
            params: jason,
            // 请求头配置
            headers: { token: token }
        }).then((res) => {
            return requestDataStatus(res)
        }).catch(error => {
            return errorStatus(error)
        })
    }
}

// 请求数据
// 参数：url：链接地址
//     token: Token值
//     jason：请求参数
//     category：是否加密，true：加密，false：不加密
//     types：请求类型，1：post请求，2：get请求
export function AxiosRequestFile(url, token, jason) {
    let link = networkUrl()
    url = link + url
    return axios.post(url,
        // 参数列表
        jason,
        // 请求头配置
        {
            headers: { 'Content-Type': 'multipart/form-data', 'token': token }
        }
    ).then((res) => {
        return requestDataStatus(res)
    }).catch(error => {
        return errorStatus(error)
    })
}

// 处理数据请求情况
// 参数： res：请求返回数据
export function requestDataStatus(res) {
    let status = res.status
    if (status === 200) {
        return res.data
    } else {
        return { code: -1, msg: '网络请求失败，请联系管理员！' }
    }
}

// 处理请求异常情况
// 参数： error：请求抛出的异常
export function errorStatus(error) {
    let status = error.response.status
    if (status === 401 || status === 403) {
        // 是否已有用户信息
        let userInfo = store.state.login.user
        if (userInfo) {
            window.alert('登录已失效，请重新登录')
            cache.removeLocal('user')
            cache.removeLocal('company')
            cache.removeToken()
            store.dispatch('login/logout').then(() => {
                next({ path: '/login', query: { redirect: to.fullPath } })
            })
        } else {
            return { code: -1, msg: null }
        }
    } else {
        return { code: status, msg: '服务器故障，请联系管理员！' }
    }
}
