// 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 COBALT_SRC_PB_METADATA_BUILDER_H_
#define COBALT_SRC_PB_METADATA_BUILDER_H_

#include "src/lib/util/clock.h"
#include "src/lib/util/consistent_proto_store.h"
#include "src/lib/util/datetime_util.h"
#include "src/lib/util/protected_fields.h"
#include "src/logger/project_context.h"
#include "src/pb/observation_batch.pb.h"
#include "src/pb/system_data_history.pb.h"
#include "src/registry/metric_definition.pb.h"
#include "src/registry/report_definition.pb.h"
#include "src/system_data/system_data.h"

namespace cobalt {

class MetadataBuilder {
 public:
  MetadataBuilder(system_data::SystemDataInterface &system_data,
                  std::string system_profile_cache_dir, util::FileSystem &fs)
      : MetadataBuilder(system_data, nullptr, std::move(system_profile_cache_dir), fs) {}

  MetadataBuilder(system_data::SystemDataInterface &system_data,
                  util::ValidatedClockInterface *validated_clock,
                  std::string system_profile_cache_dir, util::FileSystem &fs);

  // GetSystemProfile retrieves the full SystemProfile from the time-based storage, as selected by
  // the SystemProfileSelectionPolicy.
  [[nodiscard]] SystemProfile GetSystemProfile(const MetricDefinition &metric,
                                               const ReportDefinition &report,
                                               util::TimeInfo time_info) const;

  // Build constructs an ObservationMetadata instance based on the time-based SystemProfile selected
  // by the SystemProfileSelectionPolicy.
  //
  // Note: This only works with SystemProfileSelectionPolicies SELECT_FIRST and SELECT_LAST.
  [[nodiscard]] std::unique_ptr<ObservationMetadata> Build(const logger::MetricRef &metric,
                                                           const ReportDefinition &report,
                                                           util::TimeInfo time_info) const;

  // BuildFromProfile constructs an ObservationMetadata instance based on the provided
  // SystemProfile.
  static std::unique_ptr<ObservationMetadata> BuildFromProfile(const logger::MetricRef &metric,
                                                               const ReportDefinition &report,
                                                               uint32_t day_index,
                                                               const SystemProfile &profile);

  // SnapshotSystemData signals to MetadataBuilder that the SystemProfile may have changed, and
  // should be snapshotted.
  void SnapshotSystemData();

  // CleanupBefore is used to clean up SystemProfile snapshots that are no longer useful.
  void CleanupBefore(std::chrono::hours hours_ago);

  // CurrentSystemProfile returns a SystemProfile that has been filtered by the SystemProfileFields
  // in the given ReportDefinition.
  SystemProfile CurrentSystemProfile(const ReportDefinition &report) const;

  static void FilteredSystemProfile(const ReportDefinition &report, const SystemProfile &profile_in,
                                    SystemProfile *profile_out);

 private:
  void FilteredSystemProfile(const ReportDefinition &report, SystemProfile *profile_out) const;

  void WriteHistory(util::ProtectedFields<SystemProfileHistory>::LockedFieldsPtr history);

  util::ProtectedFields<SystemProfileHistory> system_profile_history_;

  system_data::SystemDataInterface &system_data_;
  std::unique_ptr<util::AlwaysAccurateClock> owned_clock_;
  util::ValidatedClockInterface *validated_clock_;
  std::unique_ptr<util::ConsistentProtoStore> history_store_;
};

}  // namespace cobalt

#endif  // COBALT_SRC_PB_METADATA_BUILDER_H_
