// Copyright 2019 The TAL Authors. All rights reserved.
#include "test/extension_manager_impl.h"

#include <iostream>
#include <Windows.h>
#include<thread>

typedef int(*MAIN_ENTRY_FUNC_T)(void**);

bool ExtensionManagerImpl::GetVersionAPI(
  EXTENSION_MANAGER_VERSION_NUM num, void** api) {
  if (!api)
    return false;

  if (num == IEM_V_1) {
    *api = (void*)this;
    return true;
  }
  *api = 0;
  return false;
}

// IEM_V_1
IExtensionNetworkDelegate* ExtensionManagerImpl::GetNetworkDelegate() {
  return 0;
}

IExtensionMediaStreamDelegate* ExtensionManagerImpl::GetMediaStreamDelegate() {
  return 0;
}

IExtensionThreadDelegate* ExtensionManagerImpl::GetThreadDelegate() {
  return 0;
}

IExtensionPagesDelegate* ExtensionManagerImpl::GetPagesDeleaget() {
  return 0;
}

IExtensionPagesDelegate* ExtensionManagerImpl::GetReportDeleaget() {
  return 0;
}

IExtensionApiDelegate* ExtensionManagerImpl::GetApiDelegate() {
  return 0;
}

IExtensionMediaApplyDelegate* ExtensionManagerImpl::GetMediaApplyDelegate() {
    return 0;
}

void ExtensionManagerImpl::EventNotifyImpl::OnEvent(
    const char* event_name,
    int event_name_length,
    const char* event_json_params,
    int event_json_parasm_length) {
  std::cout << "[EVENT] [" << event_name << "]" << std::endl;
}

bool ExtensionManagerImpl::InitExtension() {
  HINSTANCE ext_dll = ::LoadLibraryA("xxx_ext.dll");
  if (ext_dll == NULL) {
    std::cout << "[ERROR] Load Extension Library" << std::endl;
    return false;
  }
  MAIN_ENTRY_FUNC_T entry_func = (MAIN_ENTRY_FUNC_T)GetProcAddress(
    ext_dll, "GetIExtension");
  if (entry_func == NULL) {
    std::cout << "[ERROR] Find GetIExtension Function" << std::endl;
    return false;
  }
  owcr::extension::IExtension* extension = 0;
  entry_func((void**)&extension);
  std::cout << "[INFO] Load Extension Library Succeed" << std::endl;
  extension->Init(this, new ExtensionManagerImpl::EventNotifyImpl());
  extension->CallMethod("extension_method", 100, "{\"version\":\"1.0.0.0\"}", 2,
                        nullptr);
  return true;
}
