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

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;
  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;
};

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

  ~F2fsMkfs() {}

  zx_status_t Mkfs();

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

  // F2FS Parameter
  struct f2fs_global_parameters f2fs_params;
  struct f2fs_super_block super_block;

  void F2fsInitGlobalParameters();
  zx_status_t F2fsGetDeviceInfo();
  int8_t F2fsFormatDevice();

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

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

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

  zx_status_t F2fsPrepareSuperBlock();
  zx_status_t F2fsInitSitArea();
  zx_status_t F2fsInitNatArea();

  zx_status_t F2fsWriteCheckPointPack();
  zx_status_t F2fsWriteSuperBlock();
  zx_status_t F2fsWriteRootInode();
  zx_status_t F2fsUpdateNatRoot();
  zx_status_t F2fsAddDefaultDentryRoot();
  zx_status_t F2fsCreateRootDir();


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

}  // namespace f2fs

#endif  // F2FS_MKFS_H_
