// 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_LOCAL_AGGREGATION_1_1_BACKFILL_MANAGER_H_
#define COBALT_SRC_LOCAL_AGGREGATION_1_1_BACKFILL_MANAGER_H_

#include "src/local_aggregation_1_1/aggregation_procedures/aggregation_procedure.h"
#include "src/local_aggregation_1_1/local_aggregation.pb.h"
#include "src/public/lib/clock_interfaces.h"
#include "src/public/lib/statusor/statusor.h"
#include "src/registry/metric_definition.pb.h"

namespace cobalt::local_aggregation {

// BackfillManager is responsible for computing the list of aggregation periods for which no
// observations were generated for a particular report.
class BackfillManager {
 public:
  // |total_backfill_window| The maximum number of past days (with respect to UTC) to generate
  // daily/hourly observations for. In addition, for hourly procedures, the BackfillManager may
  // return TimeInfos for previous hours of the current day.
  explicit BackfillManager(uint32_t total_backfill_window);

  // CalculateBackfill returns a list of TimeInfos corresponding to aggregation periods for which
  // observations have not yet been generated.
  //
  // |last_time_info|        The last `TimeInfo` for which an observation has been generated.
  // |end_time|              The most recent time to consider (inclusive).
  // |civil_time_converter|  Converts time points into civil times for a given time zone.
  // |metric|                The metric definition associated with the observations.
  // |is_daily|              If true, we should generate daily TimeInfos, otherwise generate hourly.
  [[nodiscard]] lib::statusor::StatusOr<std::vector<util::TimeInfo>> CalculateBackfill(
      util::TimeInfo last_time_info, std::chrono::system_clock::time_point end_time,
      const util::CivilTimeConverterInterface& civil_time_converter, const MetricDefinition& metric,
      bool is_daily) const;

 private:
  // The number of days in the past for which we should generate observations.
  uint32_t backstop_days_;
};

}  // namespace cobalt::local_aggregation

#endif  // COBALT_SRC_LOCAL_AGGREGATION_1_1_BACKFILL_MANAGER_H_
