// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "perf_test.h"

#include "common/third_party/base/anglebase/no_destructor.h"

#include <stdarg.h>
#include <stdio.h>
#include <vector>

namespace
{

std::string FormatString(const char *fmt, va_list vararg)
{
    static angle::base::NoDestructor<std::vector<char>> buffer(512);

    // Attempt to just print to the current buffer
    int len = vsnprintf(buffer->data(), buffer->size(), fmt, vararg);
    if (len < 0 || static_cast<size_t>(len) >= buffer->size())
    {
        // Buffer was not large enough, calculate the required size and resize the buffer
        len = vsnprintf(NULL, 0, fmt, vararg);
        buffer->resize(len + 1);

        // Print again
        vsnprintf(buffer->data(), buffer->size(), fmt, vararg);
    }

    return std::string(buffer->data(), len);
}

std::string StringPrintf(const char *fmt, ...)
{
    va_list vararg;
    va_start(vararg, fmt);
    std::string result = FormatString(fmt, vararg);
    va_end(vararg);
    return result;
}

std::string NumberToString(size_t value)
{
    return StringPrintf("%u", value);
}

std::string NumberToString(double value)
{
    return StringPrintf("%.10lf", value);
}

std::string ResultsToString(const std::string &measurement,
                            const std::string &modifier,
                            const std::string &trace,
                            const std::string &values,
                            const std::string &prefix,
                            const std::string &suffix,
                            const std::string &units,
                            bool important)
{
    // <*>RESULT <graph_name>: <trace_name>= <value> <units>
    // <*>RESULT <graph_name>: <trace_name>= {<mean>, <std deviation>} <units>
    // <*>RESULT <graph_name>: <trace_name>= [<value>,value,value,...,] <units>
    return StringPrintf("%sRESULT %s%s: %s= %s%s%s %s\n", important ? "*" : "", measurement.c_str(),
                        modifier.c_str(), trace.c_str(), prefix.c_str(), values.c_str(),
                        suffix.c_str(), units.c_str());
}

void PrintResultsImpl(const std::string &measurement,
                      const std::string &modifier,
                      const std::string &trace,
                      const std::string &values,
                      const std::string &prefix,
                      const std::string &suffix,
                      const std::string &units,
                      bool important)
{
    fflush(stdout);
    printf("%s",
           ResultsToString(measurement, modifier, trace, values, prefix, suffix, units, important)
               .c_str());
    fflush(stdout);
}

}  // namespace

namespace perf_test
{

void PrintResult(const std::string &measurement,
                 const std::string &modifier,
                 const std::string &trace,
                 size_t value,
                 const std::string &units,
                 bool important)
{
    PrintResultsImpl(measurement, modifier, trace, NumberToString(value), std::string(),
                     std::string(), units, important);
}

void PrintResult(const std::string &measurement,
                 const std::string &modifier,
                 const std::string &trace,
                 double value,
                 const std::string &units,
                 bool important)
{
    PrintResultsImpl(measurement, modifier, trace, NumberToString(value), std::string(),
                     std::string(), units, important);
}

void AppendResult(std::string &output,
                  const std::string &measurement,
                  const std::string &modifier,
                  const std::string &trace,
                  size_t value,
                  const std::string &units,
                  bool important)
{
    output += ResultsToString(measurement, modifier, trace, NumberToString(value), std::string(),
                              std::string(), units, important);
}

void PrintResult(const std::string &measurement,
                 const std::string &modifier,
                 const std::string &trace,
                 const std::string &value,
                 const std::string &units,
                 bool important)
{
    PrintResultsImpl(measurement, modifier, trace, value, std::string(), std::string(), units,
                     important);
}

void AppendResult(std::string &output,
                  const std::string &measurement,
                  const std::string &modifier,
                  const std::string &trace,
                  const std::string &value,
                  const std::string &units,
                  bool important)
{
    output += ResultsToString(measurement, modifier, trace, value, std::string(), std::string(),
                              units, important);
}

void PrintResultMeanAndError(const std::string &measurement,
                             const std::string &modifier,
                             const std::string &trace,
                             const std::string &mean_and_error,
                             const std::string &units,
                             bool important)
{
    PrintResultsImpl(measurement, modifier, trace, mean_and_error, "{", "}", units, important);
}

void AppendResultMeanAndError(std::string &output,
                              const std::string &measurement,
                              const std::string &modifier,
                              const std::string &trace,
                              const std::string &mean_and_error,
                              const std::string &units,
                              bool important)
{
    output +=
        ResultsToString(measurement, modifier, trace, mean_and_error, "{", "}", units, important);
}

void PrintResultList(const std::string &measurement,
                     const std::string &modifier,
                     const std::string &trace,
                     const std::string &values,
                     const std::string &units,
                     bool important)
{
    PrintResultsImpl(measurement, modifier, trace, values, "[", "]", units, important);
}

void AppendResultList(std::string &output,
                      const std::string &measurement,
                      const std::string &modifier,
                      const std::string &trace,
                      const std::string &values,
                      const std::string &units,
                      bool important)
{
    output += ResultsToString(measurement, modifier, trace, values, "[", "]", units, important);
}

void PrintSystemCommitCharge(const std::string &test_name, size_t charge, bool important)
{
    PrintSystemCommitCharge(stdout, test_name, charge, important);
}

void PrintSystemCommitCharge(FILE *target,
                             const std::string &test_name,
                             size_t charge,
                             bool important)
{
    fprintf(target, "%s", SystemCommitChargeToString(test_name, charge, important).c_str());
}

std::string SystemCommitChargeToString(const std::string &test_name, size_t charge, bool important)
{
    std::string trace_name(test_name);
    std::string output;
    AppendResult(output, "commit_charge", std::string(), "cc" + trace_name, charge, "kb",
                 important);
    return output;
}

}  // namespace perf_test
