import { WS_KEY_MAP, WsKey } from '../../util/websocket-util.js';
import { OrderIdRequest } from '../rest/request/trade.js';
import { OrderResult } from '../rest/response/private-trade.js';
import { numberInString } from '../rest/shared.js';
import { WSAPIAmendOrderRequestV5, WSAPIAmendSpreadOrderRequestV5, WSAPICancelSpreadOrderRequestV5, WSAPIMassCancelOrdersRequestV5, WSAPIPlaceOrderRequestV5, WSAPIPlaceSpreadOrderRequestV5, WSAPISpreadMassCancelOrdersRequestV5 } from './ws-api-request.js';
import { WSAPICancelOrderResultV5, WSAPISpreadAmendOrderResultV5, WSAPISpreadCancelOrderResultV5, WSAPISpreadPlaceOrderResultV5 } from './ws-api-response.js';
import { WsAuthRequestArg, WsChannelSubUnSubRequestArg } from './ws-request.js';
export interface WSAPIRequestFlags {
    /** If true, will skip auth requirement for WS API connection */
    authIsOptional?: boolean | undefined;
    /**
     * Request effective deadline. Unix timestamp format in milliseconds, e.g. 1597026383085
     *
     * Only applies for order placement and order amend (batch commands included)
     */
    expTime?: numberInString;
}
export type WSOperation = 'subscribe' | 'unsubscribe' | 'login';
/**
 *
 * Top level requests with args
 *
 */
/**

/**
 * request looks like this:
{
  "id": "1512",
  "op": "subscribe",
  "args": [
    {
      "channel": "tickers",
      "instId": "BTC-USDT"
    }
  ]
}
 */
export interface WsRequestOperationOKX<TWSRequestArg> {
    id: string;
    op: WSOperation;
    args?: TWSRequestArg[];
}
export interface WsSubRequest extends WsRequestOperationOKX<WsChannelSubUnSubRequestArg> {
    op: 'subscribe';
}
export interface WsUnsubRequest extends WsRequestOperationOKX<WsChannelSubUnSubRequestArg> {
    op: 'unsubscribe';
}
export interface WsAuthRequest extends WsRequestOperationOKX<WsAuthRequestArg> {
    op: 'login';
}
export type WSAPIPrivateOperations = 'order' | 'batch-orders' | 'cancel-order' | 'batch-cancel-orders' | 'amend-order' | 'batch-amend-orders' | 'mass-cancel';
export type WSAPIBusinessOperations = 'sprd-order' | 'sprd-amend-order' | 'sprd-cancel-order' | 'sprd-mass-cancel';
export type WSAPIOperation = WSAPIPrivateOperations | WSAPIBusinessOperations;
export declare const WS_API_Operations: WSAPIOperation[];
export declare const WS_API_PRIVATE_OPERATIONS: WSAPIPrivateOperations[];
export declare const WS_API_BUSINESS_OPERATIONS: WSAPIBusinessOperations[];
export declare const WS_API_TAG_OPERATIONS: WSAPIOperation[];
export interface WSAPIRequestOKX<TRequestParams> {
    id: numberInString;
    op: WSAPIOperation;
    expTime?: numberInString;
    args: TRequestParams[];
}
export interface WSAPIResponse<TResponseData extends object = object, TOperation extends WSAPIOperation = WSAPIOperation> {
    wsKey: WsKey;
    id: numberInString;
    op: TOperation;
    code: numberInString;
    msg: string;
    data: TResponseData;
    inTime: numberInString;
    outTime: numberInString;
}
export interface WSOperationLoginParams {
    apiKey: string;
    passphrase: string;
    timestamp: number;
    sign: string;
}
export type Exact<T> = {
    [K: string]: never;
} & {
    [K in keyof T]: T[K];
};
/**
 * List of operations supported for this WsKey (connection)
 */
export interface WsAPIWsKeyTopicMap {
    [WS_KEY_MAP.prodPrivate]: WSAPIPrivateOperations;
    [WS_KEY_MAP.prodDemoPrivate]: WSAPIPrivateOperations;
    [WS_KEY_MAP.prodBusiness]: WSAPIBusinessOperations;
    [WS_KEY_MAP.prodDemoBusiness]: WSAPIBusinessOperations;
    [WS_KEY_MAP.eeaLivePrivate]: WSAPIPrivateOperations;
    [WS_KEY_MAP.eeaDemoPrivate]: WSAPIPrivateOperations;
    [WS_KEY_MAP.usLivePrivate]: WSAPIPrivateOperations;
    [WS_KEY_MAP.usDemoPrivate]: WSAPIPrivateOperations;
}
/**
 * Request parameters expected per operation
 */
export interface WsAPITopicRequestParamMap {
    order: WSAPIPlaceOrderRequestV5;
    'batch-orders': WSAPIPlaceOrderRequestV5[];
    'cancel-order': OrderIdRequest;
    'batch-cancel-orders': OrderIdRequest[];
    'amend-order': WSAPIAmendOrderRequestV5;
    'batch-amend-orders': WSAPIAmendOrderRequestV5[];
    'mass-cancel': WSAPIMassCancelOrdersRequestV5;
    'sprd-order': WSAPIPlaceSpreadOrderRequestV5;
    'sprd-amend-order': WSAPIAmendSpreadOrderRequestV5;
    'sprd-cancel-order': WSAPICancelSpreadOrderRequestV5;
    'sprd-mass-cancel': WSAPISpreadMassCancelOrdersRequestV5;
}
/**
 * Response structure expected for each operation
 */
export interface WsAPIOperationResponseMap {
    order: WSAPIResponse<[OrderResult], 'order'>;
    'batch-orders': WSAPIResponse<OrderResult[], 'batch-orders'>;
    'cancel-order': WSAPIResponse<[WSAPICancelOrderResultV5], 'cancel-order'>;
    'batch-cancel-orders': WSAPIResponse<WSAPICancelOrderResultV5[], 'batch-cancel-orders'>;
    'amend-order': WSAPIResponse<[OrderResult], 'amend-order'>;
    'batch-amend-orders': WSAPIResponse<[OrderResult], 'batch-amend-orders'>;
    'mass-cancel': WSAPIResponse<[{
        result: boolean;
    }], 'mass-cancel'>;
    'sprd-order': WSAPIResponse<[WSAPISpreadPlaceOrderResultV5], 'sprd-order'>;
    'sprd-amend-order': WSAPIResponse<[
        WSAPISpreadAmendOrderResultV5
    ], 'sprd-amend-order'>;
    'sprd-cancel-order': WSAPIResponse<[
        WSAPISpreadCancelOrderResultV5
    ], 'sprd-cancel-order'>;
    'sprd-mass-cancel': WSAPIResponse<[{
        result: boolean;
    }], 'sprd-mass-cancel'>;
}
