// 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 "base/logging.h"
#include "chrome/browser/extensions/pending_extension_info.h"
#include "extensions/common/extension.h"

namespace extensions {

PendingExtensionInfo::PendingExtensionInfo(
    const std::string& id,
    const std::string& install_parameter,
    const GURL& update_url,
    const base::Version& version,
    ShouldAllowInstallPredicate should_allow_install,
    bool is_from_sync,
    Manifest::Location install_source,
    int creation_flags,
    bool mark_acknowledged,
    bool remote_install)
    : id_(id),
      update_url_(update_url),
      version_(version),
      install_parameter_(install_parameter),
      should_allow_install_(should_allow_install),
      is_from_sync_(is_from_sync),
      install_source_(install_source),
      creation_flags_(creation_flags),
      mark_acknowledged_(mark_acknowledged),
      remote_install_(remote_install) {
}

PendingExtensionInfo::PendingExtensionInfo()
    : update_url_(),
      should_allow_install_(NULL),
      is_from_sync_(true),
      install_source_(Manifest::INVALID_LOCATION),
      creation_flags_(Extension::NO_FLAGS),
      mark_acknowledged_(false),
      remote_install_(false) {
}

PendingExtensionInfo::PendingExtensionInfo(const PendingExtensionInfo& other) =
    default;

PendingExtensionInfo::~PendingExtensionInfo() {}

bool PendingExtensionInfo::operator==(const PendingExtensionInfo& rhs) const {
  return id_ == rhs.id_;
}

int PendingExtensionInfo::CompareTo(const PendingExtensionInfo& other) const {
  DCHECK_EQ(id_, other.id_);
  if (version_.IsValid() && other.version_.IsValid()) {
    int comparison = version_.CompareTo(other.version_);

    // If the versions differ then return the version comparison result.
    if (comparison != 0)
      return comparison;
  }

  // The versions aren't specified, or they are the same version. Check
  // the install source.
  if (install_source_ == other.install_source_) {
    // Same install source, so |this| has the same precedence as |other|.
    return 0;
  }

  // Different install sources; |this| has higher precedence if
  // |install_source_| is the higher priority source.
  Manifest::Location higher_priority_source =
      Manifest::GetHigherPriorityLocation(
          install_source_, other.install_source_);

  return higher_priority_source == install_source_ ? 1 : -1;
}

}  // namespace extensions
