import { DrawerController, DrawerItem, DrawerContainer } from '@ibiz/drawer-vue';
import { AppServiceBase } from '@ibizstudio-ex/runtime';
import { isArray, notNilEmpty } from 'qx-util';
import { Subject, Observable } from 'rxjs';

/**
 * 模态
 *
 * @export
 * @class AppPopup
 */
export class AppPopup {

    /**
     * store对象
     *
     * @protected
     * @memberof AppPopup
     */
    protected store: any;

    /**
     * i18n对象
     *
     * @protected
     * @memberof AppPopup
     */
    protected i18n: any;

    /**
     * 路由对象
     *
     * @protected
     * @memberof AppPopup
     */
    protected router: any;

    /**
     * 飘窗实例
     *
     * @protected
     * @type {DrawerItem[]}
     * @memberof AppPopup
     */
    protected drawerList: DrawerItem[] = [];

    /**
     * Creates an instance of AppPopup.
     * @memberof AppPopup
     */
    constructor() {
        this.initData();
    }

    /**
     * 初始化基础数据
     *
     * @memberof AppPopup
     */
    protected initData(): void {
        if (!this.store) {
            const appService = AppServiceBase.getInstance();
            this.store = appService.getAppStore();
            this.i18n = appService.getI18n();
            this.router = appService.getRouter();
        }
    }


    /**
     * 添加飘窗实例
     *
     * @protected
     * @memberof AppPopup
     */
    protected addDrawerItem(item: DrawerItem): void {
        this.drawerList.push(item);
        this.store.commit('pushDrawerList', item);
        DrawerController.exp.setItems(this.drawerList);
    }

    /**
     * 移除指定飘窗实例
     *
     * @protected
     * @memberof AppPopup
     */
    protected removeDrawerItem(id: string): void {
        const i = this.drawerList.findIndex(item => item.id === id);
        this.drawerList.splice(i, 1);
        this.store.commit('removeDrawerList', i);
        DrawerController.exp.setItems(this.drawerList);
    }

    /**
     * 顶部抽屉模式打开视图
     *
     * @param {{ viewname: string, title: string, width?: number, height?: number }} view 视图
     * @param {*} [viewParam={}] 视图参数
     * @param {any[]} deResParameters 关系实体参数对象
     * @param {any[]} parameters 当前应用视图参数对象
     * @param {any[]} args 多项数据
     * @param {*} [data={}] 行为参数
     * @returns {Observable<any>}
     * @memberof AppTopDrawerContainer
     */
    openDrawer(
        view: { viewname: string; title: string; width?: number; height?: number; placement?: string },
        dynamicProps: any = {},
        staticProps: any = {},
    ): Observable<any> {
        this.initData();
        const subject: Subject<any> = new Subject();
        this.open(view, dynamicProps, staticProps).then((data: any) => {
            subject.next(data);
            subject.complete();
            subject.unsubscribe();
        });
        return subject.asObservable();
    }

    /**
     * 打开上飘窗
     *
     * @protected
     * @param {{ viewname: string; title: string; width?: number; height?: number; placement?: string }} view
     * @param {*} [dynamicProps={}]
     * @param {*} [staticProps={}]
     * @return {*}  {Promise<any>}
     */
    protected async open(
        view: { viewname: string; title: string; width?: number; height?: number; placement?: string },
        dynamicProps: any = {},
        staticProps: any = {},
    ): Promise<any> {
        const obj = dynamicProps.navdatas[0];
        const srfmajortext = obj ? obj.srfmajortext : '';
        const viewParamData = dynamicProps.viewparam ?  JSON.parse(dynamicProps.viewparam) : undefined;
        const id = viewParamData?.srfparentkey ? viewParamData.srfparentkey : undefined;
        // 计算展示层级
        this.store.commit('upZIndex');
        const zIndex = this.store.getters.getZIndex();
        // 基本输入参数补充
        Object.assign(staticProps, { viewDefaultUsage: false, noViewCaption: true });
        const caption = srfmajortext ? srfmajortext : view.title;
        const ref = await DrawerController.present({
            id,
            caption,
            overlayIndex: zIndex,
            component: DrawerContainer as any,
            componentProps: { store: this.store, i18n: this.i18n,router:this.router, propsData: { dynamicProps, staticProps } },
        });
        // 缓存打卡界面信息
        const self: DrawerItem = {
            id,
            ref,
            caption,
        };
        const i = this.drawerList.findIndex(item => item.id === id);
        if (i === -1) {
            this.addDrawerItem(self);
            // 侦听关闭行为
            const result = await ref.onDidDismiss();
            this.removeDrawerItem(self.id);
            this.store.commit('downZIndex');
            return { ret: notNilEmpty(result) ? 'OK' : 'NONE', datas: isArray(result) ? result : [result] };
        }
    }
}

// 模态服务控制器实例
export const appPopup: AppPopup = new AppPopup();
