import { Props } from '@motajs/render';
import { IGameUI, IUIInstance, UIComponent, UIProps } from './shared';
import { markRaw, mergeProps } from 'vue';

export class UIInstance<C extends UIComponent> implements IUIInstance<C> {
    private static counter: number = 0;

    readonly key: number = UIInstance.counter++;
    readonly ui: IGameUI<C>;
    hidden: boolean = false;

    constructor(
        ui: IGameUI<C>,
        public vBind: UIProps<C>,
        public readonly alwaysShow: boolean = false
    ) {
        this.ui = markRaw(ui);
    }

    /**
     * 设置这个 UI 实例的响应式数据的值
     * @param data 要设置的值
     * @param merge 是将传入的值与原先的值合并(true),还是将当前值覆盖掉原先的值(false),默认合并
     */
    setVBind(data: Partial<Props<C>>, merge: boolean = true) {
        if (merge) {
            this.vBind = mergeProps(this.vBind, data) as UIProps<C>;
        } else {
            this.vBind = data as UIProps<C>;
        }
    }

    hide(): void {
        this.hidden = true;
    }

    show(): void {
        this.hidden = false;
    }
}