import { TDDOParams } from "types";
import { Export } from "./Export";
import { InheritClass } from "./InheritClass";
import { logger } from "./Logger";
import { ObjectName } from "./ObjectName";

/**
 * Dynamic Data Objects Class
 * Usage:
 * Class('TestDDO',{
 *    data: {},
 *    _new_ (){
 *        this.ddo = New(DDO,{
 *            instance:this,
 *            name:'data',
 *            value:{},
 *            fget (value){
 *                logger.debug('returned value '+ value );
 *            }
 *            })
 *    }
 * });
 *
 */
export class DDO extends InheritClass {
    constructor({
        instance,
        name,
        fget,
        fset,
        value
    }:TDDOParams) {
        super({
            instance,
            name,
            fget,
            fset,
            value
        });
        this._new_({
            instance,
            name,
            fget,
            fset,
            value
        });

    }

    _new_({
        instance,
        name,
        fget,
        fset
    }:TDDOParams):void {
        const ddoInstance = this;
        var name = (typeof name === "undefined") ? (ObjectName(ddoInstance)) : (name);

        Object.defineProperty(instance, name, {
            set(val) {
                const _value = val;
                logger.debug("value changed " + name);
                let ret;
                if (typeof fset !== "undefined" && typeof fset === "function") {
                    ret = fset(_value);
                } else {
                    ret = _value;
                }
                instance["_" + name] = ret;
                
            },
            get():any {
                const _value = instance["_" + name];
                logger.debug("returning value " + name);
                const is_ddo =  (v:any):any => {
                    if (typeof v === "object" && Object.hasOwn(v, "value")) {
                        return v.value;
                    }
                    return v;
                };
                let ret;
                if (typeof fget !== "undefined" && typeof fget === "function") {
                    ret = fget(is_ddo(_value));
                } else {
                    ret = is_ddo(_value);
                }
                return ret;
            }
        });
    }

}
Export(DDO);
