// 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-private.h"
#include <minfs/minfs.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 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(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
