// Copyright 2014 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 "components/update_client/ping_manager.h"

#include <stddef.h>

#include <memory>
#include <string>
#include <utility>
#include <vector>

#include "base/bind.h"
#include "base/location.h"
#include "base/logging.h"
#include "base/macros.h"
#include "base/task/sequenced_task_runner.h"
#include "components/update_client/component.h"
#include "components/update_client/configurator.h"
#include "components/update_client/protocol_definition.h"
#include "components/update_client/protocol_handler.h"
#include "components/update_client/protocol_serializer.h"
#include "components/update_client/request_sender.h"
#include "components/update_client/utils.h"
#include "url/gurl.h"

namespace update_client {

namespace {

const int kErrorNoEvents = -1;
const int kErrorNoUrl = -2;

// When building for STARBOARD add the PingSender to the update_client namespace
// as we keep a reference to it in PingManager.
#if defined(STARBOARD)
}
#endif

// An instance of this class can send only one ping.
class PingSender : public base::RefCountedThreadSafe<PingSender> {
 public:
  using Callback = PingManager::Callback;
  explicit PingSender(scoped_refptr<Configurator> config);
  void SendPing(const Component& component, Callback callback);

#if defined(STARBOARD)
  void Cancel();
#endif

 protected:
  virtual ~PingSender();

 private:
  friend class base::RefCountedThreadSafe<PingSender>;
  void SendPingComplete(int error,
                        const std::string& response,
                        int retry_after_sec);

  SEQUENCE_CHECKER(sequence_checker_);

  const scoped_refptr<Configurator> config_;
  Callback callback_;
  std::unique_ptr<RequestSender> request_sender_;

  DISALLOW_COPY_AND_ASSIGN(PingSender);
};

PingSender::PingSender(scoped_refptr<Configurator> config) : config_(config) {}

PingSender::~PingSender() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
}

void PingSender::SendPing(const Component& component, Callback callback) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

#if defined(STARBOARD)
  LOG(INFO) << "PingSender::SendPing";
#endif

  if (component.events().empty()) {
    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
        FROM_HERE, base::BindOnce(std::move(callback), kErrorNoEvents, ""));
    return;
  }

  DCHECK(component.crx_component());

  auto urls(config_->PingUrl());
  if (component.crx_component()->requires_network_encryption)
    RemoveUnsecureUrls(&urls);

  if (urls.empty()) {
    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
        FROM_HERE, base::BindOnce(std::move(callback), kErrorNoUrl, ""));
    return;
  }

  callback_ = std::move(callback);

  std::vector<protocol_request::App> apps;
  apps.push_back(MakeProtocolApp(component.id(),
                                 component.crx_component()->version,
                                 component.GetEvents()));
  request_sender_ = std::make_unique<RequestSender>(config_);
  request_sender_->Send(
      urls, {},
      config_->GetProtocolHandlerFactory()->CreateSerializer()->Serialize(
          MakeProtocolRequest(
              component.session_id(), config_->GetProdId(),
              config_->GetBrowserVersion().GetString(), config_->GetLang(),
              config_->GetChannel(), config_->GetOSLongName(),
              config_->GetDownloadPreference(), config_->ExtraRequestParams(),
              nullptr, std::move(apps))),
      false, base::BindOnce(&PingSender::SendPingComplete, this));
}

#if defined(STARBOARD)
void PingSender::Cancel() {
  LOG(INFO) << "PingSender::Cancel";
  if (request_sender_.get()) {
    request_sender_->Cancel();
  }
}
#endif

void PingSender::SendPingComplete(int error,
                                  const std::string& response,
                                  int retry_after_sec) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  std::move(callback_).Run(error, response);
}

#if !defined(STARBOARD)
}  // namespace
#endif

PingManager::PingManager(scoped_refptr<Configurator> config)
    : config_(config) {
#if defined(STARBOARD)
  LOG(INFO) << "PingManager::PingManager";
#endif
}

#if defined(STARBOARD)
void PingManager::Cancel() {
  LOG(INFO) << "PingManager::Cancel";
  if (ping_sender_.get()) {
    ping_sender_->Cancel();
  }
}
#endif

PingManager::~PingManager() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
#if defined(STARBOARD)
  LOG(INFO) << "PingManager::~PingManager";
#endif
}

void PingManager::SendPing(const Component& component, Callback callback) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);

#if defined(STARBOARD)
  LOG(INFO) << "PingManager::SendPing";

  ping_sender_ = base::MakeRefCounted<PingSender>(config_);
  ping_sender_->SendPing(component, std::move(callback));
#else
  auto ping_sender = base::MakeRefCounted<PingSender>(config_);
  ping_sender->SendPing(component, std::move(callback));
#endif
}

}  // namespace update_client
