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

#pragma once

#include <memory>
#include <set>
#include <string>
#include <vector>

#include <fbl/macros.h>
#include <lib/ftl/ndm-driver.h>
#include <zircon/types.h>

#include <lib/mtd/nand-interface.h>

namespace ftl_mtd {

constexpr uint32_t kMinimumOobSize = 16;

class NandVolumeDriver : public ftl::NdmBaseDriver {
 public:
  // Creates an instance of NandVolumeDriver.
  // |max_bad_blocks| should be less than the number of blocks exposed by |interface|.
  static zx_status_t Create(uint32_t block_offset, uint32_t max_bad_blocks,
                            std::unique_ptr<mtd::NandInterface> interface,
                            std::unique_ptr<NandVolumeDriver>* out);

  virtual ~NandVolumeDriver() {}

  // NdmBaseDriver interface:
  const char* Init();
  const char* Attach(const ftl::Volume* ftl_volume);
  bool Detach();
  int NandWrite(uint32_t start_page, uint32_t page_count, const void* page_buffer,
                const void* oob_buffer);
  int NandRead(uint32_t start_page, uint32_t page_count, void* page_buffer, void* oob_buffer);
  int NandErase(uint32_t page_num);
  int IsBadBlock(uint32_t page_num);
  bool IsEmptyPage(uint32_t page_num, const uint8_t* page_buffer, const uint8_t* oob_buffer);
  uint32_t PageSize() final;
  uint8_t SpareSize() final;

  DISALLOW_COPY_ASSIGN_AND_MOVE(NandVolumeDriver);

 private:
  NandVolumeDriver(uint32_t byte_offset, uint32_t max_bad_blocks, uint32_t page_multiplier,
                   std::unique_ptr<mtd::NandInterface> interface);

  zx_status_t ReadPageAndOob(uint32_t byte_offset, void* page_buffer, void* oob_buffer);

  zx_status_t GetPageIndices(uint32_t mapped_page, uint32_t mapped_page_count, uint32_t* start_page,
                             uint32_t* end_page);
  uint32_t GetBlockOffsetForPage(uint32_t real_page);
  uint32_t GetByteOffsetForPage(uint32_t real_page);

  uint32_t ByteOffset();

  uint32_t block_offset_;
  uint32_t page_multiplier_;
  uint32_t max_bad_blocks_;
  std::unique_ptr<mtd::NandInterface> interface_;
};

}  // namespace ftl_mtd
