import WhoisInfo, { IWhoisInfo } from './WhoisInfo';

// This file was autogenerated. Please do not change.
// All changes will be overwrited on commit.
export interface IClientFindSubEntry {
    blocked_services?: string[];
    disallowed?: boolean;
    disallowed_rule?: string;
    filtering_enabled?: boolean;
    ids?: string[];
    name?: string;
    parental_enabled?: boolean;
    safebrowsing_enabled?: boolean;
    safesearch_enabled?: boolean;
    upstreams?: string[];
    use_global_blocked_services?: boolean;
    use_global_settings?: boolean;
    whois_info?: IWhoisInfo;
}

export default class ClientFindSubEntry {
    readonly _blocked_services: string[] | undefined;

    get blockedServices(): string[] | undefined {
        return this._blocked_services;
    }

    readonly _disallowed: boolean | undefined;

    /** */
    get disallowed(): boolean | undefined {
        return this._disallowed;
    }

    readonly _disallowed_rule: string | undefined;

    /** */
    get disallowedRule(): string | undefined {
        return this._disallowed_rule;
    }

    readonly _filtering_enabled: boolean | undefined;

    get filteringEnabled(): boolean | undefined {
        return this._filtering_enabled;
    }

    readonly _ids: string[] | undefined;

    /** */
    get ids(): string[] | undefined {
        return this._ids;
    }

    readonly _name: string | undefined;

    /**
     * Description: Name
     * Example: localhost
     */
    get name(): string | undefined {
        return this._name;
    }

    readonly _parental_enabled: boolean | undefined;

    get parentalEnabled(): boolean | undefined {
        return this._parental_enabled;
    }

    readonly _safebrowsing_enabled: boolean | undefined;

    get safebrowsingEnabled(): boolean | undefined {
        return this._safebrowsing_enabled;
    }

    readonly _safesearch_enabled: boolean | undefined;

    get safesearchEnabled(): boolean | undefined {
        return this._safesearch_enabled;
    }

    readonly _upstreams: string[] | undefined;

    get upstreams(): string[] | undefined {
        return this._upstreams;
    }

    readonly _use_global_blocked_services: boolean | undefined;

    get useGlobalBlockedServices(): boolean | undefined {
        return this._use_global_blocked_services;
    }

    readonly _use_global_settings: boolean | undefined;

    get useGlobalSettings(): boolean | undefined {
        return this._use_global_settings;
    }

    readonly _whois_info: WhoisInfo | undefined;

    get whoisInfo(): WhoisInfo | undefined {
        return this._whois_info;
    }

    constructor(props: IClientFindSubEntry) {
        if (props.blocked_services) {
            this._blocked_services = props.blocked_services;
        }
        if (typeof props.disallowed === 'boolean') {
            this._disallowed = props.disallowed;
        }
        if (typeof props.disallowed_rule === 'string') {
            this._disallowed_rule = props.disallowed_rule.trim();
        }
        if (typeof props.filtering_enabled === 'boolean') {
            this._filtering_enabled = props.filtering_enabled;
        }
        if (props.ids) {
            this._ids = props.ids;
        }
        if (typeof props.name === 'string') {
            this._name = props.name.trim();
        }
        if (typeof props.parental_enabled === 'boolean') {
            this._parental_enabled = props.parental_enabled;
        }
        if (typeof props.safebrowsing_enabled === 'boolean') {
            this._safebrowsing_enabled = props.safebrowsing_enabled;
        }
        if (typeof props.safesearch_enabled === 'boolean') {
            this._safesearch_enabled = props.safesearch_enabled;
        }
        if (props.upstreams) {
            this._upstreams = props.upstreams;
        }
        if (typeof props.use_global_blocked_services === 'boolean') {
            this._use_global_blocked_services = props.use_global_blocked_services;
        }
        if (typeof props.use_global_settings === 'boolean') {
            this._use_global_settings = props.use_global_settings;
        }
        if (props.whois_info) {
            this._whois_info = new WhoisInfo(props.whois_info);
        }
    }

    serialize(): IClientFindSubEntry {
        const data: IClientFindSubEntry = {
        };
        if (typeof this._blocked_services !== 'undefined') {
            data.blocked_services = this._blocked_services;
        }
        if (typeof this._disallowed !== 'undefined') {
            data.disallowed = this._disallowed;
        }
        if (typeof this._disallowed_rule !== 'undefined') {
            data.disallowed_rule = this._disallowed_rule;
        }
        if (typeof this._filtering_enabled !== 'undefined') {
            data.filtering_enabled = this._filtering_enabled;
        }
        if (typeof this._ids !== 'undefined') {
            data.ids = this._ids;
        }
        if (typeof this._name !== 'undefined') {
            data.name = this._name;
        }
        if (typeof this._parental_enabled !== 'undefined') {
            data.parental_enabled = this._parental_enabled;
        }
        if (typeof this._safebrowsing_enabled !== 'undefined') {
            data.safebrowsing_enabled = this._safebrowsing_enabled;
        }
        if (typeof this._safesearch_enabled !== 'undefined') {
            data.safesearch_enabled = this._safesearch_enabled;
        }
        if (typeof this._upstreams !== 'undefined') {
            data.upstreams = this._upstreams;
        }
        if (typeof this._use_global_blocked_services !== 'undefined') {
            data.use_global_blocked_services = this._use_global_blocked_services;
        }
        if (typeof this._use_global_settings !== 'undefined') {
            data.use_global_settings = this._use_global_settings;
        }
        if (typeof this._whois_info !== 'undefined') {
            data.whois_info = this._whois_info.serialize();
        }
        return data;
    }

    validate(): string[] {
        const validate = {
            name: !this._name ? true : typeof this._name === 'string' && !this._name ? true : this._name,
            ids: !this._ids ? true : this._ids.reduce((result, p) => result && typeof p === 'string', true),
            use_global_settings: !this._use_global_settings ? true : typeof this._use_global_settings === 'boolean',
            filtering_enabled: !this._filtering_enabled ? true : typeof this._filtering_enabled === 'boolean',
            parental_enabled: !this._parental_enabled ? true : typeof this._parental_enabled === 'boolean',
            safebrowsing_enabled: !this._safebrowsing_enabled ? true : typeof this._safebrowsing_enabled === 'boolean',
            safesearch_enabled: !this._safesearch_enabled ? true : typeof this._safesearch_enabled === 'boolean',
            use_global_blocked_services: !this._use_global_blocked_services ? true : typeof this._use_global_blocked_services === 'boolean',
            blocked_services: !this._blocked_services ? true : this._blocked_services.reduce((result, p) => result && typeof p === 'string', true),
            upstreams: !this._upstreams ? true : this._upstreams.reduce((result, p) => result && typeof p === 'string', true),
            whois_info: !this._whois_info ? true : this._whois_info.validate().length === 0,
            disallowed: !this._disallowed ? true : typeof this._disallowed === 'boolean',
            disallowed_rule: !this._disallowed_rule ? true : typeof this._disallowed_rule === 'string' && !this._disallowed_rule ? true : this._disallowed_rule,
        };
        const isError: string[] = [];
        Object.keys(validate).forEach((key) => {
            if (!(validate as any)[key]) {
                isError.push(key);
            }
        });
        return isError;
    }

    update(props: Partial<IClientFindSubEntry>): ClientFindSubEntry {
        return new ClientFindSubEntry({ ...this.serialize(), ...props });
    }
}
