import {
  Client as SoapClient,
  createClientAsync as soapCreateClientAsync,
  IExOptions as ISoapExOptions,
} from 'soap'
import { CreateCustomTargetingKeys } from './definitions/CreateCustomTargetingKeys'
import { CreateCustomTargetingKeysResponse } from './definitions/CreateCustomTargetingKeysResponse'
import { CreateCustomTargetingValues } from './definitions/CreateCustomTargetingValues'
import { CreateCustomTargetingValuesResponse } from './definitions/CreateCustomTargetingValuesResponse'
import { GetCustomTargetingKeysByStatement } from './definitions/GetCustomTargetingKeysByStatement'
import { GetCustomTargetingKeysByStatementResponse } from './definitions/GetCustomTargetingKeysByStatementResponse'
import { GetCustomTargetingValuesByStatement } from './definitions/GetCustomTargetingValuesByStatement'
import { GetCustomTargetingValuesByStatementResponse } from './definitions/GetCustomTargetingValuesByStatementResponse'
import { PerformCustomTargetingKeyAction } from './definitions/PerformCustomTargetingKeyAction'
import { PerformCustomTargetingKeyActionResponse } from './definitions/PerformCustomTargetingKeyActionResponse'
import { PerformCustomTargetingValueAction } from './definitions/PerformCustomTargetingValueAction'
import { PerformCustomTargetingValueActionResponse } from './definitions/PerformCustomTargetingValueActionResponse'
import { UpdateCustomTargetingKeys } from './definitions/UpdateCustomTargetingKeys'
import { UpdateCustomTargetingKeysResponse } from './definitions/UpdateCustomTargetingKeysResponse'
import { UpdateCustomTargetingValues } from './definitions/UpdateCustomTargetingValues'
import { UpdateCustomTargetingValuesResponse } from './definitions/UpdateCustomTargetingValuesResponse'
import { CustomTargetingService } from './services/CustomTargetingService'

export interface CustomTargetingServiceClient extends SoapClient {
  CustomTargetingService: CustomTargetingService
  createCustomTargetingKeysAsync(
    createCustomTargetingKeys: CreateCustomTargetingKeys,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: CreateCustomTargetingKeysResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  createCustomTargetingValuesAsync(
    createCustomTargetingValues: CreateCustomTargetingValues,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: CreateCustomTargetingValuesResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  getCustomTargetingKeysByStatementAsync(
    getCustomTargetingKeysByStatement: GetCustomTargetingKeysByStatement,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: GetCustomTargetingKeysByStatementResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  getCustomTargetingValuesByStatementAsync(
    getCustomTargetingValuesByStatement: GetCustomTargetingValuesByStatement,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: GetCustomTargetingValuesByStatementResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  performCustomTargetingKeyActionAsync(
    performCustomTargetingKeyAction: PerformCustomTargetingKeyAction,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: PerformCustomTargetingKeyActionResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  performCustomTargetingValueActionAsync(
    performCustomTargetingValueAction: PerformCustomTargetingValueAction,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: PerformCustomTargetingValueActionResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  updateCustomTargetingKeysAsync(
    updateCustomTargetingKeys: UpdateCustomTargetingKeys,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: UpdateCustomTargetingKeysResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  updateCustomTargetingValuesAsync(
    updateCustomTargetingValues: UpdateCustomTargetingValues,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: UpdateCustomTargetingValuesResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
}

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