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







export class Person implements IPerson {
    firstName!: string | undefined;
    lastName!: string | undefined;

    constructor(data?: IPerson) {
        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.firstName = _data["FirstName"];
            this.lastName = _data["LastName"];
        }
    }

    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["FirstName"] = this.firstName;
        data["LastName"] = this.lastName;
        return data;
    }
}

export interface IPerson {
    firstName: string | undefined;
    lastName: string | undefined;
}

export class Student extends Person implements IStudent {
    study!: string | undefined;

    constructor(data?: IStudent) {
        super(data);
    }

    override init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.study = _data["Study"];
        }
    }

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

    override toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Study"] = this.study;
        super.toJSON(data);
        return data;
    }
}

export interface IStudent extends IPerson {
    study: string | undefined;
}

export class MyClass implements IMyClass {
    name!: string | undefined;
    dateOfBirth!: Date;
    primitiveArray!: number[] | undefined;
    primitiveDictionary!: { [key: string]: number; } | undefined;
    dateArray!: Date[] | undefined;
    dateDictionary!: { [key: string]: Date; } | undefined;
    reference!: Student | undefined;
    array!: Student[] | undefined;
    dictionary!: { [key: string]: Student; } | undefined;

    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.name = "foo";
        }
    }

    init(_data?: any) {
        if (_data) {
            this.name = _data["Name"] !== undefined ? _data["Name"] : "foo";
            this.dateOfBirth = _data["DateOfBirth"] ? new Date(_data["DateOfBirth"].toString()) : undefined as any;
            if (Array.isArray(_data["PrimitiveArray"])) {
                this.primitiveArray = [] as any;
                for (let item of _data["PrimitiveArray"])
                    this.primitiveArray!.push(item);
            }
            if (_data["PrimitiveDictionary"]) {
                this.primitiveDictionary = {} as any;
                for (let key in _data["PrimitiveDictionary"]) {
                    if (_data["PrimitiveDictionary"].hasOwnProperty(key))
                        (this.primitiveDictionary as any)![key] = _data["PrimitiveDictionary"][key];
                }
            }
            if (Array.isArray(_data["DateArray"])) {
                this.dateArray = [] as any;
                for (let item of _data["DateArray"])
                    this.dateArray!.push(new Date(item));
            }
            if (_data["DateDictionary"]) {
                this.dateDictionary = {} as any;
                for (let key in _data["DateDictionary"]) {
                    if (_data["DateDictionary"].hasOwnProperty(key))
                        (this.dateDictionary as any)![key] = _data["DateDictionary"][key] ? new Date(_data["DateDictionary"][key].toString()) : undefined as any;
                }
            }
            this.reference = _data["Reference"] ? Student.fromJS(_data["Reference"]) : undefined as any;
            if (Array.isArray(_data["Array"])) {
                this.array = [] as any;
                for (let item of _data["Array"])
                    this.array!.push(Student.fromJS(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] ? Student.fromJS(_data["Dictionary"][key]) : new Student();
                }
            }
        }
    }

    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["Name"] = this.name;
        data["DateOfBirth"] = this.dateOfBirth ? this.dateOfBirth.toISOString() : undefined as any;
        if (Array.isArray(this.primitiveArray)) {
            data["PrimitiveArray"] = [];
            for (let item of this.primitiveArray)
                data["PrimitiveArray"].push(item);
        }
        if (this.primitiveDictionary) {
            data["PrimitiveDictionary"] = {};
            for (let key in this.primitiveDictionary) {
                if (this.primitiveDictionary.hasOwnProperty(key))
                    (data["PrimitiveDictionary"] as any)[key] = (this.primitiveDictionary as any)[key];
            }
        }
        if (Array.isArray(this.dateArray)) {
            data["DateArray"] = [];
            for (let item of this.dateArray)
                data["DateArray"].push(item.toISOString());
        }
        if (this.dateDictionary) {
            data["DateDictionary"] = {};
            for (let key in this.dateDictionary) {
                if (this.dateDictionary.hasOwnProperty(key))
                    (data["DateDictionary"] as any)[key] = this.dateDictionary[key] ? this.dateDictionary[key].toISOString() : undefined as any;
            }
        }
        data["Reference"] = this.reference ? this.reference.toJSON() : undefined as any;
        if (Array.isArray(this.array)) {
            data["Array"] = [];
            for (let item of this.array)
                data["Array"].push(item ? item.toJSON() : undefined as any);
        }
        if (this.dictionary) {
            data["Dictionary"] = {};
            for (let key in this.dictionary) {
                if (this.dictionary.hasOwnProperty(key))
                    (data["Dictionary"] as any)[key] = this.dictionary[key] ? this.dictionary[key].toJSON() : undefined as any;
            }
        }
        return data;
    }
}

export interface IMyClass {
    name: string | undefined;
    dateOfBirth: Date;
    primitiveArray: number[] | undefined;
    primitiveDictionary: { [key: string]: number; } | undefined;
    dateArray: Date[] | undefined;
    dateDictionary: { [key: string]: Date; } | undefined;
    reference: Student | undefined;
    array: Student[] | undefined;
    dictionary: { [key: string]: Student; } | undefined;
}