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

#ifndef SRC_STORAGE_FVM_DRIVER_DIAGNOSTICS_H_
#define SRC_STORAGE_FVM_DRIVER_DIAGNOSTICS_H_

#include <lib/inspect/cpp/inspect.h>
#include <lib/inspect/cpp/vmo/types.h>
#include <lib/zx/vmo.h>

#include <string>
#include <vector>

namespace fvm {

// Diagnostics exposes internal information and metrics recorded by FVM to the rest of the system
// via the Inspect API.
// This object owns a VMO which it publishes metrics into; this VMO is read by the inspect
// framework and can be accessed through (e.g.) iquery.
// This class is thread-safe and movable.
class Diagnostics {
 public:
  Diagnostics();
  ~Diagnostics() = default;
  Diagnostics(Diagnostics&& o) noexcept = default;
  Diagnostics& operator=(Diagnostics&& o) noexcept = default;
  Diagnostics(const Diagnostics& o) = delete;
  Diagnostics& operator=(const Diagnostics& o) = delete;

  struct OnMountArgs {
    // Version of the filesystem
    uint64_t major_version = 0;
    // Oldest revision driver which has touched of the filesystem
    uint64_t oldest_minor_version = 0;
    // Slice size (bytes)
    uint64_t slice_size = 0;
    // Number of slices
    uint64_t num_slices = 0;
    // Partition table size (number of entries)
    uint64_t partition_table_entries = 0;
    // Total number of partition entries the FVM instance can accommodate
    uint64_t partition_table_reserved_entries = 0;
    // Partition table size (number of entries)
    uint64_t allocation_table_entries = 0;
    // Total number of slice entries the FVM instance can accommodate
    uint64_t allocation_table_reserved_entries = 0;
    // Number of slices reserved
    uint64_t num_reserved_slices = 0;
    struct Partition {
      // Name of the partition
      std::string name;
      // Number of slices reserved for the partition
      uint64_t num_slices = 0;
    };
    std::vector<Partition> partitions{};
  };
  // Reports the initial state of the FVM instance. Should be called once on mount.
  void OnMount(OnMountArgs args);

  // Reports the metrics stored for a partition.
  void UpdatePartitionMetrics(const std::string& partition_name, size_t num_slices);

  // Update the partition's size limit metric.
  void UpdateMaxBytes(const std::string& partition_name, size_t max_bytes);

  // Returns a read-only duplicate of the VMO this object writes to. Suitable for giving out to an
  // external process which would like to subscribe to FVM's diagnostics.
  zx::vmo DuplicateVmo() { return inspector_.DuplicateVmo(); }

 private:
  inspect::Inspector inspector_;

  // Root node. We add this in so that we can label everything with an `fvm` prefix.
  inspect::Node root_;

  // Metrics collected once at mount time.
  inspect::Node mount_time_;

  inspect::UintProperty mount_time_major_version_;
  inspect::UintProperty mount_time_oldest_minor_version_;
  // The version combo property is constructed at mount time instead of being passed in. It is of
  // the format <format-version>/<oldest-revision>.
  inspect::StringProperty mount_time_version_combo_;
  inspect::UintProperty mount_time_slice_size_;
  inspect::UintProperty mount_time_num_slices_;
  inspect::UintProperty mount_time_partition_table_entries_;
  inspect::UintProperty mount_time_partition_table_reserved_entries_;
  inspect::UintProperty mount_time_allocation_table_entries_;
  inspect::UintProperty mount_time_allocation_table_reserved_entries_;
  inspect::UintProperty mount_time_num_partitions_;
  inspect::UintProperty mount_time_num_reserved_slices_;

  struct PerPartitionMetrics {
    // Root node which all of the per-partition metrics live under.
    inspect::Node root;

    inspect::UintProperty total_slices_reserved;
    inspect::UintProperty max_bytes;
  };
  inspect::Node per_partition_node_;
  // Maps vpartition names to an object holding metrics for that vpartition.
  std::map<std::string, PerPartitionMetrics, std::less<>> per_partition_;

  void AddPerPartitionMetrics(std::string name, uint64_t num_slices);
};

}  // namespace fvm

#endif  // SRC_STORAGE_FVM_DRIVER_DIAGNOSTICS_H_
