type LivePromise = Promise<Object>;

declare class InitParams {
    apiUrl?: string,
    language?: string,
    appId?: number,
    websocket?: WebSocket,
    connection?: WebSocket,
    keepAlive?: boolean,
}

declare class WebsocketMessage {
    data: string,
}

declare interface ApiCalls {
    getActiveSymbolsBrief(): Promise<ActiveSymbolsResponse>;
    getActiveSymbolsFull(): Promise<ActiveSymbolsResponse>;
    getAssetIndex(): Promise<AssetIndexResponse>;
    authorize(token: string): Promise<AuthorizeResponse>;

    getContractsForSymbol(symbol: string): Promise<ContractsForResponse>;
    unsubscribeFromTick(symbol: string): LivePromise;
    unsubscribeFromTicks(symbols: string[]): LivePromise;
    unsubscribeByID(id: number): LivePromise;
    unsubscribeFromAllTicks(): LivePromise;
    unsubscribeFromAllProposals(): LivePromise;
    unsubscribeFromAllPortfolios(): LivePromise;
    unsubscribeFromAllProposalsOpenContract(): LivePromise;
    getLandingCompany(landingCompany: string): Promise<LandingCompanyResponse>;
    getLandingCompanyDetails(landingCompany: string): Promise<LandingCompanyDetailsResponse>;
    createVirtualAccount(options: Object): Promise<NewAccountVirtualResponse>;
    ping(): Promise<PingResponse>;
    getPaymentAgentsForCountry(countryCode: string): Promise<PaymentAgentListResponse>;
    getPayoutCurrencies(): Promise<PayoutCurrenciesResponse>;
    getPriceProposalForContract(options: Object): Promise<PriceProposal>;
    subscribeToPriceForContractProposal(options: Object): Promise<PriceProposal>;
    getResidences(): Promise<ResidenceListResponse>;
    getStatesForCountry(countryCode: string): Promise<StatesListResponse>;
    subscribeToTick(symbol: string): LivePromise;
    subscribeToTicks(symbols: string[]): LivePromise;
    getTickHistory(symbol: string, options: Object): Promise<TickHistoryResponse>;
    getCandles(symbol: string, options: Object): Promise<TickHistoryResponse>;
    getCandlesForLastNDays(symbol: string, ndays: number): Promise<TickHistoryResponse>;
    getServerTime(): Promise<TimeResponse>;
    getTradingTimes(date: Date): Promise<TradingTimesResponse>;
    verifyEmail(email: string, type: string): Promise<VerifyEmailResponse>;
    getWebsiteStatus(): Promise<WebsiteStatusResponse>;

    getAccountLimits(): Promise<AccountLimitsResponse>;
    getAccountSettings(): Promise<AccountSettingsResponse>;
    getAccountStatus(): Promise<AccountStatusResponse>;
    getSelfExclusion(): Promise<SelfExclusionResponse>;
    logOut(): Promise<LogoutResponse>;
    getStatement(options: StatementOptions): Promise<StatementResponse>;
    getPortfolio(): Promise<PortfolioResponse>;
    getProfitTable(options: ProfitTableOptions): Promise<ProfitTableResponse>;
    getRealityCheckSummary (): Promise<RealityCheckResponse>;
    subscribeToBalance(): Promise<BalanceResponse>;
    unsubscribeFromBalance(): LivePromise;
    subscribeToOpenContract(contractId: number): LivePromise;
    getContractInfo(contractId: number): LivePromise;
    subscribeToAllOpenContracts(): LivePromise;
    unsubscribeFromAllOpenContracts(): LivePromise;
    subscribeToTransactions(): Promise<TransactionResponse>;
    unsubscribeFromTransactions(): LivePromise;

    buyContract(contractId: number, price: number): Promise<BuyContractResponse>;
    sellContract(contractId: number, price: number): Promise<SellContractResponse>;
    sellExpiredContracts(): Promise<SellExpiredContractsResponse>;
    topUpVirtualAccount(): Promise<TopUpVirtualResponse>;

    getCashierLockStatus(): Promise<CashierResponse>;
    setCashierLock(options: Object): LivePromise;
    withdrawToPaymentAgent(options: Object): Promise<PaymentAgentWithdrawResponse>;
    paymentAgentTransfer(options: Object): Promise<PaymentAgentTransferResponse>;
    transferBetweenAccounts(options: Object): Promise<TransferBetweenAccountsResponse>;

    deleteApiToken(token: string): Promise<ApiTokenManagementResponse>;
    getApiTokens(): Promise<ApiTokenManagementResponse>;
    createApiToken(token: string, scopes: string[]): Promise<ApiTokenManagementResponse>;
    changePassword(oldPassword: string, newPassword: string): Promise<ChangePasswordResponse>;
    registerApplication(options: ApplicationDetails): Promise<ApplicationRegisterResponse>;
    getAllAppList(): Promise<ApplicationListResponse>;
    getAppslistById(appid: number): Promise<ApplicationListResponse>;
    deleteApplication(appid: number): Promise<ApplicationDeleteResponse>;
    createRealAccountMaltaInvest(options: CreateMaltainvestAccountOptions): Promise<CreateMaltainvestAccountResponse>;
    createRealAccount(options: CreateRealAccountOptions): Promise<CreateRealAccountResponse>;
    setAccountCurrency(currency: string): Promise<SetAccountCurrencyResponse>;
    setSelfExclusion(options: SelfExclusionSettings): Promise<SetSelfExclusionResponse>;
    setAccountSettings(options: AccountSettings): Promise<SetSettingsResponse>;
    setTnCApproval(): Promise<TncApprovalResponse>;
}

declare module 'binary-live-api' {
    declare class LiveApi extends ApiCalls {
        [key: string]: LivePromise;

        constructor(initParams: InitParams): void;
        connect(connection: ?WebSocket): void;
        disconnect(): void;
        changeLanguage(ln: string): void;
        isReady(): boolean;
        sendRaw(json: Object): ?LivePromise;
        send(json: Object): ?LivePromise;
        execute(func: () => void): void;

    }

    declare class ApiState {
        constructor(): void;
        resetState(): void;
        getState(): Object;
        authorize(token: string): void;
        subscribeToBalance(): void;
        unsubscribeFromBalance(): void;
        subscribeToAllOpenContracts(): void;
        unsubscribeFromAllOpenContracts(): void;
        subscribeToTransactions(): void;
        unsubscribeFromTransactions(): void;
        subscribeToTick(symbol: string): void;
        subscribeToTicks(symbol: string[]): void;
        unsubscribeFromTick(symbol: string): void;
        unsubscribeFromTicks(symbol: string[]): void;
        unsubscribeFromAllTicks():void;
        subscribeToPriceForContractProposal(options: Object): void;
        unsubscribeFromAllProposals(): void;
    }
}
