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

#ifndef THIRD_PARTY_CLEARCUT_LOGGER_H_
#define THIRD_PARTY_CLEARCUT_LOGGER_H_

#include <chrono>
#include <memory>
#include <vector>

#include "third_party/abseil-cpp/absl/strings/escaping.h"
#include "third_party/clearcut/clearcut.pb.h"
#include "third_party/clearcut/http_client.h"
#include "third_party/statusor/statusor.h"
#include "util/status.h"

namespace clearcut {

static const int32_t kClearcutDemoSource = 177;
static const int32_t kFuchsiaCobaltShufflerInputDevel = 844;

static const int32_t kFuchsiaClientType = 17;
static const int32_t kMaxRetries = 5;

// A ClearcutUploader sends events to clearcut using the given HTTPClient.
//
// Note: This class is not threadsafe.
class ClearcutUploader {
 public:
  ClearcutUploader(const std::string &url, std::unique_ptr<HTTPClient> client,
                   int64_t upload_timeout = 0,
                   int64_t initial_backoff_millis = 250);

  // Uploads the |log_request|  with retries.
  Status UploadEvents(LogRequest *log_request,
                      int32_t max_retries = kMaxRetries);

 private:
  // Tries once to upload |log_request|.
  Status TryUploadEvents(LogRequest *log_request,
                         std::chrono::steady_clock::time_point deadline);

  const std::string url_;
  const std::unique_ptr<HTTPClient> client_;
  const int64_t upload_timeout_;
  const int64_t initial_backoff_millis_;

 protected:
  friend class UploaderTest;

  // When we get a next_request_wait_millis from the clearcut server, we set
  // this value to now() + next_request_wait_millis.
  std::chrono::steady_clock::time_point pause_uploads_until_;
};

}  // namespace clearcut

#endif  // THIRD_PARTY_CLEARCUT_LOGGER_H_
