//
//
// Copyright 2015 gRPC 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
//
//     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.
//
//

#ifndef GRPC_TEST_CPP_QPS_REPORT_H
#define GRPC_TEST_CPP_QPS_REPORT_H

#include <memory>
#include <set>
#include <vector>

#include <grpcpp/channel.h>
#include <grpcpp/support/config.h>

#include "src/proto/grpc/testing/report_qps_scenario_service.grpc.pb.h"
#include "test/cpp/qps/driver.h"

namespace grpc {
namespace testing {

/// Interface for all reporters.
class Reporter {
 public:
  /// Construct a reporter with the given \a name.
  explicit Reporter(const string& name) : name_(name) {}

  virtual ~Reporter() {}

  /// Returns this reporter's name.
  ///
  /// Names are constants, set at construction time.
  string name() const { return name_; }

  /// Reports QPS for the given \a result.
  virtual void ReportQPS(const ScenarioResult& result) = 0;

  /// Reports QPS per core as (YYY/server core).
  virtual void ReportQPSPerCore(const ScenarioResult& result) = 0;

  /// Reports latencies for the 50, 90, 95, 99 and 99.9 percentiles, in ms.
  virtual void ReportLatency(const ScenarioResult& result) = 0;

  /// Reports system and user time for client and server systems.
  virtual void ReportTimes(const ScenarioResult& result) = 0;

  /// Reports server cpu usage.
  virtual void ReportCpuUsage(const ScenarioResult& result) = 0;

  /// Reports client and server poll usage inside completion queue.
  virtual void ReportPollCount(const ScenarioResult& result) = 0;

  /// Reports queries per cpu-sec.
  virtual void ReportQueriesPerCpuSec(const ScenarioResult& result) = 0;

 private:
  const string name_;
};

/// A composite for all reporters to be considered.
class CompositeReporter : public Reporter {
 public:
  CompositeReporter() : Reporter("CompositeReporter") {}

  /// Adds a \a reporter to the composite.
  void add(std::unique_ptr<Reporter> reporter);

  void ReportQPS(const ScenarioResult& result) override;
  void ReportQPSPerCore(const ScenarioResult& result) override;
  void ReportLatency(const ScenarioResult& result) override;
  void ReportTimes(const ScenarioResult& result) override;
  void ReportCpuUsage(const ScenarioResult& result) override;
  void ReportPollCount(const ScenarioResult& result) override;
  void ReportQueriesPerCpuSec(const ScenarioResult& result) override;

 private:
  std::vector<std::unique_ptr<Reporter> > reporters_;
};

/// Reporter to gpr_log(GPR_INFO).
class GprLogReporter : public Reporter {
 public:
  explicit GprLogReporter(const string& name) : Reporter(name) {}

 private:
  void ReportQPS(const ScenarioResult& result) override;
  void ReportQPSPerCore(const ScenarioResult& result) override;
  void ReportLatency(const ScenarioResult& result) override;
  void ReportTimes(const ScenarioResult& result) override;
  void ReportCpuUsage(const ScenarioResult& result) override;
  void ReportPollCount(const ScenarioResult& result) override;
  void ReportQueriesPerCpuSec(const ScenarioResult& result) override;
};

/// Dumps the report to a JSON file.
class JsonReporter : public Reporter {
 public:
  JsonReporter(const string& name, const string& report_file)
      : Reporter(name), report_file_(report_file) {}

 private:
  void ReportQPS(const ScenarioResult& result) override;
  void ReportQPSPerCore(const ScenarioResult& result) override;
  void ReportLatency(const ScenarioResult& result) override;
  void ReportTimes(const ScenarioResult& result) override;
  void ReportCpuUsage(const ScenarioResult& result) override;
  void ReportPollCount(const ScenarioResult& result) override;
  void ReportQueriesPerCpuSec(const ScenarioResult& result) override;

  const string report_file_;
};

class RpcReporter : public Reporter {
 public:
  RpcReporter(const string& name, const std::shared_ptr<grpc::Channel>& channel)
      : Reporter(name), stub_(ReportQpsScenarioService::NewStub(channel)) {}

 private:
  void ReportQPS(const ScenarioResult& result) override;
  void ReportQPSPerCore(const ScenarioResult& result) override;
  void ReportLatency(const ScenarioResult& result) override;
  void ReportTimes(const ScenarioResult& result) override;
  void ReportCpuUsage(const ScenarioResult& result) override;
  void ReportPollCount(const ScenarioResult& result) override;
  void ReportQueriesPerCpuSec(const ScenarioResult& result) override;

  std::unique_ptr<ReportQpsScenarioService::Stub> stub_;
};

}  // namespace testing
}  // namespace grpc

#endif  // GRPC_TEST_CPP_QPS_REPORT_H
