// Copyright 2020 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.

#include "src/developer/debug/zxdb/client/google_analytics_client.h"

#include <lib/fit/bridge.h>
#include <lib/syslog/cpp/macros.h>

#include "src/developer/debug/zxdb/client/curl.h"
#include "src/lib/fxl/strings/substitute.h"

namespace zxdb {

namespace {

std::shared_ptr<Curl> PrepareCurl(std::string_view user_agent) {
  auto curl = Curl::MakeShared();

  curl->SetURL(GoogleAnalyticsClient::kEndpoint);
  curl->headers().emplace_back(fxl::Substitute("User-Agent: $0", user_agent));

  return curl;
}

bool IsResponseCodeSuccess(long response_code) {
  return response_code >= 200 && response_code < 300;
}

fit::promise<void, GoogleAnalyticsNetError> CurlPerformAsync(const std::shared_ptr<Curl>& curl) {
  FX_DCHECK(curl);

  fit::bridge<void, GoogleAnalyticsNetError> bridge;
  curl->Perform([completer = std::move(bridge.completer)](Curl* curl, Curl::Error result) mutable {
    auto response_code = curl->ResponseCode();
    if (!result && IsResponseCodeSuccess(response_code)) {
      completer.complete_ok();
    } else if (result) {
      completer.complete_error(GoogleAnalyticsNetError(
          GoogleAnalyticsNetErrorType::kConnectionError, result.ToString()));
    } else {
      completer.complete_error(GoogleAnalyticsNetError(
          GoogleAnalyticsNetErrorType::kUnexpectedResponseCode, std::to_string(response_code)));
    }
  });
  return bridge.consumer.promise_or(
      fit::error(GoogleAnalyticsNetError(GoogleAnalyticsNetErrorType::kAbandoned)));
}

}  // namespace

void GoogleAnalyticsClient::CurlGlobalInit() {
  auto status = curl_global_init(CURL_GLOBAL_ALL);
  FX_DCHECK(status == CURLE_OK);
}

void GoogleAnalyticsClient::CurlGlobalCleanup() { curl_global_cleanup(); }

fit::promise<void, GoogleAnalyticsNetError> GoogleAnalyticsClient::SendData(
    std::string_view user_agent, const std::map<std::string, std::string>& parameters) const {
  auto curl = PrepareCurl(user_agent);
  curl->set_post_data(parameters);
  return CurlPerformAsync(curl);
}

}  // namespace zxdb
