// 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/fdio/directory.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <lib/fdio/limits.h>
#include <lib/fdio/vfs.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/sys/inspect/cpp/component.h>
#include <lib/syslog/cpp/log_settings.h>
#include <lib/syslog/cpp/macros.h>
#include <lib/zx/channel.h>

#include <block-client/cpp/block-device.h>
#include <block-client/cpp/remote-block-device.h>

//#include "third_party/f2fs-tools/f2fs_tools.h"

#include <iostream>
#include <string>

#include "third_party/f2fs/f2fs.h"

int main(int argc, const char** argv) {
  f2fs::MountOptions options;
  f2fs::MkfsOptions mkfs_options;

  std::cout << "f2fs arg= ";

  for (int i = 0; i < argc; i++) {
    std::cout << argv[i] << " ";
  }

  std::cout << std::endl;

  if (argc <= 1) {
    std::cout << "Hello F2FS!!!" << std::endl;
    fprintf(stderr, "usage: mkfs [ <options>*] devicepath f2fs\n");
    fprintf(stderr, "usage: fsck [ <options>*] devicepath f2fs\n");
    fprintf(stderr, "usage: mount [ <options>*] devicepath f2fs\n");
    return 0;
  }

  // Block device passed by handle
  zx::channel device_channel = zx::channel(zx_take_startup_handle(FS_HANDLE_BLOCK_DEVICE_ID));

  std::unique_ptr<block_client::RemoteBlockDevice> device;
  zx_status_t status = block_client::RemoteBlockDevice::Create(std::move(device_channel), &device);
  if (status != ZX_OK) {
    FX_LOGS(ERROR) << "Could not access block device";
    return -1;
  }

  std::unique_ptr<f2fs::Bcache> bc;
  bool readonly_device = false;

  if (f2fs::CreateBcache(std::move(device), &readonly_device, &bc) != ZX_OK) {
    fprintf(stderr, "f2fs: error: cannot create block cache\n");
    return -1;
  }

  // TODO: implement the fsck logic
  if (!strcmp(argv[1], "mkfs")) {
    f2fs::Mkfs(mkfs_options, std::move(bc));
  } else if (!strcmp(argv[1], "fsck")) {
    f2fs::Fsck(options, std::move(bc));
  } else if (!strcmp(argv[1], "mount")) {
    f2fs::Mount(options, std::move(bc));
  } else {
    std::cout << "F2FS: unknown operation:" << argv[1] << std::endl;
  }

  return 0;
}
