/**
 * This file is generated by the SwaggerTSGenerator.
 * Do not edit.
*/
/* tslint:disable */

export abstract class BaseModel {
    /**
     * set the values.
     * @param values Can be used to set a webapi response to this newly constructed model
    */
    abstract setValues(values: any): void;

    /**
     * fill array property in model.
     * for complex types, type must be defined.
     * for complex types with subtypes, subTypeFactoryFn must be filled in.
     */
    protected fillModelArray<T>(
        object: BaseModel,
        key: string,
        values: Array<T>,
        type = undefined,
        subTypeFactoryFn: Function = undefined
    ): void {
        if (values) {
            object[key] = new Array<T>();
            for(let value of values) {
                if (type) {
                    if (this.isSubType(value)) {
                        const subTypeInstance = subTypeFactoryFn(value);
                        object[key].push(subTypeInstance);
                    } else {
                        object[key].push(new type(value));
                    }
                } else {
                    object[key].push(value);
                }
            }
        }
    }

    protected isSubType(value: any): boolean {
        return value.hasOwnProperty('{{{subTypePropertyName}}}') && value.{{{subTypePropertyName}}};
    }

    protected getValue<T>(values: any, propertyName: string): T {
        return values.hasOwnProperty(propertyName) ? values[propertyName] : this[propertyName];
    }
}
