﻿//----------------------
// <auto-generated>
// </auto-generated>
//----------------------







export class Person implements IPerson {
    id!: string;
    /** Gets or sets the first name. */
    firstName!: string;
    /** Gets or sets the last name. */
    lastName!: string;
    dateOfBirth!: Date;
    weight!: number;
    height!: number;
    age!: number;
    averageSleepTime!: string;
    children!: Person[];

    protected _discriminator: string;

    constructor(data?: IPerson) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (this as any)[property] = (data as any)[property];
            }
        }
        if (!data) {
            this.children = [];
        }
        this._discriminator = "Person";
    }

    init(_data?: any) {
        if (_data) {
            this.id = _data["Id"];
            this.firstName = _data["FirstName"];
            this.lastName = _data["LastName"];
            this.dateOfBirth = _data["DateOfBirth"] ? new Date(_data["DateOfBirth"].toString()) : undefined as any;
            this.weight = _data["Weight"];
            this.height = _data["Height"];
            this.age = _data["Age"];
            this.averageSleepTime = _data["AverageSleepTime"];
            if (Array.isArray(_data["Children"])) {
                this.children = [] as any;
                for (let item of _data["Children"])
                    this.children!.push(Person.fromJS(item));
            }
        }
    }

    static fromJS(data: any): Person {
        data = typeof data === 'object' ? data : {};
        let result = new Person();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["discriminator"] = this._discriminator;
        data["Id"] = this.id;
        data["FirstName"] = this.firstName;
        data["LastName"] = this.lastName;
        data["DateOfBirth"] = this.dateOfBirth ? this.dateOfBirth.toISOString() : undefined as any;
        data["Weight"] = this.weight;
        data["Height"] = this.height;
        data["Age"] = this.age;
        data["AverageSleepTime"] = this.averageSleepTime;
        if (Array.isArray(this.children)) {
            data["Children"] = [];
            for (let item of this.children)
                data["Children"].push(item ? item.toJSON() : undefined as any);
        }
        return data;
    }
}

export interface IPerson {
    id: string;
    /** Gets or sets the first name. */
    firstName: string;
    /** Gets or sets the last name. */
    lastName: string;
    dateOfBirth: Date;
    weight: number;
    height: number;
    age: number;
    averageSleepTime: string;
    children: Person[];
}

export class MyClass implements IMyClass {
    foo!: Person;

    [key: string]: any;

    constructor(data?: IMyClass) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (this as any)[property] = (data as any)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            for (var property in _data) {
                if (_data.hasOwnProperty(property))
                    this[property] = _data[property];
            }
            this.foo = _data["foo"] ? Person.fromJS(_data["foo"]) : undefined as any;
        }
    }

    static fromJS(data: any): MyClass {
        data = typeof data === 'object' ? data : {};
        let result = new MyClass();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        for (var property in this) {
            if (this.hasOwnProperty(property))
                data[property] = this[property];
        }
        data["foo"] = this.foo ? this.foo.toJSON() : undefined as any;
        return data;
    }
}

export interface IMyClass {
    foo: Person;

    [key: string]: any;
}