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







export class Person implements IPerson {
    skills!: { [key: string]: SkillLevel; };

    [key: string]: any;

    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];
            }
        }
        this._discriminator = "Person";
    }

    init(_data?: any) {
        if (_data) {
            for (var property in _data) {
                if (_data.hasOwnProperty(property))
                    this[property] = _data[property];
            }
            if (_data["Skills"]) {
                this.skills = {} as any;
                for (let key in _data["Skills"]) {
                    if (_data["Skills"].hasOwnProperty(key))
                        (this.skills as any)![key] = _data["Skills"][key];
                }
            }
        }
    }

    static fromJS(data: any): Person {
        data = typeof data === 'object' ? data : {};
        if (data["discriminator"] === "Teacher") {
            let result = new Teacher();
            result.init(data);
            return result;
        }
        let result = new Person();
        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["discriminator"] = this._discriminator;
        if (this.skills) {
            data["Skills"] = {};
            for (let key in this.skills) {
                if (this.skills.hasOwnProperty(key))
                    (data["Skills"] as any)[key] = (this.skills as any)[key];
            }
        }
        return data;
    }
}

export interface IPerson {
    skills: { [key: string]: SkillLevel; };

    [key: string]: any;
}

export enum SkillLevel {
    Low = 0,
    Medium = 1,
    Height = 2,
}

export class Teacher extends Person implements ITeacher {
    course!: string;
    skillLevel!: SkillLevel;

    [key: string]: any;

    constructor(data?: ITeacher) {
        super(data);
        if (!data) {
            this.skillLevel = SkillLevel.Medium;
        }
        this._discriminator = "Teacher";
    }

    override init(_data?: any) {
        super.init(_data);
        if (_data) {
            for (var property in _data) {
                if (_data.hasOwnProperty(property))
                    this[property] = _data[property];
            }
            this.course = _data["Course"];
            this.skillLevel = _data["SkillLevel"] !== undefined ? _data["SkillLevel"] : SkillLevel.Medium;
        }
    }

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

    override toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        for (var property in this) {
            if (this.hasOwnProperty(property))
                data[property] = this[property];
        }
        data["Course"] = this.course;
        data["SkillLevel"] = this.skillLevel;
        super.toJSON(data);
        return data;
    }
}

export interface ITeacher extends IPerson {
    course: string;
    skillLevel: SkillLevel;

    [key: string]: any;
}

export class Anonymous implements IAnonymous {
    foo!: Teacher;

    [key: string]: any;

    constructor(data?: IAnonymous) {
        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"] ? Teacher.fromJS(_data["foo"]) : undefined as any;
        }
    }

    static fromJS(data: any): Anonymous {
        data = typeof data === 'object' ? data : {};
        let result = new Anonymous();
        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 IAnonymous {
    foo: Teacher;

    [key: string]: any;
}