// Copyright 2020 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 "src/storage/minfs/inspector/disk_struct.h"

#include <zircon/assert.h>

#include <disk_inspector/disk_struct.h>
#include <disk_inspector/type_utils.h>

#include "src/storage/minfs/format.h"

namespace minfs {

std::unique_ptr<disk_inspector::DiskStruct> GetSuperblockStruct() {
  static_assert(offsetof(Superblock, reserved) == 120);
  std::unique_ptr<disk_inspector::DiskStruct> object =
      disk_inspector::DiskStruct::Create("Superblock", sizeof(Superblock));
  ADD_FIELD(object, Superblock, magic0);
  ADD_FIELD(object, Superblock, magic1);
  ADD_FIELD(object, Superblock, format_version);
  ADD_FIELD(object, Superblock, checksum);
  ADD_FIELD(object, Superblock, generation_count);
  ADD_FIELD(object, Superblock, flags);
  ADD_FIELD(object, Superblock, block_size);
  ADD_FIELD(object, Superblock, inode_size);
  ADD_FIELD(object, Superblock, block_count);
  ADD_FIELD(object, Superblock, inode_count);
  ADD_FIELD(object, Superblock, alloc_block_count);
  ADD_FIELD(object, Superblock, alloc_inode_count);
  ADD_FIELD(object, Superblock, ibm_block);
  ADD_FIELD(object, Superblock, abm_block);
  ADD_FIELD(object, Superblock, ino_block);
  ADD_FIELD(object, Superblock, integrity_start_block);
  ADD_FIELD(object, Superblock, dat_block);
  ADD_FIELD(object, Superblock, slice_size);
  ADD_FIELD(object, Superblock, ibm_slices);
  ADD_FIELD(object, Superblock, abm_slices);
  ADD_FIELD(object, Superblock, ino_slices);
  ADD_FIELD(object, Superblock, integrity_slices);
  ADD_FIELD(object, Superblock, dat_slices);
  ADD_FIELD(object, Superblock, unlinked_head);
  ADD_FIELD(object, Superblock, unlinked_tail);
  ADD_FIELD(object, Superblock, oldest_revision);
  ADD_ARRAY_FIELD(object, Superblock, reserved, 2018);
  return object;
}

std::unique_ptr<disk_inspector::DiskStruct> GetInodeStruct(uint64_t index) {
  static_assert(sizeof(Inode) == 256);
  std::unique_ptr<disk_inspector::DiskStruct> object =
      disk_inspector::DiskStruct::Create("Inode " + std::to_string(index), sizeof(Inode));
  ADD_FIELD(object, Inode, magic);
  ADD_FIELD(object, Inode, size);
  ADD_FIELD(object, Inode, block_count);
  ADD_FIELD(object, Inode, link_count);
  ADD_FIELD(object, Inode, create_time);
  ADD_FIELD(object, Inode, modify_time);
  ADD_FIELD(object, Inode, seq_num);
  ADD_FIELD(object, Inode, gen_num);
  ADD_FIELD(object, Inode, dirent_count);
  ADD_FIELD(object, Inode, last_inode);
  ADD_FIELD(object, Inode, next_inode);
  ADD_ARRAY_FIELD(object, Inode, rsvd, 3);
  ADD_ARRAY_FIELD(object, Inode, dnum, kMinfsDirect);
  ADD_ARRAY_FIELD(object, Inode, inum, kMinfsIndirect);
  ADD_ARRAY_FIELD(object, Inode, dinum, kMinfsDoublyIndirect);
  return object;
}

}  // namespace minfs
