import {
  Client as SoapClient,
  createClientAsync as soapCreateClientAsync,
  IExOptions as ISoapExOptions,
} from 'soap'
import { CreateYieldGroups } from './definitions/CreateYieldGroups'
import { CreateYieldGroupsResponse } from './definitions/CreateYieldGroupsResponse'
import { GetYieldGroupsByStatement } from './definitions/GetYieldGroupsByStatement'
import { GetYieldGroupsByStatementResponse } from './definitions/GetYieldGroupsByStatementResponse'
import { GetYieldPartners } from './definitions/GetYieldPartners'
import { GetYieldPartnersResponse } from './definitions/GetYieldPartnersResponse'
import { UpdateYieldGroups } from './definitions/UpdateYieldGroups'
import { UpdateYieldGroupsResponse } from './definitions/UpdateYieldGroupsResponse'
import { YieldGroupService } from './services/YieldGroupService'

export interface YieldGroupServiceClient extends SoapClient {
  YieldGroupService: YieldGroupService
  createYieldGroupsAsync(
    createYieldGroups: CreateYieldGroups,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: CreateYieldGroupsResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  getYieldGroupsByStatementAsync(
    getYieldGroupsByStatement: GetYieldGroupsByStatement,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: GetYieldGroupsByStatementResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  getYieldPartnersAsync(
    getYieldPartners: GetYieldPartners,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: GetYieldPartnersResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
  updateYieldGroupsAsync(
    updateYieldGroups: UpdateYieldGroups,
    options?: ISoapExOptions,
  ): Promise<
    [
      result: UpdateYieldGroupsResponse,
      rawResponse: any,
      soapHeader: any,
      rawRequest: any,
    ]
  >
}

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