import {
  Client as SoapClient,
  createClientAsync as soapCreateClientAsync,
  IExOptions as ISoapExOptions,
} from 'soap'
import { CreateLiveStreamEvents } from './definitions/CreateLiveStreamEvents'
import { CreateLiveStreamEventsResponse } from './definitions/CreateLiveStreamEventsResponse'
import { CreateSlates } from './definitions/CreateSlates'
import { CreateSlatesResponse } from './definitions/CreateSlatesResponse'
import { GetLiveStreamEventsByStatement } from './definitions/GetLiveStreamEventsByStatement'
import { GetLiveStreamEventsByStatementResponse } from './definitions/GetLiveStreamEventsByStatementResponse'
import { GetSlatesByStatement } from './definitions/GetSlatesByStatement'
import { GetSlatesByStatementResponse } from './definitions/GetSlatesByStatementResponse'
import { PerformLiveStreamEventAction } from './definitions/PerformLiveStreamEventAction'
import { PerformLiveStreamEventActionResponse } from './definitions/PerformLiveStreamEventActionResponse'
import { PerformSlateAction } from './definitions/PerformSlateAction'
import { PerformSlateActionResponse } from './definitions/PerformSlateActionResponse'
import { UpdateLiveStreamEvents } from './definitions/UpdateLiveStreamEvents'
import { UpdateLiveStreamEventsResponse } from './definitions/UpdateLiveStreamEventsResponse'
import { UpdateSlates } from './definitions/UpdateSlates'
import { UpdateSlatesResponse } from './definitions/UpdateSlatesResponse'
import { LiveStreamEventService } from './services/LiveStreamEventService'

export interface LiveStreamEventServiceClient extends SoapClient {
  LiveStreamEventService: LiveStreamEventService
  createLiveStreamEventsAsync(
    createLiveStreamEvents: CreateLiveStreamEvents,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: CreateLiveStreamEventsResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  createSlatesAsync(
    createSlates: CreateSlates,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: CreateSlatesResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  getLiveStreamEventsByStatementAsync(
    getLiveStreamEventsByStatement: GetLiveStreamEventsByStatement,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: GetLiveStreamEventsByStatementResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  getSlatesByStatementAsync(
    getSlatesByStatement: GetSlatesByStatement,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: GetSlatesByStatementResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  performLiveStreamEventActionAsync(
    performLiveStreamEventAction: PerformLiveStreamEventAction,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: PerformLiveStreamEventActionResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  performSlateActionAsync(
    performSlateAction: PerformSlateAction,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: PerformSlateActionResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  updateLiveStreamEventsAsync(
    updateLiveStreamEvents: UpdateLiveStreamEvents,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: UpdateLiveStreamEventsResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  updateSlatesAsync(
    updateSlates: UpdateSlates,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: UpdateSlatesResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
}

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