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







export enum Gender {
    Male = 0,
    Female = 1,
}

export class Address implements IAddress {
    street!: string;
    city!: string;

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

    init(_data?: any) {
        if (_data) {
            this.street = _data["Street"];
            this.city = _data["City"];
        }
    }

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

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Street"] = this.street;
        data["City"] = this.city;
        return data;
    }
}

export interface IAddress {
    street: string;
    city: string;
}

export class MyClass implements IMyClass {
    firstName!: string;
    lastName!: string;
    readonly birthday!: Date;
    timeSpan!: string;
    timeSpanOrNull!: string | undefined;
    gender!: Gender;
    genderOrNull!: Gender | undefined;
    address!: Address;
    addressOrNull!: Address | undefined;
    array!: string[];
    dictionary!: { [key: string]: number; };

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

    init(_data?: any) {
        if (_data) {
            this.firstName = _data["FirstName"];
            this.lastName = _data["lastName"];
            (this as any).birthday = _data["Birthday"] ? new Date(_data["Birthday"].toString()) : undefined as any;
            this.timeSpan = _data["TimeSpan"];
            this.timeSpanOrNull = _data["TimeSpanOrNull"];
            this.gender = _data["Gender"];
            this.genderOrNull = _data["GenderOrNull"];
            this.address = _data["address"] ? Address.fromJS(_data["address"]) : new Address();
            this.addressOrNull = _data["AddressOrNull"] ? Address.fromJS(_data["AddressOrNull"]) : undefined as any;
            if (Array.isArray(_data["Array"])) {
                this.array = [] as any;
                for (let item of _data["Array"])
                    this.array!.push(item);
            }
            if (_data["Dictionary"]) {
                this.dictionary = {} as any;
                for (let key in _data["Dictionary"]) {
                    if (_data["Dictionary"].hasOwnProperty(key))
                        (this.dictionary as any)![key] = _data["Dictionary"][key];
                }
            }
        }
    }

    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 : {};
        data["FirstName"] = this.firstName;
        data["lastName"] = this.lastName;
        data["Birthday"] = this.birthday ? this.birthday.toISOString() : undefined as any;
        data["TimeSpan"] = this.timeSpan;
        data["TimeSpanOrNull"] = this.timeSpanOrNull;
        data["Gender"] = this.gender;
        data["GenderOrNull"] = this.genderOrNull;
        data["address"] = this.address ? this.address.toJSON() : undefined as any;
        data["AddressOrNull"] = this.addressOrNull ? this.addressOrNull.toJSON() : undefined as any;
        if (Array.isArray(this.array)) {
            data["Array"] = [];
            for (let item of this.array)
                data["Array"].push(item);
        }
        if (this.dictionary) {
            data["Dictionary"] = {};
            for (let key in this.dictionary) {
                if (this.dictionary.hasOwnProperty(key))
                    (data["Dictionary"] as any)[key] = (this.dictionary as any)[key];
            }
        }
        return data;
    }
}

export interface IMyClass {
    firstName: string;
    lastName: string;
    birthday: Date;
    timeSpan: string;
    timeSpanOrNull: string | undefined;
    gender: Gender;
    genderOrNull: Gender | undefined;
    address: Address;
    addressOrNull: Address | undefined;
    array: string[];
    dictionary: { [key: string]: number; };
}