/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef __RESPONSEFUTURE_H__
#define __RESPONSEFUTURE_H__
#include <boost/atomic.hpp>
#include <boost/thread/condition_variable.hpp>
#include "AsyncCallbackWrap.h"
#include "RemotingCommand.h"
#include "UtilAll.h"

namespace rocketmq {

typedef enum asyncCallBackStatus {
  asyncCallBackStatus_init = 0,
  asyncCallBackStatus_response = 1,
  asyncCallBackStatus_timeout = 2
} asyncCallBackStatus;

class TcpRemotingClient;
//<!***************************************************************************
class ResponseFuture {
 public:
  ResponseFuture(int requestCode,
                 int opaque,
                 TcpRemotingClient* powner,
                 int64 timeoutMilliseconds,
                 bool bAsync = false,
                 AsyncCallbackWrap* pcall = NULL);
  virtual ~ResponseFuture();
  void releaseThreadCondition();
  RemotingCommand* waitResponse(int timeoutMillis);
  RemotingCommand* getCommand() const;

  void setResponse(RemotingCommand* pResponseCommand);
  bool isSendRequestOK();
  void setSendRequestOK(bool sendRequestOK);
  int getRequestCode() const;
  int getOpaque() const;

  //<!callback;
  void executeInvokeCallback();
  void executeInvokeCallbackException();
  bool isTimeOut() const;
  int getMaxRetrySendTimes() const;
  int getRetrySendTimes() const;
  int64 leftTime() const;
  // bool    isTimeOutMoreThan30s() const;
  const bool getASyncFlag();
  void setAsyncResponseFlag();
  const bool getAsyncResponseFlag();
  const bool getSyncResponseFlag();
  AsyncCallbackWrap* getAsyncCallbackWrap();
  void setAsyncCallBackStatus(asyncCallBackStatus asyncCallbackStatus);
  void setMaxRetrySendTimes(int maxRetryTimes);
  void setRetrySendTimes(int retryTimes);
  void setBrokerAddr(const std::string& brokerAddr);
  void setRequestCommand(const RemotingCommand& requestCommand);
  const RemotingCommand& getRequestCommand();
  std::string getBrokerAddr() const;

 private:
  int m_requestCode;
  int m_opaque;
  bool m_sendRequestOK;
  boost::mutex m_defaultEventLock;
  boost::condition_variable_any m_defaultEvent;
  int64 m_beginTimestamp;
  int64 m_timeout;  // ms
  boost::atomic<bool> m_bAsync;
  RemotingCommand* m_pResponseCommand;  //<!delete outside;
  AsyncCallbackWrap* m_pCallbackWrap;
  boost::mutex m_asyncCallbackLock;
  asyncCallBackStatus m_asyncCallbackStatus;
  boost::atomic<bool> m_asyncResponse;
  boost::atomic<bool> m_syncResponse;

  int m_maxRetrySendTimes;
  int m_retrySendTimes;
  std::string m_brokerAddr;
  RemotingCommand m_requestCommand;
  // TcpRemotingClient*    m_tcpRemoteClient;
};
//<!************************************************************************
}  //<!end namespace;

#endif
