// 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/lib/vfs/cpp/journal/disk_struct.h"

#include <disk_inspector/type_utils.h>

namespace fs {

std::unique_ptr<disk_inspector::DiskStruct> GetJournalSuperblockStruct() {
  static_assert(sizeof(JournalInfo) == 40);
  std::unique_ptr<disk_inspector::DiskStruct> object =
      disk_inspector::DiskStruct::Create("Journal Superblock", sizeof(JournalInfo));
  ADD_FIELD(object, JournalInfo, magic);
  ADD_FIELD(object, JournalInfo, start_block);
  ADD_FIELD(object, JournalInfo, reserved);
  ADD_FIELD(object, JournalInfo, timestamp);
  ADD_FIELD(object, JournalInfo, checksum);
  return object;
}

std::unique_ptr<disk_inspector::DiskStruct> GetJournalPrefixStruct() {
  static_assert(offsetof(JournalPrefix, reserved) == 24);
  std::unique_ptr<disk_inspector::DiskStruct> object =
      disk_inspector::DiskStruct::Create("Journal Prefix", sizeof(JournalPrefix));
  ADD_FIELD(object, JournalPrefix, magic);
  ADD_FIELD(object, JournalPrefix, sequence_number);
  ADD_FIELD(object, JournalPrefix, flags);
  ADD_FIELD(object, JournalPrefix, reserved);
  return object;
}

std::unique_ptr<disk_inspector::DiskStruct> GetJournalHeaderBlockStruct(uint64_t index) {
  static_assert(offsetof(JournalHeaderBlock, reserved) == 8188);
  std::unique_ptr<disk_inspector::DiskStruct> object = disk_inspector::DiskStruct::Create(
      "Journal Header, Block #" + std::to_string(index), sizeof(JournalHeaderBlock));
  ADD_STRUCT_FIELD(object, JournalHeaderBlock, prefix, GetJournalPrefixStruct());
  ADD_FIELD(object, JournalHeaderBlock, payload_blocks);
  ADD_ARRAY_FIELD(object, JournalHeaderBlock, target_blocks, kMaxBlockDescriptors);
  ADD_ARRAY_FIELD(object, JournalHeaderBlock, target_flags, kMaxBlockDescriptors);
  ADD_FIELD(object, JournalHeaderBlock, reserved);
  return object;
}

std::unique_ptr<disk_inspector::DiskStruct> GetJournalCommitBlockStruct(uint64_t index) {
  static_assert(sizeof(JournalCommitBlock) == 40);
  std::unique_ptr<disk_inspector::DiskStruct> object = disk_inspector::DiskStruct::Create(
      "Journal Commit, Block #" + std::to_string(index), sizeof(JournalCommitBlock));
  ADD_STRUCT_FIELD(object, JournalCommitBlock, prefix, GetJournalPrefixStruct());
  ADD_FIELD(object, JournalCommitBlock, checksum);
  return object;
}

}  // namespace fs
