import Jsonp from '../jsonp/jsonp';

/**
 * 示例数请求对象
 *
 * @export
 * @class AppSamle
 */
export default class JsonHttp {

    /**
     * 获取 Http 单例对象
     *
     * @static
     * @returns {Http}
     * @memberof SampleHttp
     */
    public static getInstance(): JsonHttp {
        return new JsonHttp();
    }

    /**
     * jsonp跨域请求对象
     *
     * @type {Jsonp}
     * @memberof JsonHttp
     */
    public jsonpHttp: Jsonp = new Jsonp();

    /**
     * 请求
     *
     * @param {string} url
     * @returns {Promise<any>}
     * @memberof SampleHttp
     */
    public http(url: string, params: any = {}): Promise<any> {
        return new Promise((resolve: any, reject: any) => {
            let action = url.substring(url.lastIndexOf('/') + 1);
            let type: string = url.substring(url.indexOf('/') + 1, url.indexOf('/', url.indexOf('/') + 1));
            url = `./assets/sampledata/${url.substring(0, url.lastIndexOf('/'))}.json`;
            let fileName: string = url.substring(url.lastIndexOf('/') + 1, url.lastIndexOf('.'));
            this.jsonp(url, fileName).then((data: any) => {
                if (Object.is(type, 'app')) {
                    let result = this.setResultData(data);
                    resolve(result);
                } else {
                    let result: Promise<any>;
                    if (Object.is(type, 'ctrl')) {
                        result = this.ctrlHttp(url, action, data, params);
                    } else {
                        result = this.DEHttp(url, action, data, params);
                    }
                    result.then((response: any) => {
                        resolve(this.setResultData(response));
                    }).catch((response: any) => {
                        reject(response);
                    })
                }

            }).catch((error: any) => {
                reject(error);
            });
        });
    }

    /**
     * 实体部件类请求
     *
     * @param {string} url
     * @param {string} action
     * @param {*} data
     * @param {*} [params={}]
     * @memberof SampleHttp
     */
    public DEHttp(url: string, action: string, data: any, params: any = {}): Promise<any> {
        return new Promise((resolve: any, reject: any) => {
            let ctrlName: string = url.substring(url.lastIndexOf('/') + 1, url.lastIndexOf('.'));
            url = url.substring(0, url.lastIndexOf('/'));
            let deName: string = url.substring(url.lastIndexOf('/') + 1);
            url += `/${deName}.json`;
            this.jsonp(url, deName).then((json: any) => {
                resolve(this.getResultData(ctrlName, json, data, params));
            }).catch((error: any) => {
                reject(error);
            });
        });
    }

    /**
     * 获取返回数据
     *
     * @param {string} ctrlName
     * @param {any[]} items
     * @param {*} mode
     * @returns {*}
     * @memberof SampleHttp
     */
    public getResultData(ctrlName: string, items1: any[] = [], items2: any[] = [], params: any = {}): any {
        let data: any = {};
        if (ctrlName.endsWith('form')) {
            if (params.srfkey) {
                let index = items1.findIndex((item: any) => Object.is(item.srfkey, params.srfkey));
                if (index >= 0) {
                    Object.assign(data, items1[index]);
                    data.srfuf = "1";
                }
            }
        }
        if (ctrlName.endsWith('grid') || ctrlName.endsWith('list') || ctrlName.endsWith('dataview')) {
            let items: any[] = [];
            items1.forEach((item1: any) => {
                let data: any = {};
                items2.forEach((item2: any) => {
                    data[item2.name] = item1[item2.valueitem] != undefined ? item1[item2.valueitem] : null;
                });
                items.push(data);
            });
            Object.assign(data, { records: items, total: items1.length });
        }

        return data;
    }

    /**
     * ctrl类请求
     *
     * @param {string} url
     * @param {string} action
     * @param {*} data
     * @param {*} [params={}]
     * @returns {Promise<any>}
     * @memberof SampleHttp
     */
    public ctrlHttp(url: string, action: string, data: any, params: any = {}): Promise<any> {
        return new Promise((resolve: any, reject: any) => {
            let ctrlName: string = url.substring(url.lastIndexOf('/') + 1, url.lastIndexOf('.'));
            if (ctrlName.endsWith('appmenu')) {
                resolve(data);
            }
            if (ctrlName.endsWith('treeview')) {
                if (params.srfnodeid) {
                    let index: number = data.findIndex((item: any) => Object.is(item.id, params.srfnodeid));
                    if(index >= 0) {
                        let node: any = data[index];
                        let items: any[] = [];
                        node.childNode.forEach((id: string) => {
                            let item = data.find((item: any) => Object.is(item.id, id));
                            items.push(item);
                        });
                        resolve(items);
                    }
                }
            }
        });
    }

    /**
     * 请求
     *
     * @param {string} url
     * @param {string} callbackName
     * @returns
     * @memberof SampleHttp
     */
    public jsonp(url: string, callbackName: string) {
        return new Promise((resolve: any, reject: any) => {
            this.jsonpHttp.jsonp(url, {
                callbackName: callbackName
            }).then((json: any) => {
                resolve(json);
            }).catch((error: any) => {
                reject(error);
            });
        });
    }

    /**
     * 设置返回数据
     *
     * @param {*} resolve
     * @param {*} data
     * @memberof SampleHttp
     */
    public setResultData(data: any): any {
        return {
            status: 200,
            data: data,
            statusText: "OK"
        };
    }
}