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

#include <optional>

#include <minfs/minfs.h>

#include "minfs_private.h"
#ifdef FS_WITH_METRICS
#include <minfs/metrics.h>
#include <storage-metrics/storage-metrics.h>
#endif

namespace minfs {

#ifdef FS_WITH_METRICS
MinfsMetrics::MinfsMetrics(const ::llcpp::fuchsia::minfs::Metrics* metrics)
    : FsMetrics::FsMetrics(&metrics->fs_metrics) {
  initialized_vmos = metrics->initialized_vmos;
  init_dnum_count = metrics->init_dnum_count;
  init_inum_count = metrics->init_inum_count;
  init_dinum_count = metrics->init_dinum_count;
  init_user_data_size = metrics->init_user_data_size;
  init_user_data_ticks = metrics->init_user_data_ticks;
  vnodes_opened_cache_hit = metrics->vnodes_opened_cache_hit;
}

void MinfsMetrics::CopyToFidl(::llcpp::fuchsia::minfs::Metrics* metrics) const {
  FsMetrics::CopyToFidl(&metrics->fs_metrics);

  metrics->initialized_vmos = initialized_vmos.load();
  metrics->init_dnum_count = init_dnum_count.load();
  metrics->init_inum_count = init_inum_count.load();
  metrics->init_dinum_count = init_dinum_count.load();
  metrics->init_user_data_size = init_user_data_size.load();
  metrics->init_user_data_ticks = init_user_data_ticks.load();
  metrics->vnodes_opened_cache_hit = vnodes_opened_cache_hit.load();
}

void MinfsMetrics::Dump(FILE* stream, std::optional<bool> success) const {
  FsMetrics::Dump(stream, success);

  fprintf(stream, "initialized VMOs:                   %lu\n", initialized_vmos.load());
  fprintf(stream, "initialized direct blocks:          %u\n", init_dnum_count.load());
  fprintf(stream, "initialized indirect blocks:        %u\n", init_inum_count.load());
  fprintf(stream, "initialized doubly indirect blocks: %u\n", init_dinum_count.load());
  fprintf(stream, "bytes of files initialized:         %lu\n", init_user_data_size.load());
  fprintf(stream, "ticks during initialization:        %lu\n", init_user_data_ticks.load());
  fprintf(stream, "vnodes open cache hits:             %lu\n", vnodes_opened_cache_hit.load());
}
#endif  // FS_WITH_METRICS

void Minfs::UpdateInitMetrics(uint32_t dnum_count, uint32_t inum_count, uint32_t dinum_count,
                              uint64_t user_data_size, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
  if (metrics_.Enabled()) {
    metrics_.initialized_vmos++;
    metrics_.init_user_data_size += user_data_size;
    metrics_.init_user_data_ticks += duration.get();
    metrics_.init_dnum_count += dnum_count;
    metrics_.init_inum_count += inum_count;
    metrics_.init_dinum_count += dinum_count;
  }
#endif
}

void Minfs::UpdateLookupMetrics(bool success, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
  metrics_.UpdateLookupStat(success, duration.get(), uint64_t(0));
#endif
}

void Minfs::UpdateCreateMetrics(bool success, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
  metrics_.UpdateCreateStat(success, duration.get(), 0);
#endif
}

void Minfs::UpdateReadMetrics(uint64_t size, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
  metrics_.UpdateReadStat(true, duration.get(), size);
#endif
}

void Minfs::UpdateWriteMetrics(uint64_t size, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
  metrics_.UpdateWriteStat(true, duration.get(), size);
#endif
}

void Minfs::UpdateTruncateMetrics(const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
  metrics_.UpdateTruncateStat(true, duration.get(), 0);
#endif
}

void Minfs::UpdateUnlinkMetrics(bool success, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
  metrics_.UpdateUnlinkStat(success, duration.get(), 0);
#endif
}

void Minfs::UpdateRenameMetrics(bool success, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
  metrics_.UpdateRenameStat(success, duration.get(), 0);
#endif
}

void Minfs::UpdateOpenMetrics(bool cache_hit, const fs::Duration& duration) {
#ifdef FS_WITH_METRICS
  metrics_.UpdateOpenStat(true, duration.get(), minfs::kMinfsBlockSize);
  metrics_.vnodes_opened_cache_hit += cache_hit ? 1 : 0;
#endif
}

}  // namespace minfs
