//  Agora SDK
//
//  Copyright (c) 2019 Agora.io. All rights reserved.
//

#ifndef AGORA_SERVICE_H
#define AGORA_SERVICE_H
#include "AgoraBase.h"

namespace agora {
namespace rtc {
class IRtcEngine;
}
namespace rtm {
class IRtmService;
}
namespace base {

struct AgoraServiceContext {};

class IAgoraService {
 protected:
  virtual ~IAgoraService() {}

 public:
  AGORA_CPP_API static void release();

  /** Initializes the engine.

@param context RtcEngine context.
@return
- 0: Success.
- < 0: Failure.
*/
  virtual int initialize(const AgoraServiceContext& context) = 0;

  /** Retrieves the SDK version number.
   * @param build Build number.
   * @return The current SDK version in the string format. For example, 2.4.0
   */
  virtual const char* getVersion(int* build) = 0;

  virtual rtm::IRtmService* createRtmService() = 0;
};

}  // namespace base
}  // namespace agora

/** Gets the SDK version number.

 @param build Build number of the Agora SDK.
 @return
 - 0: Success.
 - < 0: Failure.
*/
AGORA_API const char* AGORA_CALL getAgoraSdkVersion(int* build);

/**
 * Creates the RtcEngine object and returns the pointer.
 * @param err Error code
 * @return returns Description of the error code
 */
AGORA_API const char* AGORA_CALL getAgoraSdkErrorDescription(int err);

/**
 * Creates the Agora Service object and returns the pointer.
 * @return returns Pointer of the Agora Service object
 */
AGORA_API agora::base::IAgoraService* AGORA_CALL createAgoraService();

AGORA_API int AGORA_CALL setAgoraSdkExternalSymbolLoader(void* (*func)(const char* symname));

#endif
