// 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.

#ifndef F2FS_MKFS_H_
#define F2FS_MKFS_H_

namespace f2fs {

constexpr uint32_t kChecksumOffset = 4092;
struct MkfsOptions {
  // TODO: Add mkfs options
  /*
   Usage: mkfs.f2fs [options] device [sectors]
  [options]:
          -l label
          -a heap-based allocation [default:0]
          -o overprovision ratio [default:5]
          -s # of segments per section [default:1]
          -z # of sections per zone [default:1]
          -e [extention list] e.g. "mp3,gif,mov"
   */

  char* label = nullptr;
  bool heap_based_allocation = false;
  uint32_t overprovision_ratio = 5;
  uint32_t num_of_seg_per_sec = 1;
  uint32_t num_of_sec_per_zone = 1;
  char* extention_list = nullptr;
};

class F2fsMkfs {
 public:
  F2fsMkfs(std::unique_ptr<f2fs::Bcache> bc, const MkfsOptions& mkfs_options);

  ~F2fsMkfs() = default;

  zx_status_t Mkfs();

 private:
  std::unique_ptr<f2fs::Bcache> bc_;
  [[maybe_unused]] const MkfsOptions& mkfs_options_;

  // F2FS Parameter
  f2fs_global_parameters f2fs_params;
  f2fs_super_block super_block;

  void InitGlobalParameters();
  zx_status_t GetDeviceInfo();
  zx_status_t FormatDevice();

  void AsciiToUnicode(uint8_t* in_buf, uint16_t* out_buf);

  inline int F2fsSetBit(uint32_t nr, uint8_t* addr);
  int8_t LogBase2(uint32_t num);
  void ConfigureExtensionList();

  zx_status_t WriteToDisk(void* buf, uint64_t offset, size_t length);

  zx_status_t PrepareSuperBlock();
  zx_status_t InitSitArea();
  zx_status_t InitNatArea();

  zx_status_t WriteCheckPointPack();
  zx_status_t WriteSuperBlock();
  zx_status_t WriteRootInode();
  zx_status_t UpdateNatRoot();
  zx_status_t AddDefaultDentryRoot();
  zx_status_t CreateRootDir();


#if 0  // porting needed
  // TODO: Trim support
  // int f2fs_trim_device()
#endif
};

}  // namespace f2fs

#endif  // F2FS_MKFS_H_
