// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// 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
//
//     http://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.

#include <cstdio>
#include <map>

#include "base/json/json_writer.h"
#include "base/logging.h"
#include "base/values.h"
#include "cobalt/base/wrap_main.h"
#include "cobalt/trace_event/benchmark.h"

namespace {

using cobalt::trace_event::Benchmark;
using cobalt::trace_event::BenchmarkResultsMap;

void Output(const char* message) {
#if defined(COBALT_BUILD_TYPE_GOLD)
  // Logging is compiled out in gold, so write directly to stdout instead.
  // There is no need to synchronize, as nothing else will be logging.
  std::fputs(message, stdout);
  std::fflush(stdout);
#else
  RAW_LOG(INFO, message);
#endif
}

void JsonPrint(const BenchmarkResultsMap& benchmarks) {
  scoped_ptr<base::DictionaryValue> compilation(new base::DictionaryValue);
  for (BenchmarkResultsMap::const_iterator benchmark = benchmarks.begin();
       benchmark != benchmarks.end(); ++benchmark) {
    const std::string& name = benchmark->first;
    const std::vector<Benchmark::Result>& results = benchmark->second;
    scoped_ptr<base::DictionaryValue> benchmark_value(
        new base::DictionaryValue);
    for (std::vector<Benchmark::Result>::const_iterator result =
             results.begin();
         result != results.end(); ++result) {
      scoped_ptr<base::DictionaryValue> result_value(new base::DictionaryValue);
      if (!result->samples.empty()) {
        int count = result->samples.size();
        double average = 0;
        double minimum = result->samples[0];
        double maximum = result->samples[0];
        for (std::vector<double>::const_iterator sample =
                 result->samples.begin();
             sample != result->samples.end(); ++sample) {
          average += *sample;
          minimum = std::min(minimum, *sample);
          maximum = std::max(maximum, *sample);
        }
        average /= result->samples.size();
        result_value->SetIntegerWithoutPathExpansion("Samples", count);
        result_value->SetDoubleWithoutPathExpansion("Average", average);
        result_value->SetDoubleWithoutPathExpansion("Minimum", minimum);
        result_value->SetDoubleWithoutPathExpansion("Maximum", maximum);
      }
      benchmark_value->SetWithoutPathExpansion(result->name,
                                               result_value.release());
    }
    compilation->SetWithoutPathExpansion(name, benchmark_value.release());
  }
  std::string print_string;
  base::JSONWriter::WriteWithOptions(
      compilation.get(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &print_string);

  std::string result = "---Benchmark Results Start---\n" + print_string +
                       "---Benchmark Results End---\n";
  Output(result.c_str());
}

int RunnerMain(int argc, char** argv) {
  BenchmarkResultsMap benchmarks =
      cobalt::trace_event::BenchmarkRegistrar::GetInstance()
          ->ExecuteBenchmarks();
  JsonPrint(benchmarks);
  return 0;
}

}  // namespace

COBALT_WRAP_SIMPLE_MAIN(RunnerMain);
