import {
  Client as SoapClient,
  createClientAsync as soapCreateClientAsync,
  IExOptions as ISoapExOptions,
} from 'soap'
import { CreateTargetingPresets } from './definitions/CreateTargetingPresets'
import { CreateTargetingPresetsResponse } from './definitions/CreateTargetingPresetsResponse'
import { GetTargetingPresetsByStatement } from './definitions/GetTargetingPresetsByStatement'
import { GetTargetingPresetsByStatementResponse } from './definitions/GetTargetingPresetsByStatementResponse'
import { PerformTargetingPresetAction } from './definitions/PerformTargetingPresetAction'
import { PerformTargetingPresetActionResponse } from './definitions/PerformTargetingPresetActionResponse'
import { UpdateTargetingPresets } from './definitions/UpdateTargetingPresets'
import { UpdateTargetingPresetsResponse } from './definitions/UpdateTargetingPresetsResponse'
import { TargetingPresetService } from './services/TargetingPresetService'

export interface TargetingPresetServiceClient extends SoapClient {
  TargetingPresetService: TargetingPresetService
  createTargetingPresetsAsync(
    createTargetingPresets: CreateTargetingPresets,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: CreateTargetingPresetsResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  getTargetingPresetsByStatementAsync(
    getTargetingPresetsByStatement: GetTargetingPresetsByStatement,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: GetTargetingPresetsByStatementResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  performTargetingPresetActionAsync(
    performTargetingPresetAction: PerformTargetingPresetAction,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: PerformTargetingPresetActionResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  updateTargetingPresetsAsync(
    updateTargetingPresets: UpdateTargetingPresets,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: UpdateTargetingPresetsResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
}

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