import { IPSApplication, IPSAppPortlet } from '@ibiz/dynamic-model-api';
import { AppServiceBase, UtilServiceHelp } from 'ibiz-core';
export default class AppDashboardDesignService {

    /**
     * 加载数据模型
     *
     * @param {string} serviceName
     * @param {*} context
     * @param {*} viewparams
     * @memberof AppDashboardDesignService
     */
    public loadModel(serviceName: string, context: any, viewparams: any) {
        return new Promise((resolve: any, reject: any) => {
            UtilServiceHelp.getInstance().getService(context, serviceName).then((utilService: any) => {
                utilService.getService(serviceName).then((service: any) => {
                    service.loadModelData(JSON.stringify(context), viewparams).then((response: any) => {
                        resolve(response);
                    }).catch((response: any) => {
                        reject(response);
                    });
                }).catch((response: any) => {
                    reject(response);
                });
            })
        });
    }

    /**
     * 保存模型
     *
     * @param {string} serviceName
     * @param {*} context
     * @param {*} viewparams
     * @returns
     * @memberof AppDashboardDesignService
     */
    public saveModel(serviceName: string, context: any, viewparams: any) {
        return new Promise((resolve: any, reject: any) => {
            UtilServiceHelp.getInstance().getService(context, serviceName).then((utilService: any) => {
                let saveModel: any = []
                for (const model of viewparams.model) {
                    // 保存的数据去除modelData
                    let temp: any = { ...model };
                    delete temp.modelData;
                    saveModel.push(temp)
                }
                viewparams.model = saveModel;
                utilService.saveModelData(JSON.stringify(context), viewparams).then((response: any) => {
                    resolve(saveModel);
                }).catch((response: any) => {
                    reject(response);
                });
            })
        });
    }



    /**
     * 加载门户部件集合
     *
     * @memberof AppDashboardDesignService
     */
    public async loadPortletList(context: any, viewparams: any): Promise<any> {
        const app:IPSApplication = AppServiceBase.getInstance().getAppModelDataObject();
        let list: any = [];
        const portletCats = app.getAllPSAppPortletCats();
        // 实体缓存集合
        if (app.getAllPSAppPortlets?.()?.length) {
            for (const portlet of app.getAllPSAppPortlets() as IPSAppPortlet[]) {
                // 门户部件实例
                // 实体实例
                let appDe = null;
                if (portlet?.getPSAppDataEntity?.()) {
                    appDe = portlet.getPSAppDataEntity()
                }
                // 门户部件分类集合
                let portletCat = portletCats?.find((item: any) => item.codeName == portlet.getPSAppPortletCat?.()?.codeName)
                let temp: any = {
                    type: 'app',
                    portletCodeName: portlet.codeName,
                    portletName: portlet.name,
                    portletImage: portlet.M.getPSControl?.getPSSysImage?.cssClass,
                    groupCodeName: portletCat?.codeName || "",
                    groupName: portletCat?.name || "",
                    modelData: portlet?.getPSControl?.(),
                }
                if (appDe) {
                    temp.appCodeName = appDe.codeName;
                    temp.appName = appDe.name;
                } else {
                    temp.appCodeName = app.pKGCodeName;
                    temp.appName = app.name;
                }
                list.push(temp);
            }
        }
        const datas: any[] = this.filterData(list, viewparams.appdeNamePath);
        const result = this.prepareList(datas);
        const groups = this.prepareGroup(datas);
        return { data: datas, result: result.reverse(), groups: groups };
    }

    /**
     * 过滤数据
     *
     * @param {any[]} datas
     * @memberof AppDashboardDesignService
     */
    public filterData(datas: any[] = [], dataType: string): any[] {
        let items: any[] = [];
        datas.forEach((data: any) => {
            if (Object.is(data.type, 'app')) {
                items.push(data);
            }
            if (Object.is(data.appCodeName, dataType)) {
                items.push(data);
            }
        });
        return items;
    }

    /**
     * 分组集合
     *
     * @param {any[]} [datas=[]]
     * @returns {any[]}
     * @memberof AppDashboardDesignService
     */
    public prepareGroup(datas: any[] = []): any[] {
        let items: any[] = [];
        datas.forEach((data: any) => {
            let item = items.find((item: any) => Object.is(item.value, data.groupCodeName));
            if (item) {
                let _item = item.children.find((a: any) => Object.is(a.portletCodeName, data.portletCodeName));
                if (!_item) {
                    item.children.push(data);
                }
            } else {
                items.push({ name: data.groupName, value: data.groupCodeName, children: [data] });
            }
        });
        return items;
    }

    /**
     * 准备list集合
     *
     * @memberof AppDashboardDesignService
     */
    public prepareList(datas: any[] = []): any[] {
        let list: any[] = [];
        datas.forEach((data: any) => {
            let item = list.find((item: any) => Object.is(data.type, item.type));
            if (!item) {
                item = {};
                Object.assign(item, {
                    type: data.type,
                    name: Object.is(data.type, 'app') ? "全局" : data.appName,
                    children: []
                });
                list.push(item);
            }
            this.prepareList2(item.children, data);
        })
        return list
    }

    /**
     * 准备list项集合
     *
     * @param {any[]} [children=[]]
     * @param {*} [data={}]
     * @memberof AppDashboardDesignService
     */
    public prepareList2(children: any[] = [], data: any = {}) {
        let item = children.find((item: any) => Object.is(data.groupCodeName, item.type));
        if (!item) {
            item = {};
            Object.assign(item, {
                type: data.groupCodeName,
                name: data.groupName,
                children: []
            });
            children.push(item);
        }
        let _item = item.children.find((a: any) => Object.is(a.portletCodeName, data.portletCodeName));
        if (!_item) {
            item.children.push(data);
        }
    }
}