/*
 * 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 __MQCLIENTAPIIMPL_H__
#define __MQCLIENTAPIIMPL_H__
#include "AsyncCallback.h"
#include "ClientRPCHook.h"
#include "ClientRemotingProcessor.h"
#include "CommandHeader.h"
#include "HeartbeatData.h"
#include "KVTable.h"
#include "LockBatchBody.h"
#include "MQClientException.h"
#include "MQMessageExt.h"
#include "MQProtos.h"
#include "SendResult.h"
#include "SocketUtil.h"
#include "TcpRemotingClient.h"
#include "TopAddressing.h"
#include "TopicConfig.h"
#include "TopicList.h"
#include "TopicRouteData.h"
#include "UtilAll.h"
#include "VirtualEnvUtil.h"

namespace rocketmq {
//<!wrap all API to net ;
//<!************************************************************************
class MQClientAPIImpl {
 public:
  MQClientAPIImpl(const string& mqClientId, ClientRemotingProcessor* clientRemotingProcessor,
                  int pullThreadNum, uint64_t tcpConnectTimeout,
                  uint64_t tcpTransportTryLockTimeout, string unitName);
  virtual ~MQClientAPIImpl();
  void stopAllTcpTransportThread();
  bool writeDataToFile(string filename, string data, bool isSync);
  string fetchNameServerAddr(const string& NSDomain);
  void updateNameServerAddr(const string& addrs);

  void callSignatureBeforeRequest(
      const string& addr, RemotingCommand& request,
      const SessionCredentials& session_credentials);
  void createTopic(const string& addr, const string& defaultTopic,
                   TopicConfig topicConfig,
                   const SessionCredentials& sessionCredentials);

  SendResult sendMessage(const string& addr, const string& brokerName,
                         const MQMessage& msg,
                         SendMessageRequestHeader* pRequestHeader,
                         int timeoutMillis, int maxRetrySendTimes,
                         int communicationMode,
                         SendCallback* pSendCallback,
                         const SessionCredentials& sessionCredentials);

  PullResult* pullMessage(const string& addr,
                          PullMessageRequestHeader* pRequestHeader,
                          int timeoutMillis, int communicationMode,
                          PullCallback* pullCallback, void* pArg,
                          const SessionCredentials& sessionCredentials);

  void sendHearbeat(const string& addr, HeartbeatData* pHeartbeatData,
                    const SessionCredentials& sessionCredentials);

  void unregisterClient(const string& addr, const string& clientID,
                        const string& producerGroup,
                        const string& consumerGroup,
                        const SessionCredentials& sessionCredentials);

  TopicRouteData* getTopicRouteInfoFromNameServer(
      const string& topic, int timeoutMillis,
      const SessionCredentials& sessionCredentials);

  TopicList* getTopicListFromNameServer(
      const SessionCredentials& sessionCredentials);

  int wipeWritePermOfBroker(const string& namesrvAddr, const string& brokerName,
                            int timeoutMillis);

  void deleteTopicInBroker(const string& addr, const string& topic,
                           int timeoutMillis);

  void deleteTopicInNameServer(const string& addr, const string& topic,
                               int timeoutMillis);

  void deleteSubscriptionGroup(const string& addr, const string& groupName,
                               int timeoutMillis);

  string getKVConfigByValue(const string& projectNamespace,
                            const string& projectGroup, int timeoutMillis);

  KVTable getKVListByNamespace(const string& projectNamespace,
                               int timeoutMillis);

  void deleteKVConfigByValue(const string& projectNamespace,
                             const string& projectGroup, int timeoutMillis);

  SendResult processSendResponse(const string& brokerName, const MQMessage& msg,
                                 RemotingCommand* pResponse);

  PullResult* processPullResponse(RemotingCommand* pResponse);

  int64 getMinOffset(const string& addr, const string& topic, int queueId,
                     int timeoutMillis,
                     const SessionCredentials& sessionCredentials);

  int64 getMaxOffset(const string& addr, const string& topic, int queueId,
                     int timeoutMillis,
                     const SessionCredentials& sessionCredentials);

  int64 searchOffset(const string& addr, const string& topic, int queueId,
                     uint64_t timestamp, int timeoutMillis,
                     const SessionCredentials& sessionCredentials);

  MQMessageExt* viewMessage(const string& addr, int64 phyoffset,
                            int timeoutMillis,
                            const SessionCredentials& sessionCredentials);

  int64 getEarliestMsgStoretime(const string& addr, const string& topic,
                                int queueId, int timeoutMillis,
                                const SessionCredentials& sessionCredentials);

  void getConsumerIdListByGroup(const string& addr, const string& consumerGroup,
                                vector<string>& cids, int timeoutMillis,
                                const SessionCredentials& sessionCredentials);

  int64 queryConsumerOffset(const string& addr,
                            QueryConsumerOffsetRequestHeader* pRequestHeader,
                            int timeoutMillis,
                            const SessionCredentials& sessionCredentials);

  void updateConsumerOffset(const string& addr,
                            UpdateConsumerOffsetRequestHeader* pRequestHeader,
                            int timeoutMillis,
                            const SessionCredentials& sessionCredentials);

  void updateConsumerOffsetOneway(
      const string& addr, UpdateConsumerOffsetRequestHeader* pRequestHeader,
      int timeoutMillis, const SessionCredentials& sessionCredentials);

  void consumerSendMessageBack(MQMessageExt& msg, const string& consumerGroup,
                               int delayLevel, int timeoutMillis,
                               const SessionCredentials& sessionCredentials);

  void lockBatchMQ(const string& addr, LockBatchRequestBody* requestBody,
                   vector<MQMessageQueue>& mqs, int timeoutMillis,
                   const SessionCredentials& sessionCredentials);

  void unlockBatchMQ(const string& addr, UnlockBatchRequestBody* requestBody,
                     int timeoutMillis,
                     const SessionCredentials& sessionCredentials);

  void sendMessageAsync(const string& addr, const string& brokerName,
                        const MQMessage& msg, RemotingCommand& request,
                        SendCallback* pSendCallback, int64 timeoutMilliseconds,
                        int maxRetryTimes=1,
                        int retrySendTimes=1);
  void deleteOpaqueForDropPullRequest(const MQMessageQueue& mq, int opaque);

 private:
  SendResult sendMessageSync(const string& addr, const string& brokerName,
                             const MQMessage& msg, RemotingCommand& request,
                             int timeoutMillis);
  /*
  void sendMessageAsync(const string& addr, const string& brokerName,
                        const MQMessage& msg, RemotingCommand& request,
                        SendCallback* pSendCallback, int64 timeoutMilliseconds);
  */
  PullResult* pullMessageSync(const string& addr, RemotingCommand& request,
                              int timeoutMillis);

  void pullMessageAsync(const string& addr, RemotingCommand& request,
                        int timeoutMillis, PullCallback* pullCallback,
                        void* pArg);

 private:
  unique_ptr<TcpRemotingClient> m_pRemotingClient;
  unique_ptr<TopAddressing> m_topAddressing;
  string m_nameSrvAddr;
  bool m_firstFetchNameSrv;
  string m_mqClientId;
};
}  //<!end namespace;
//<!***************************************************************************
#endif
