// Copyright 2019 The TAL Authors. All rights reserved.
#include "lib/extension_impl.h"

#include <string>
#include "json/reader.h"
#include "public/iextension.h"
#include "public/iextension_manager.h"
#include "public/iextension_mediastream_delegate.h"
ExtensionImpl g_extension_;

// Static
owcr::extension::IExtension* ExtensionImpl::GetGlobalExtension() {
  return &g_extension_;
}

ExtensionImpl::ExtensionImpl() {}

int ExtensionImpl::Init(
    owcr::extension::IExtensionManager* manager,
    owcr::extension::IExtensionEventNotify* event_notify) {
  common::AutoLock auto_lock(context_.safe());
  if (!context_.Init(manager, event_notify))
    return -1;
  //you should do init work at here.
  demo_engine_.reset(new ems::DemoExtensionEngine());
  demo_engine_->Initialize(&context_);
  return 0;
}

int ExtensionImpl::Uninit() {
  common::AutoLock auto_lock(context_.safe());
  // you should do Uninit work at here.
  demo_engine_.reset();
  if (!context_.Uninit())
    return -1;
  return 0;
}

int ExtensionImpl::CallMethod(
    const char* method_name,
    int method_name_length,
    const char* json_args,
    int json_args_length,
    owcr::extension::IExtensionMethodCallback* call_back) {
  std::string method(method_name);
  std::string args(json_args);
  CallEngineMethodInternal(method, args, call_back);
  return 0;
}

void ExtensionImpl::CallEngineMethodInternal(const std::string method,
  const std::string& params,
  owcr::extension::IExtensionMethodCallback* call_back) {
  if (!demo_engine_) {
    call_back->OnMethodError(owcr::extension::E_METHOD_ENGINE_NOT_STARTED, "",
                             0);
    return;
  }
  demo_engine_->CallMethod(method, params, call_back);
}
