// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "platform/globals.h"
#if defined(HOST_OS_FUCHSIA)

#include <memory>
#include <utility>

#include "lib/sys/cpp/component_context.h"
#include "lib/sys/inspect/cpp/component.h"
#include "platform/utils.h"
#include "platform/utils_fuchsia.h"

namespace dart {

char* Utils::StrNDup(const char* s, intptr_t n) {
  return strndup(s, n);
}

char* Utils::StrDup(const char* s) {
  return strdup(s);
}

intptr_t Utils::StrNLen(const char* s, intptr_t n) {
  return strnlen(s, n);
}

int Utils::SNPrint(char* str, size_t size, const char* format, ...) {
  va_list args;
  va_start(args, format);
  int retval = VSNPrint(str, size, format, args);
  va_end(args);
  return retval;
}

int Utils::VSNPrint(char* str, size_t size, const char* format, va_list args) {
  int retval = vsnprintf(str, size, format, args);
  if (retval < 0) {
    FATAL1("Fatal error in Utils::VSNPrint with format '%s'", format);
  }
  return retval;
}

int Utils::Close(int fildes) {
  return close(fildes);
}
size_t Utils::Read(int filedes, void* buf, size_t nbyte) {
  return read(filedes, buf, nbyte);
}
int Utils::Unlink(const char* path) {
  return unlink(path);
}

sys::ComponentContext* ComponentContext() {
  static std::unique_ptr<sys::ComponentContext> context =
      sys::ComponentContext::CreateAndServeOutgoingDirectory();
  return context.get();
}

std::unique_ptr<inspect::Node> vm_node;
void SetDartVmNode(std::unique_ptr<inspect::Node> node) {
  vm_node = std::move(node);
}

std::unique_ptr<inspect::Node> TakeDartVmNode() {
  // TODO(fxbug.dev/69558) Remove the creation of the node_ from this call
  // after the runners have been migrated to injecting this object.
  if (vm_node == nullptr) {
    static std::unique_ptr<sys::ComponentInspector> component_inspector =
        std::make_unique<sys::ComponentInspector>(dart::ComponentContext());
    inspect::Node& root = component_inspector->inspector()->GetRoot();
    vm_node = std::make_unique<inspect::Node>(root.CreateChild("vm"));
  }
  return std::move(vm_node);
}

}  // namespace dart

#endif  // defined(HOST_OS_FUCHSIA)
