// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/connectivity/weave/lib/applets_loader/applets_loader.h"

#include <lib/syslog/cpp/macros.h>

#include <algorithm>
#include <optional>

namespace weavestack::applets {
namespace {

const FuchsiaWeaveAppletsModuleV1 kNullAppletModuleV1 = {
    .create_applet = nullptr,
    .delete_applet = nullptr,
};

}  // namespace

zx_status_t AppletsLoader::CreateWithModule(const char* lib_name,
                                            std::unique_ptr<AppletsLoader>* out) {
  auto module = AppletsModuleV1::Open(lib_name);
  if (!module) {
    return ZX_ERR_UNAVAILABLE;
  }
  *out = std::unique_ptr<AppletsLoader>(new AppletsLoader(std::move(module)));
  return ZX_OK;
}

std::unique_ptr<AppletsLoader> AppletsLoader::CreateWithNullModule() {
  // Note we use a no-op 'release' method here since we're wrapping a static/const data member we
  // want to make sure we don't free this pointer.
  auto module =
      std::shared_ptr<const FuchsiaWeaveAppletsModuleV1>(&kNullAppletModuleV1, [](auto* ptr) {});
  return std::unique_ptr<AppletsLoader>(new AppletsLoader(AppletsModuleV1(std::move(module))));
}

Applet AppletsLoader::CreateApplet(FuchsiaWeaveAppletsCallbacksV1 callbacks) {
  FX_DCHECK(module_);
  auto applets_handle = module_->create_applet(callbacks);
  if (applets_handle == FUCHSIA_WEAVE_APPLETS_INVALID_HANDLE) {
    return {};
  }
  return {applets_handle, module_};
}

AppletsLoader::AppletsLoader(AppletsModuleV1 module) : module_(std::move(module)) {}

}  // namespace weavestack::applets
