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

// 请求数据
// 参数：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 async function AxiosRequestData(url, token, jason, category, types) {
    let tokens = token
    if (tokens != null) {
        tokens = await getTokenStatus(tokens)
        if (tokens) {
            let data = await AxiosRequest(url, tokens, jason, category, types)
            return data
        }
    } else {
        let data = await AxiosRequest(url, tokens, jason, category, types)
        return data
    }
}

// 请求数据
// 参数：url：链接地址
//     token: Token值
//     jason：请求参数
//     category：是否加密，true：加密，false：不加密
//     types：请求类型，1：post请求，2：get请求
export function AxiosRequest(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) {
        // 是否已有用户信息
        let userInfo = store.state.login.user
        if (userInfo) {
            window.alert('登录已失效，请重新登录')
            cache.removeSession('user')
            cache.removeSession('company')
            cache.removeToken()
            store.dispatch('login/logout').then(() => {
                next({ path: '/login', query: { redirect: to.fullPath } })
            })
        } else {
            return { code: -1, msg: null }
        }
    } else if (status === 403) {
        window.alert('您当前角色无权限进行此操作')
    } else {
        return { code: status, msg: '服务器故障，请联系管理员！' }
    }
}

// 百望云请求数据
// 参数：url：链接地址
//     jason：请求参数
export function AxiosRequestBaiWangData(url, jason) {
    let paramsArray = []
    // 拼接参数
    Object.keys(jason).forEach(key =>
        paramsArray.push(key + '=' + jason[key])
    )
    if (url.search(/\?/) === -1) {
        url += '?' + paramsArray.join('&')
    } else {
        url += '&' + paramsArray.join('&')
    }
    return axios.post(url
    ).then((res) => {
        return res
    }).catch(error => {
        return error
    })
}

// 判断token状态
// 参数：token：token
export async function getTokenStatus(token) {
    let user = JSON.parse(cache.getSession('user'))
    if (user) {
        let date = timeCompare(user.expirationTime)
        if (date.hour === 0 && date.minute <= 60) {
            const url = '/auth/comm/user/refreshToken'
            if (token && user.account) {
                let response = await AxiosRequest(
                    url,
                    token,
                    {
                        account: user.account,
                        reqChannel: 4
                    },
                    false,
                    1
                )
                if (response) {
                    if (response.code === 0) {
                        let user = JSON.parse(cache.getSession('user'))
                        user.expirationTime = response.data.expirationTime
                        cache.setToken(response.data.token)
                        cache.setSession('user', user)
                        console.log(response.data.token)
                        return response.data.token
                    }
                }
            }
        } else {
            return token
        }
    }
}
