import { ControlServiceBase } from './control-service-base';
import { HttpResponse, Util } from '../utils';

/**
 * 表单部件服务基类
 *
 * @export
 * @class FormServiceBase
 * @extends {ControlServiceBase}
 */
export class FormServiceBase extends ControlServiceBase {

    /**
     * 处理数据
     *
     * @protected
     * @param {HttpResponse} res
     * @returns {Promise<any[]>}
     * @memberof GridServiceBase
     */
    protected async doItems(res: HttpResponse): Promise<any[]> {
        if (res.status === 200) {
            return [res.data];
        }
        return [];
    }

    /**
     * 启动工作流
     *
     * @param {string} action
     * @param {*} [context={}]
     * @param {*} [data={}]
     * @param {boolean} [isLoading]
     * @returns {Promise<HttpResponse>}
     * @memberof FormServiceBase
     */
    public async wfstart(action: string, context: any = {}, data: any = {}, isLoading: boolean): Promise<HttpResponse> {
        await this.onBeforeAction(action, context, data, isLoading);
        data = this.handleRequestData(action, context, data);
        let response: HttpResponse;
        if (Util.isFunction(this.service[action])) {
            response = await this.service[action](context, data, isLoading);
        } else {
            response = await this.service.Create(context, data, isLoading);
        }
        if (!response.isError()) {
            response = this.handleResponse(action, response);
        }
        return response;
    }

    /**
     * 提交工作流
     *
     * @param {string} action
     * @param {*} [context={}]
     * @param {*} [data={}]
     * @param {boolean} [isLoading]
     * @param {*} [wfdata]
     * @returns {Promise<HttpResponse>}
     * @memberof FormServiceBase
     */
    public async wfsubmit(action: string, context: any = {}, data: any = {}, isLoading?: boolean, wfdata?: any): Promise<HttpResponse> {
        await this.onBeforeAction(action, context, data, isLoading);
        data = this.handleRequestData(action, context, data);
        let response: HttpResponse;
        if (Util.isFunction(this.service[action])) {
            response = await this.service[action](context, data, isLoading);
        } else {
            response = await this.service.WFSubmit(context, data, wfdata);
        }
        if (!response.isError()) {
            response = this.handleResponse(action, response);
        }
        return response;
    }

    /**
     * 处理返回数据
     *
     * @param {string} action
     * @param {*} [data={}]
     * @param {boolean} [isCreate]
     * @returns {*}
     * @memberof FormServiceBase
     */
    public handleResponseData(action: string, data: any = {}, isCreate?: boolean): any {
        if (!this.model || !Util.isFunction(this.model.getDataItems)) {
            return data;
        }
        const item: any = {};
        const dataItems: any[] = this.model.getDataItems();
        dataItems.forEach(dataitem => {
            let val = data.hasOwnProperty(dataitem.prop) ? data[dataitem.prop] : null;
            if (!val) {
                val = data.hasOwnProperty(dataitem.name) ? data[dataitem.name] : null;
            }
            if ((isCreate === undefined || isCreate === null) && Object.is(dataitem.dataType, 'GUID') && Object.is(dataitem.name, 'srfkey') && (val && !Object.is(val, ''))) {
                isCreate = true;
            }
            item[dataitem.name] = val;
        });
        if (isCreate) {
            if (!item.srfuf) {
                Object.assign(item, { srfuf: '0' });
            }
        } else {
            if (!item.srfuf) {
                Object.assign(item, { srfuf: '1' });
            }
        }
        Object.assign(data, item);
        return data;
    }

    /**
     * 通过属性名称获取表单项名称
     * 
     * @param name 实体属性名称 
     * @memberof ${srfclassname('${ctrl.codeName}')}Service
     */
    public getItemNameByDeName(name:string) :string{
        if (!this.model || !Util.isFunction(this.model.getDataItems)) {
            return name;
        }
        let itemName = name;
        let mode: any = this.model.getDataItems();
        if (!mode && mode.getDataItems instanceof Function) {
            return name;
        }
        let formItemItems: any[] = mode.getDataItems();
        formItemItems.forEach((item:any)=>{
            if(item.prop === name){
                itemName = item.name;
            }
        });
        return itemName.trim();
    }

}