/****   request.js   ****/
// 导入axios
import axios from "axios"
// 使用element-ui Message做消息提醒
import { Message } from "element-ui"
import baseURL from "@/utils/baseApi"
import { goTologin } from "@/utils/common.js"

//1. 创建新的axios实例，
axios.defaults.withCredentials = true
axios.defaults.emulateJSON = true

// 好几个接口
baseURL = {
    // forum: "https://forum.gter.net",
    forum: "https://app.gter.net/forum",
    offer: "https://offer.gter.net",
    tenement: "https://app.gter.net",
}

const service = axios.create({
    baseURL: baseURL.forum,
    timeout: 15000,
})

// 2.请求拦截器
service.interceptors.request.use(
    config => {
        //发请求前做的一些处理，数据转化，配置请求头，设置token,设置loading等，根据需求去添加
        //注意使用token的时候需要引入cookie方法或者用本地localStorage等方法，推荐js-cookie
        // config['headers']['authorization'] = "qj2q1qk1on0curclipghjtv5ja1g9eq2"
        // config['headers']['authorization'] = "661aiz52k5e6vqgmkxnz0wvbv8nciz8h"

        // if (process.env.NODE_ENV == "development") config['headers']['authorization'] = "0h870ovk2xckoqfsh8a3t3sg4sg5z7eg"
        if (process.env.NODE_ENV == "development") config["headers"]["authorization"] = "5f8215f2105d8b2162d0cc210cdbf1a3"

        return config
    },
    error => {
        Promise.reject(error)
    }
)

// 3.响应拦截器
service.interceptors.response.use(
    response => {
        //接收到响应数据并成功后的一些共有的处理，关闭loading等
        let data = response.data
        if (data.code == 401) return goTologin()
        if (data.code == 201 && response["config"]["ispop"] == true) Message.error(data.message)
        return data
    },
    error => {
        /***** 接收到异常响应的处理开始 *****/
        if (error && error.response) {
            // 1.公共错误处理
            // 2.根据响应码具体处理
            switch (error.response.status) {
                case 400:
                    error.message = "错误请求"
                    break
                case 401:
                    error.message = "未授权，请重新登录"
                    break
                case 403:
                    error.message = "拒绝访问"
                    break
                case 404:
                    error.message = "请求错误,未找到该资源"
                    break
                case 405:
                    error.message = "请求方法未允许"
                    break
                case 408:
                    error.message = "请求超时"
                    break
                case 500:
                    error.message = "服务器端出错"
                    break
                case 501:
                    error.message = "网络未实现"
                    break
                case 502:
                    error.message = "网络错误"
                    break
                case 503:
                    error.message = "服务不可用"
                    break
                case 504:
                    error.message = "网络超时"
                    break
                case 505:
                    error.message = "http版本不支持该请求"
                    break
                default:
                    error.message = `连接错误${error.response.status}`
            }
        } else {
            // 超时处理
            if (JSON.stringify(error).includes("timeout")) error.message = "服务器响应超时，请刷新当前页"
            error.message = "连接服务器失败"
        }

        Message.error(error.message)
        /***** 处理结束 *****/
        //如果不需要错误处理，以上的处理过程都可省略
        return Promise.resolve(error.response)
    }
)

const http = {
    /**
     * methods: 请求
     * @param url 请求地址
     * @param params 请求参数
     * @param baseURLName 域名名称 不传为论坛
     * @param ispop 报错是否需要弹窗
     */
    get(url, params, baseURLName, ispop = true) {
        const str = window.location.hostname
        let hash = 0
        for (let i = 0; i < str.length; i++) {
            const char = str.charCodeAt(i)
            hash = (hash << 5) - hash + char
            hash |= 0
        }
        const strr = (hash >>> 0).toString(16)
        
        const config = {
            method: "get",
            url,
            baseURL: baseURL[baseURLName],
        }
        params = Object.assign({}, params, { key: strr })
        if (params) config.params = params
        return service(config)
    },
    post(url, params, baseURLName, ispop = true) {
        const config = {
            method: "post",
            url: url,
            baseURL: baseURL[baseURLName],
        }
        if (params) config.data = params
        config["ispop"] = ispop
        return service(config)
    },
}
// 导出
export default http
