// Copyright 2021 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 <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/async/dispatcher.h>
#include <lib/syslog/cpp/macros.h>
#include <lib/trace-provider/provider.h>

#include "src/storage/f2fs/f2fs.h"

namespace f2fs {

zx::result<> StartComponent(fidl::ServerEnd<fuchsia_io::Directory> root,
                            fidl::ServerEnd<fuchsia_process_lifecycle::Lifecycle> lifecycle) {
  async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
  trace::TraceProviderWithFdio trace_provider(loop.dispatcher());

  std::unique_ptr<ComponentRunner> runner(new ComponentRunner(loop.dispatcher()));
  runner->SetUnmountCallback([&loop]() {
    loop.Quit();
    FX_LOGS(INFO) << "unmounted successfully";
  });
  auto status = runner->ServeRoot(std::move(root), std::move(lifecycle));
  if (status.is_error()) {
    return status;
  }

  // |ZX_ERR_CANCELED| is returned when the loop is cancelled via |loop.Quit()|.
  ZX_ASSERT(loop.Run() == ZX_ERR_CANCELED);
  return zx::ok();
}

zx::result<size_t> MountOptions::GetValue(const MountOption option) const {
  if (option >= MountOption::kMaxNum)
    return zx::error(ZX_ERR_INVALID_ARGS);
  return zx::ok(opt_[static_cast<size_t>(option)]);
}

zx_status_t MountOptions::SetValue(const MountOption option, const size_t value) {
  if (option == MountOption::kActiveLogs && value != 2 && value != 4 && value != 6) {
    FX_LOGS(WARNING) << " active_logs can be set only to 2, 4, or 6.";
    return ZX_ERR_INVALID_ARGS;
  };
  if ((option == MountOption::kBgGcOff || option == MountOption::kNoHeap) && value) {
    return ZX_ERR_INVALID_ARGS;
  }
  opt_[static_cast<size_t>(option)] = value;
  return ZX_OK;
}

}  // namespace f2fs
