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

#include "extensions/browser/updater/extension_downloader_delegate.h"

#include "base/version.h"
#include "net/base/net_errors.h"

namespace extensions {

ExtensionDownloaderDelegate::PingResult::PingResult() : did_ping(false) {}

ExtensionDownloaderDelegate::PingResult::~PingResult() = default;

ExtensionDownloaderDelegate::FailureData::FailureData()
    : network_error_code(0), fetch_tries(0) {}

// static
ExtensionDownloaderDelegate::FailureData
ExtensionDownloaderDelegate::FailureData::CreateFromNetworkResponse(
    int net_error,
    int response_code,
    int failure_count) {
  return ExtensionDownloaderDelegate::FailureData(
      -net_error,
      (net_error == net::Error::ERR_HTTP_RESPONSE_CODE_FAILURE &&
       response_code > 0)
          ? absl::optional<int>(response_code)
          : absl::nullopt,
      failure_count);
}

ExtensionDownloaderDelegate::FailureData::FailureData(
    const FailureData& other) = default;
ExtensionDownloaderDelegate::FailureData::FailureData(const int net_error_code,
                                                      const int fetch_attempts)
    : network_error_code(net_error_code), fetch_tries(fetch_attempts) {}

ExtensionDownloaderDelegate::FailureData::FailureData(
    const int net_error_code,
    const absl::optional<int> response,
    const int fetch_attempts)
    : network_error_code(net_error_code),
      response_code(response),
      fetch_tries(fetch_attempts) {}

ExtensionDownloaderDelegate::FailureData::FailureData(
    ManifestInvalidError manifest_invalid_error)
    : manifest_invalid_error(manifest_invalid_error) {}

ExtensionDownloaderDelegate::FailureData::FailureData(
    ManifestInvalidError manifest_invalid_error,
    const std::string& app_status_error)
    : manifest_invalid_error(manifest_invalid_error),
      app_status_error(app_status_error) {}

ExtensionDownloaderDelegate::FailureData::FailureData(
    const std::string& additional_info)
    : additional_info(additional_info) {}

ExtensionDownloaderDelegate::FailureData::~FailureData() = default;

ExtensionDownloaderDelegate::~ExtensionDownloaderDelegate() = default;

void ExtensionDownloaderDelegate::OnExtensionDownloadStageChanged(
    const ExtensionId& id,
    Stage stage) {}

void ExtensionDownloaderDelegate::OnExtensionUpdateFound(
    const ExtensionId& id,
    const std::set<int>& request_ids,
    const base::Version& version) {}

void ExtensionDownloaderDelegate::OnExtensionDownloadCacheStatusRetrieved(
    const ExtensionId& id,
    CacheStatus cache_status) {}

void ExtensionDownloaderDelegate::OnExtensionDownloadFailed(
    const ExtensionId& id,
    Error error,
    const PingResult& ping_result,
    const std::set<int>& request_id,
    const FailureData& data) {}

void ExtensionDownloaderDelegate::OnExtensionDownloadRetry(
    const ExtensionId& id,
    const FailureData& data) {}

void ExtensionDownloaderDelegate::OnExtensionDownloadRetryForTests() {}

bool ExtensionDownloaderDelegate::GetPingDataForExtension(
    const ExtensionId& id,
    DownloadPingData* ping) {
  return false;
}

}  // namespace extensions
