// Copyright 2018 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 <errno.h>
#include <fcntl.h>
#include <inttypes.h>
#include <lib/debugdata/debugdata.h>
#include <lib/fdio/io.h>
#include <lib/zx/channel.h>
#include <lib/zx/job.h>
#include <lib/zx/vmar.h>
#include <lib/zx/vmo.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <zircon/status.h>

#include <fbl/string.h>
#include <fbl/unique_fd.h>
#include <fbl/vector.h>

namespace debugdata {

DebugData::DebugData(fbl::unique_fd root_dir_fd) : root_dir_fd_(std::move(root_dir_fd)) {}

void DebugData::Publish(fidl::StringView data_sink, zx::vmo vmo, PublishCompleter::Sync&) {
  std::lock_guard<std::mutex> lock(lock_);
  std::string name(data_sink.data(), data_sink.size());
  data_[name].push_back(std::move(vmo));
}

std::unordered_map<std::string, std::vector<zx::vmo>> DebugData::TakeData() {
  std::lock_guard<std::mutex> lock(lock_);
  auto temp = std::move(data_);
  data_ = std::unordered_map<std::string, std::vector<zx::vmo>>();
  return temp;
}

void DebugData::LoadConfig(fidl::StringView config_name, LoadConfigCompleter::Sync& completer) {
  // When loading debug configuration file, we expect an absolute path.
  if (config_name[0] != '/') {
    // TODO(phosek): Use proper logging mechanism.
    fprintf(stderr, "debugdata: error: LoadConfig: '%.*s' is not an absolute path\n",
            static_cast<int>(config_name.size()), config_name.data());
    completer.Close(ZX_ERR_INVALID_ARGS);
    return;
  }

  fbl::unique_fd fd(openat(root_dir_fd_.get(), config_name.data(), O_RDONLY));
  if (!fd) {
    fprintf(stderr, "debugdata: error: LoadConfig: failed to open '%.*s': %s\n",
            static_cast<int>(config_name.size()), config_name.data(), strerror(errno));
    completer.Close(ZX_ERR_NOT_FOUND);
    return;
  }
  zx::vmo vmo;
  zx_status_t status = fdio_get_vmo_clone(fd.get(), vmo.reset_and_get_address());
  if (status != ZX_OK) {
    fprintf(stderr, "debugdata: error: LoadConfig: failed to load VMO: %s\n",
            zx_status_get_string(status));
    completer.Close(status);
    return;
  }
  vmo.set_property(ZX_PROP_NAME, config_name.data(), config_name.size());
  completer.Reply(std::move(vmo));
}

}  // namespace debugdata
