import 'whatwg-fetch';
import { MESSAGE_TYPE} from "./message";
import { DOMIN } from "./constant";
import { userStore } from '../store/userStore';

class Resource {
    constructor(domain='') {
        this.domian = domain;
    }

    resource({method = 'GET', params, headers, path, queryString = true}) {
        let query = '';
        if(queryString) {
            query = params ? '?' + Object.keys(params).map(k => k + '=' + params[k]).join('&') : '';
        }
        return new Promise(((resolve, reject) => {
            fetch(this.domian+path+query, {
                method,
                headers: {
                    'Content-Type': 'application/json',
                    ...userStore.getToken()
                },
                credentials: 'include',
                body:queryString ? null :JSON.stringify({...params})
                // body:JSON.stringify({...params})
            })
                .then(this.responseHandler(resolve,reject))
                .then(this.dataHandler(resolve,reject))
                .catch((err) => {
                    this.handleError(err,resolve,reject);
                })
        }))
    }

    get = (path,params,headers) => {
        return this.resource({ path,params,headers });
    };

    post = (path,params,headers) => {
        return this.resource({ path,params,headers,method:'POST', queryString:false });
    };

    delete = (path,params,headers) => {
        return this.resource({ path,params,headers,method:'DELETE', queryString:false });
    };

    postForm(url,params) {
        return new Promise((resolve, reject) => {
            fetch(this.domian+url,{
                method:'post',
                headers: {
                    ...userStore.getToken()
                },
                body:params
            }).then(this.responseHandler(resolve,reject))
                .then(this.dataHandler(resolve,reject))
                .catch((err) => {
                    this.handleError(err,resolve,reject);
                });
        });
    }

    // 处理code非0时的异常问题
    dataHandler(resolve,reject) {
        return (data) => {
            if(!data.errCode) {
                resolve(data);
            }else {
                this.handleErrorCode(data,resolve,reject);
            }
        }
    }

    // 处理response数据异常问题 例 400 500 404
    responseHandler(resolve,reject) {
        return  (response) => {
            if (response.status >= 200 && response.status < 300) {
                return response.json();
            } else if(response.status === 405) {
                userStore.logout();
                reject({type:MESSAGE_TYPE.ERROR, msg:'您的登录已失效,请重新登录', status: response.status});
            }else {
                reject({type:MESSAGE_TYPE.ERROR, msg:`服务器异常,错误码:${ response.status }`, status: response.status});
            }
        }
    }

    // 处理因网络出现的异常
    handleError(err,resolve,reject) {
        reject({type:MESSAGE_TYPE.ERROR,msg:'网络请求失败'});
    }

    // 后台接口调用成功 抛出提示信息
    handleErrorCode({ errCode,errMsg },resolve,reject) {
        reject({type:MESSAGE_TYPE.ERROR, msg:`${ errMsg }`, status:200, errCode});
    }
}

// export const RESOURCE = new Resource('http://120.27.238.50:8082/DataCenter/api/v1');
export const RESOURCE= new Resource(DOMIN);