import { IValue, IObject } from '@leafer/interface'
import { defineKey, decorateLeafAttr, attr, createDescriptor } from '@leafer/core'

import { ICanvas, IUI, IApp } from '@leafer-ui/interface'


export function effectType(defaultValue?: IValue) {
    return decorateLeafAttr(defaultValue, (key: string) => attr({
        set(value: IValue) {
            this.__setAttr(key, value)
            if (value) (this as IUI).__.__useEffect = true
            const layout = this.__layout
            layout.renderChanged || layout.renderChange()
            layout.surfaceChange()

        }
    }))
}

export function resizeType(defaultValue?: IValue) {
    return decorateLeafAttr(defaultValue, (key: string) => attr({
        set(value: IValue) {
            this.__setAttr(key, value)
            this.__layout.boxChanged || this.__layout.boxChange();
            (this as ICanvas).__updateSize()
        }
    }))
}

export function zoomLayerType() {
    return (target: IUI, key: string) => {
        const privateKey = '_' + key
        defineKey(target, key, {
            set(value: IUI) { if (this.isLeafer) (this as IObject)[privateKey] = value },
            get() {
                return this.isApp
                    ? (this as IApp).tree.zoomLayer
                    : (this.isLeafer ? ((this as IObject)[privateKey] || this) : this.leafer && this.leafer.zoomLayer)
            }
        })
    }
}

export function createAttr(defaultValue?: IValue) {
    return (target: IUI, key: string) => {
        defineKey(target, key, createDescriptor(key, defaultValue))
    }
}