// 用于将属性名添加到对应类的可保存属性数组中的函数
export function save(target: any, keyName: string) {
    // 获取目标类对应的可保存属性数组
    let arr = getOrCreateClassArray(target.constructor);
    // 将属性名添加到数组中
    arr.push(keyName);
}

// 获取目标类对应的可保存属性数组，如果不存在则创建一个新的空数组并设置到classMap中
function getOrCreateClassArray(constructor: Function): any[] {
    let arr = model_base.classMap.get(constructor);
    if (arr === undefined) {
        arr = [];
        model_base.classMap.set(constructor, arr);
    }
    return arr;
}

export default class model_base {
    public static classMap: Map<Function, any[]> = new Map();

    // 获取当前对象可保存属性的数据并返回一个包含这些数据的对象的函数
    public getData(): object {
        let data = {};
        // 获取当前类的可保存属性数组
        let savepars = this.getSaveParamsForClass(this.constructor);
        // 遍历可保存属性数组，将对应属性的值添加到返回数据对象中
        for (let i = 0; i < savepars.length; ++i) {
            data[savepars[i]] = this[savepars[i]];
        }
        return data;
    }

    // 根据传入的数据设置当前对象可保存属性的值的函数
    public setData(data: any) {
        // 如果传入数据为空，直接返回
        if (!data) return;
        // 获取当前类的可保存属性数组
        let savepars = this.getSaveParamsForClass(this.constructor);
        // 遍历可保存属性数组，根据数据设置对应属性的值
        for (let i = 0; i < savepars.length; ++i) {
            const element = data[savepars[i]];
            if (element != null || element != undefined) {
                if (Object.prototype.toString.call(element) == "[object Object]") {
                    // 如果元素是对象，遍历对象的属性并设置到当前对象的对应属性中
                    for (const key in element) {
                        this[savepars[i]][key] = element[key];
                    }
                } else {
                    // 如果元素不是对象，直接设置到当前对象的对应属性中
                    this[savepars[i]] = element;
                }
            }
        }
    }

    // 获取指定类的可保存属性数组的函数
    private getSaveParamsForClass(constructor: Function): any[] {
        return model_base.classMap.get(constructor) || [];
    }
}