// Copyright 2023 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#pragma once

#include <cstdint>
#include <limits>

#include "pw_assert/assert.h"
#include "pw_perf_test/event_handler.h"
#include "pw_perf_test/internal/timer.h"

namespace pw::perf_test {

// Forward declaration.
class State;

namespace internal {

// Allows access to the private State object constructor
State CreateState(int durations,
                  EventHandler& event_handler,
                  const char* test_name);

}  // namespace internal

/// Records the performance of a test case over many iterations.
class State {
 public:
  // KeepRunning() should be called in a while loop. Responsible for managing
  // iterations and timestamps.
  bool KeepRunning();

 private:
  // Allows the framework to create state objects and unit tests for the state
  // class
  friend State internal::CreateState(int durations,
                                     EventHandler& event_handler,
                                     const char* test_name);

  // Privated constructor to prevent unauthorized instances of the state class.
  constexpr State(int iterations,
                  EventHandler& event_handler,
                  const char* test_name)
      : test_iterations_(iterations),
        iteration_start_(),
        event_handler_(&event_handler),
        test_info{.name = test_name} {
    PW_ASSERT(test_iterations_ > 0);
  }

  int64_t mean_ = -1;

  // Stores the total number of iterations wanted
  int test_iterations_;

  // Stores the total duration of the tests.
  int64_t total_duration_ = 0;

  // Smallest value of the iterations
  int64_t min_ = std::numeric_limits<int64_t>::max();

  // Largest value of the iterations
  int64_t max_ = std::numeric_limits<int64_t>::min();

  // Time at the start of the iteration
  internal::Timestamp iteration_start_;

  // The current iteration.
  int current_iteration_ = -1;

  EventHandler* event_handler_;

  TestCase test_info;
};

}  // namespace pw::perf_test
