// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.

#include <array>
#include <chrono>
#include <numeric>
#include <string>
#include <vector>

#include "fmt/format.h"
#include "wpi/DataLog.h"

int main(int argc, char** argv) {
  using std::chrono::duration_cast;
  using std::chrono::high_resolution_clock;
  using std::chrono::microseconds;

  int kNumRuns = 10;

  if (argc == 2) {
    kNumRuns = std::stoi(argv[1]);
  }

  wpi::log::DataLog log;
  log.SetFilename("test.wpilog");

  auto testVec =
      std::vector<std::pair<std::string, void (*)(wpi::log::DataLog&)>>();

  testVec.push_back({"50 double append", [](auto& log) {
                       wpi::log::DoubleLogEntry entry{log, "fifty", 1};
                       for (int i = 0; i < 50; ++i) {
                         entry.Append(1.3 * i, 20000 * i);
                       }
                     }});
#if 0
  testVec.push_back({"500k double append", [](auto& log) {
                       wpi::log::DoubleLogEntry entry{log, "500k", 1};
                       for (uint64_t i = 0; i < 500000; ++i) {
                         entry.Append(1.3 * i, 20000 * i);
                       }
                     }});
#endif
  testVec.push_back({"50 string append", [](auto& log) {
                       wpi::log::StringLogEntry entry{log, "string", 1};
                       for (int i = 0; i < 50; ++i) {
                         entry.Append("hello", 20000 * i);
                       }
                     }});

  testVec.push_back(
      {"Double array append", [](auto& log) {
         wpi::log::DoubleArrayLogEntry entry{log, "double_array", 1};
         entry.Append({1, 2, 3}, 20000);
         entry.Append({4, 5}, 30000);
       }});

  testVec.push_back(
      {"String array append", [](auto& log) {
         wpi::log::StringArrayLogEntry entry{log, "string_array", 1};
         entry.Append({"Hello", "World"}, 20000);
         entry.Append({"This", "Is", "Fun"}, 30000);
       }});

  for (const auto& [name, fn] : testVec) {
    auto resVec = std::vector<microseconds::rep>();
    fmt::print("{}: ", name);

    for (int i = 0; i < kNumRuns; ++i) {
      auto start = high_resolution_clock::now();
      fn(log);
      auto stop = high_resolution_clock::now();
      resVec.push_back(duration_cast<microseconds>(stop - start).count());
    }

    fmt::print("{}us\n",
               std::accumulate(resVec.begin(), resVec.end(), 0) / kNumRuns);
  }

  return EXIT_SUCCESS;
}
