import {
  Client as SoapClient,
  createClientAsync as soapCreateClientAsync,
  IExOptions as ISoapExOptions,
} from 'soap'
import { CreateCdnConfigurations } from './definitions/CreateCdnConfigurations'
import { CreateCdnConfigurationsResponse } from './definitions/CreateCdnConfigurationsResponse'
import { GetCdnConfigurationsByStatement } from './definitions/GetCdnConfigurationsByStatement'
import { GetCdnConfigurationsByStatementResponse } from './definitions/GetCdnConfigurationsByStatementResponse'
import { PerformCdnConfigurationAction } from './definitions/PerformCdnConfigurationAction'
import { PerformCdnConfigurationActionResponse } from './definitions/PerformCdnConfigurationActionResponse'
import { UpdateCdnConfigurations } from './definitions/UpdateCdnConfigurations'
import { UpdateCdnConfigurationsResponse } from './definitions/UpdateCdnConfigurationsResponse'
import { CdnConfigurationService } from './services/CdnConfigurationService'

export interface CdnConfigurationServiceClient extends SoapClient {
  CdnConfigurationService: CdnConfigurationService
  createCdnConfigurationsAsync(
    createCdnConfigurations: CreateCdnConfigurations,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: CreateCdnConfigurationsResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  getCdnConfigurationsByStatementAsync(
    getCdnConfigurationsByStatement: GetCdnConfigurationsByStatement,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: GetCdnConfigurationsByStatementResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  performCdnConfigurationActionAsync(
    performCdnConfigurationAction: PerformCdnConfigurationAction,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: PerformCdnConfigurationActionResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  updateCdnConfigurationsAsync(
    updateCdnConfigurations: UpdateCdnConfigurations,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: UpdateCdnConfigurationsResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
}

/** Create CdnConfigurationServiceClient */
export function createClientAsync(
  ...args: Parameters<typeof soapCreateClientAsync>
): Promise<CdnConfigurationServiceClient> {
  return soapCreateClientAsync(args[0], args[1], args[2]) as any
}
