import { message } from 'ant-design-vue';
import { PSSysViewPanel, IBzEvent, PSSysViewPanelService } from '@ibizstudio/api';
import { DesignDefaultController } from '@ibizstudio/dynamic-design';
import { mergeRight } from 'ramda';
import { getControl } from '@ibiz/dynamic-model-api';
/**
 * 设计控制器
 *
 * @export
 * @class PanelDesignController
 * @extends {DesignController}
 */
export class PanelDesignController extends DesignDefaultController {
    constructor() {
        super(...arguments);
        /**
         * 主数据
         *
         * @type {*}
         * @memberof PanelDesignController
         */
        this.masterData = null;
        /**
         * 布局状态事件
         *
         * @type {IbzEvent<{layout: number}>}
         * @memberof PanelDesignController
         */
        this.evt = new IBzEvent();
        /**
         * 加载行为
         *
         * @type {string}
         * @memberof PanelDesignController
         */
        this.loadAction = 'Get';
        /**
         * 修改行为
         *
         * @type {string}
         * @memberof PanelDesignController
         */
        this.updateAction = 'Update';
    }
    renderChildItem(h, ctx, item, pData) {
        const key = item.srfkey || 'tempkey';
        switch (item.itemtype) {
            case 'FIELD':
                return <ibz-design-panel-field-item key={key} ctx={ctx} data={item} parentData={pData}/>;
            case 'CONTAINER':
                return <ibz-design-panel-container key={key} ctx={ctx} data={item} parentData={pData}/>;
            case 'TABPANEL':
                return (<ibz-design-panel-tab-panel key={key} ctx={ctx} data={item} parentData={pData} itemType='TABPAGE'/>);
            default:
                return <ibz-design-panel-other key={key} ctx={ctx} data={item} parentData={pData}/>;
        }
    }
    /**
     * 初始化核心服务
     *
     * @param {IPSDEEditForm} controlModel 部件模型对象
     * @memberof PanelDesignController
     */
    async initAction() {
        const controlModel = getControl(this.viewModel, 'form');
        const getAction = await controlModel.getGetPSControlAction().fill();
        const updateAction = await controlModel.getUpdatePSControlAction().fill();
        if (getAction) {
            this.loadAction = getAction.actionName;
        }
        if (updateAction) {
            this.updateAction = updateAction.actionName;
        }
    }
    /**
     * 加载面板数据
     *
     * @param {IParams} [params={}]
     * @return {*}  {(Promise<IPSSysViewPanel | null>)}
     * @memberof PanelDesignController
     */
    async load(params = {}) {
        const { ctrl, context, evt } = this.ctx;
        const s = PSSysViewPanelService.getInstance();
        const res = await s[this.loadAction](mergeRight(context, params));
        if (res.ok) {
            const data = new PSSysViewPanel(res.data);
            this.evt.emit('layoutState', data.viewlayoutflag);
            context.psdataentity = data.psdeid;
            context.pssysviewpanel = data.pssysviewpanelid;
            ctrl.select.set(data);
            this.setMainInfo(data);
            evt.emit('loaded');
            if (data) {
                ctrl.masterData = data;
                const entityService = await ___ibz___.gs.getPSDataEntityService();
                const res = await entityService.Get(Object.assign(Object.assign({}, this.ctx.context), { psdataentity: ctrl.masterData.psdeid }));
                if (res.ok) {
                    this.ctx.context.psdataentity = res.data.psdataentityid;
                    await entityService.selectLocal(this.ctx.context, res.data);
                }
            }
        }
        else {
            message.error('面板内容加载失败: ' + res.statusText);
        }
        return null;
    }
    /**
     * 保存
     *
     * @return {*}  {Promise<any>}
     * @memberof PanelDesignController
     */
    save() {
        return this.service[this.updateAction](this.ctx.context, null);
    }
}
