/* tslint:disable */
/* eslint-disable */
/**
 * Defined Networking API
 * <br/> <br/>  This API enables automated administration of Defined Networking hosts, roles, logs, and more.  To authenticate, obtain an api key to use as a bearer token from your Defined Networking admin panel [API Keys page](https://admin.defined.net/settings/api-keys).  API keys must be given the appropriate permission scopes for every method and endpoint, as specified throughout this documentation.  Please [contact us](https://www.defined.net/contact?reason=support) for any questions or issues.  In the event of a token leak, please take care to [rotate the key](/guides/rotating-api-keys).  <div className=\'introduction-end\'></div> 
 *
 * The version of the OpenAPI document: 1.0.0
 * 
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */


import * as runtime from '../runtime';
import type {
  HostAndEnrollCodeCreate200Response,
  HostAndEnrollCodeCreate400Response,
  HostBlock200Response,
  HostCreate200Response,
  HostCreate400Response,
  HostCreateRequest,
  HostDelete200Response,
  HostEdit200Response,
  HostEditRequest,
  HostEnrollCodeCreate200Response,
  HostGet200Response,
  HostsList200Response,
} from '../models';
import {
    HostAndEnrollCodeCreate200ResponseFromJSON,
    HostAndEnrollCodeCreate200ResponseToJSON,
    HostAndEnrollCodeCreate400ResponseFromJSON,
    HostAndEnrollCodeCreate400ResponseToJSON,
    HostBlock200ResponseFromJSON,
    HostBlock200ResponseToJSON,
    HostCreate200ResponseFromJSON,
    HostCreate200ResponseToJSON,
    HostCreate400ResponseFromJSON,
    HostCreate400ResponseToJSON,
    HostCreateRequestFromJSON,
    HostCreateRequestToJSON,
    HostDelete200ResponseFromJSON,
    HostDelete200ResponseToJSON,
    HostEdit200ResponseFromJSON,
    HostEdit200ResponseToJSON,
    HostEditRequestFromJSON,
    HostEditRequestToJSON,
    HostEnrollCodeCreate200ResponseFromJSON,
    HostEnrollCodeCreate200ResponseToJSON,
    HostGet200ResponseFromJSON,
    HostGet200ResponseToJSON,
    HostsList200ResponseFromJSON,
    HostsList200ResponseToJSON,
} from '../models';

export interface HostAndEnrollCodeCreateRequest {
    hostCreateRequest: HostCreateRequest;
}

export interface HostBlockRequest {
    hostID: string;
}

export interface HostCreateOperationRequest {
    hostCreateRequest: HostCreateRequest;
}

export interface HostDeleteRequest {
    hostID: string;
}

export interface HostEditOperationRequest {
    hostID: string;
    hostEditRequest: HostEditRequest;
}

export interface HostEnrollCodeCreateRequest {
    hostID: string;
}

export interface HostGetRequest {
    hostID: string;
}

export interface HostsListRequest {
    includeCounts?: boolean;
    cursor?: string;
    pageSize?: number;
    filterIsBlocked?: boolean;
    filterIsLighthouse?: boolean;
    filterIsRelay?: boolean;
    filterMetadataLastSeenAt?: HostsListFilterMetadataLastSeenAtEnum;
    filterMetadataPlatform?: HostsListFilterMetadataPlatformEnum;
    filterMetadataUpdateAvailable?: boolean;
}

/**
 * 
 */
export class HostsApi extends runtime.BaseAPI {

    /**
     * Token scopes required: `hosts:create`, `hosts:enroll`  ### Request 
     * Create host & enrollment code
     */
    async hostAndEnrollCodeCreateRaw(requestParameters: HostAndEnrollCodeCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<HostAndEnrollCodeCreate200Response>> {
        if (requestParameters.hostCreateRequest === null || requestParameters.hostCreateRequest === undefined) {
            throw new runtime.RequiredError('hostCreateRequest','Required parameter requestParameters.hostCreateRequest was null or undefined when calling hostAndEnrollCodeCreate.');
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        if (this.configuration && this.configuration.accessToken) {
            const token = this.configuration.accessToken;
            const tokenString = await token("ApiToken", []);

            if (tokenString) {
                headerParameters["Authorization"] = `Bearer ${tokenString}`;
            }
        }
        const response = await this.request({
            path: `/v1/host-and-enrollment-code`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: HostCreateRequestToJSON(requestParameters.hostCreateRequest),
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => HostAndEnrollCodeCreate200ResponseFromJSON(jsonValue));
    }

    /**
     * Token scopes required: `hosts:create`, `hosts:enroll`  ### Request 
     * Create host & enrollment code
     */
    async hostAndEnrollCodeCreate(requestParameters: HostAndEnrollCodeCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<HostAndEnrollCodeCreate200Response> {
        const response = await this.hostAndEnrollCodeCreateRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Prevent a host from being able to interact with other nodes on your network.  See https://www.defined.net/blog/blocklisting/ for more details.  To unblock, re-enroll the host.  Token scope required: `hosts:block`  ### Request 
     * Block host
     */
    async hostBlockRaw(requestParameters: HostBlockRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<HostBlock200Response>> {
        if (requestParameters.hostID === null || requestParameters.hostID === undefined) {
            throw new runtime.RequiredError('hostID','Required parameter requestParameters.hostID was null or undefined when calling hostBlock.');
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.accessToken) {
            const token = this.configuration.accessToken;
            const tokenString = await token("ApiToken", []);

            if (tokenString) {
                headerParameters["Authorization"] = `Bearer ${tokenString}`;
            }
        }
        const response = await this.request({
            path: `/v1/hosts/{hostID}/block`.replace(`{${"hostID"}}`, encodeURIComponent(String(requestParameters.hostID))),
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => HostBlock200ResponseFromJSON(jsonValue));
    }

    /**
     * Prevent a host from being able to interact with other nodes on your network.  See https://www.defined.net/blog/blocklisting/ for more details.  To unblock, re-enroll the host.  Token scope required: `hosts:block`  ### Request 
     * Block host
     */
    async hostBlock(requestParameters: HostBlockRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<HostBlock200Response> {
        const response = await this.hostBlockRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Create a new host, lighthouse, or relay.  Token scope required: `hosts:create`  ### Request 
     * Create host
     */
    async hostCreateRaw(requestParameters: HostCreateOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<HostCreate200Response>> {
        if (requestParameters.hostCreateRequest === null || requestParameters.hostCreateRequest === undefined) {
            throw new runtime.RequiredError('hostCreateRequest','Required parameter requestParameters.hostCreateRequest was null or undefined when calling hostCreate.');
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        if (this.configuration && this.configuration.accessToken) {
            const token = this.configuration.accessToken;
            const tokenString = await token("ApiToken", []);

            if (tokenString) {
                headerParameters["Authorization"] = `Bearer ${tokenString}`;
            }
        }
        const response = await this.request({
            path: `/v1/hosts`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: HostCreateRequestToJSON(requestParameters.hostCreateRequest),
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => HostCreate200ResponseFromJSON(jsonValue));
    }

    /**
     * Create a new host, lighthouse, or relay.  Token scope required: `hosts:create`  ### Request 
     * Create host
     */
    async hostCreate(requestParameters: HostCreateOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<HostCreate200Response> {
        const response = await this.hostCreateRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Token scope required: `hosts:delete`  ### Request 
     * Delete host
     */
    async hostDeleteRaw(requestParameters: HostDeleteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<HostDelete200Response>> {
        if (requestParameters.hostID === null || requestParameters.hostID === undefined) {
            throw new runtime.RequiredError('hostID','Required parameter requestParameters.hostID was null or undefined when calling hostDelete.');
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.accessToken) {
            const token = this.configuration.accessToken;
            const tokenString = await token("ApiToken", []);

            if (tokenString) {
                headerParameters["Authorization"] = `Bearer ${tokenString}`;
            }
        }
        const response = await this.request({
            path: `/v1/hosts/{hostID}`.replace(`{${"hostID"}}`, encodeURIComponent(String(requestParameters.hostID))),
            method: 'DELETE',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => HostDelete200ResponseFromJSON(jsonValue));
    }

    /**
     * Token scope required: `hosts:delete`  ### Request 
     * Delete host
     */
    async hostDelete(requestParameters: HostDeleteRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<HostDelete200Response> {
        const response = await this.hostDeleteRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Token scope required: `hosts:update`  :::caution  Any properties not provided in the request will be reset to their default values.  :::  ### Request 
     * Edit host
     */
    async hostEditRaw(requestParameters: HostEditOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<HostEdit200Response>> {
        if (requestParameters.hostID === null || requestParameters.hostID === undefined) {
            throw new runtime.RequiredError('hostID','Required parameter requestParameters.hostID was null or undefined when calling hostEdit.');
        }

        if (requestParameters.hostEditRequest === null || requestParameters.hostEditRequest === undefined) {
            throw new runtime.RequiredError('hostEditRequest','Required parameter requestParameters.hostEditRequest was null or undefined when calling hostEdit.');
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        if (this.configuration && this.configuration.accessToken) {
            const token = this.configuration.accessToken;
            const tokenString = await token("ApiToken", []);

            if (tokenString) {
                headerParameters["Authorization"] = `Bearer ${tokenString}`;
            }
        }
        const response = await this.request({
            path: `/v1/hosts/{hostID}`.replace(`{${"hostID"}}`, encodeURIComponent(String(requestParameters.hostID))),
            method: 'PUT',
            headers: headerParameters,
            query: queryParameters,
            body: HostEditRequestToJSON(requestParameters.hostEditRequest),
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => HostEdit200ResponseFromJSON(jsonValue));
    }

    /**
     * Token scope required: `hosts:update`  :::caution  Any properties not provided in the request will be reset to their default values.  :::  ### Request 
     * Edit host
     */
    async hostEdit(requestParameters: HostEditOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<HostEdit200Response> {
        const response = await this.hostEditRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Obtain a code that can be used with the `dnclient enroll` command on a host, lighthouse, or relay to enroll it into your Managed Nebula network.  Token scope required: `hosts:enroll`  ### Request 
     * Create enrollment code
     */
    async hostEnrollCodeCreateRaw(requestParameters: HostEnrollCodeCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<HostEnrollCodeCreate200Response>> {
        if (requestParameters.hostID === null || requestParameters.hostID === undefined) {
            throw new runtime.RequiredError('hostID','Required parameter requestParameters.hostID was null or undefined when calling hostEnrollCodeCreate.');
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.accessToken) {
            const token = this.configuration.accessToken;
            const tokenString = await token("ApiToken", []);

            if (tokenString) {
                headerParameters["Authorization"] = `Bearer ${tokenString}`;
            }
        }
        const response = await this.request({
            path: `/v1/hosts/{hostID}/enrollment-code`.replace(`{${"hostID"}}`, encodeURIComponent(String(requestParameters.hostID))),
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => HostEnrollCodeCreate200ResponseFromJSON(jsonValue));
    }

    /**
     * Obtain a code that can be used with the `dnclient enroll` command on a host, lighthouse, or relay to enroll it into your Managed Nebula network.  Token scope required: `hosts:enroll`  ### Request 
     * Create enrollment code
     */
    async hostEnrollCodeCreate(requestParameters: HostEnrollCodeCreateRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<HostEnrollCodeCreate200Response> {
        const response = await this.hostEnrollCodeCreateRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Fetch information about a particular host, lighthouse, or relay.  Token scope required: `hosts:read`  ### Request 
     * Get host
     */
    async hostGetRaw(requestParameters: HostGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<HostGet200Response>> {
        if (requestParameters.hostID === null || requestParameters.hostID === undefined) {
            throw new runtime.RequiredError('hostID','Required parameter requestParameters.hostID was null or undefined when calling hostGet.');
        }

        const queryParameters: any = {};

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.accessToken) {
            const token = this.configuration.accessToken;
            const tokenString = await token("ApiToken", []);

            if (tokenString) {
                headerParameters["Authorization"] = `Bearer ${tokenString}`;
            }
        }
        const response = await this.request({
            path: `/v1/hosts/{hostID}`.replace(`{${"hostID"}}`, encodeURIComponent(String(requestParameters.hostID))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => HostGet200ResponseFromJSON(jsonValue));
    }

    /**
     * Fetch information about a particular host, lighthouse, or relay.  Token scope required: `hosts:read`  ### Request 
     * Get host
     */
    async hostGet(requestParameters: HostGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<HostGet200Response> {
        const response = await this.hostGetRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Get a paginated list of hosts, lighthouses, and relays.  Token scope required: `hosts:list`  ### Request 
     * List hosts
     */
    async hostsListRaw(requestParameters: HostsListRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<HostsList200Response>> {
        const queryParameters: any = {};

        if (requestParameters.includeCounts !== undefined) {
            queryParameters['includeCounts'] = requestParameters.includeCounts;
        }

        if (requestParameters.cursor !== undefined) {
            queryParameters['cursor'] = requestParameters.cursor;
        }

        if (requestParameters.pageSize !== undefined) {
            queryParameters['pageSize'] = requestParameters.pageSize;
        }

        if (requestParameters.filterIsBlocked !== undefined) {
            queryParameters['filter.isBlocked'] = requestParameters.filterIsBlocked;
        }

        if (requestParameters.filterIsLighthouse !== undefined) {
            queryParameters['filter.isLighthouse'] = requestParameters.filterIsLighthouse;
        }

        if (requestParameters.filterIsRelay !== undefined) {
            queryParameters['filter.isRelay'] = requestParameters.filterIsRelay;
        }

        if (requestParameters.filterMetadataLastSeenAt !== undefined) {
            queryParameters['filter.metadata.lastSeenAt'] = requestParameters.filterMetadataLastSeenAt;
        }

        if (requestParameters.filterMetadataPlatform !== undefined) {
            queryParameters['filter.metadata.platform'] = requestParameters.filterMetadataPlatform;
        }

        if (requestParameters.filterMetadataUpdateAvailable !== undefined) {
            queryParameters['filter.metadata.updateAvailable'] = requestParameters.filterMetadataUpdateAvailable;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.accessToken) {
            const token = this.configuration.accessToken;
            const tokenString = await token("ApiToken", []);

            if (tokenString) {
                headerParameters["Authorization"] = `Bearer ${tokenString}`;
            }
        }
        const response = await this.request({
            path: `/v1/hosts`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => HostsList200ResponseFromJSON(jsonValue));
    }

    /**
     * Get a paginated list of hosts, lighthouses, and relays.  Token scope required: `hosts:list`  ### Request 
     * List hosts
     */
    async hostsList(requestParameters: HostsListRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<HostsList200Response> {
        const response = await this.hostsListRaw(requestParameters, initOverrides);
        return await response.value();
    }

}

/**
 * @export
 */
export const HostsListFilterMetadataLastSeenAtEnum = {
    Null: 'null'
} as const;
export type HostsListFilterMetadataLastSeenAtEnum = typeof HostsListFilterMetadataLastSeenAtEnum[keyof typeof HostsListFilterMetadataLastSeenAtEnum];
/**
 * @export
 */
export const HostsListFilterMetadataPlatformEnum = {
    Mobile: 'mobile',
    Dnclient: 'dnclient',
    Null: 'null'
} as const;
export type HostsListFilterMetadataPlatformEnum = typeof HostsListFilterMetadataPlatformEnum[keyof typeof HostsListFilterMetadataPlatformEnum];