// Copyright 2015 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 "chrome/browser/ui/app_list/search/launcher_search/launcher_search_result.h"

#include <utility>

#include "ash/public/cpp/app_list/app_list_constants.h"
#include "base/memory/ptr_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/chromeos/launcher_search_provider/launcher_search_provider_service.h"
#include "chrome/browser/ui/app_list/search/launcher_search/launcher_search_icon_image_loader_impl.h"
#include "chrome/browser/ui/app_list/search/search_util.h"

using chromeos::launcher_search_provider::Service;

namespace {

const char kResultIdDelimiter = ':';

}  // namespace

namespace app_list {

LauncherSearchResult::LauncherSearchResult(
    const std::string& item_id,
    const GURL& icon_url,
    const int discrete_value_relevance,
    Profile* profile,
    const extensions::Extension* extension,
    std::unique_ptr<chromeos::launcher_search_provider::ErrorReporter>
        error_reporter)
    : item_id_(item_id),
      discrete_value_relevance_(discrete_value_relevance),
      profile_(profile),
      extension_(extension) {
  DCHECK_GE(discrete_value_relevance, 0);
  DCHECK_LE(discrete_value_relevance,
            chromeos::launcher_search_provider::kMaxSearchResultScore);

  icon_image_loader_ = base::MakeRefCounted<LauncherSearchIconImageLoaderImpl>(
      icon_url, profile, extension, GetPreferredIconDimension(display_type()),
      std::move(error_reporter));
  icon_image_loader_->LoadResources();

  Initialize();
}

LauncherSearchResult::~LauncherSearchResult() {
  icon_image_loader_->RemoveObserver(this);
}

std::unique_ptr<LauncherSearchResult> LauncherSearchResult::Duplicate() const {
  LauncherSearchResult* duplicated_result =
      new LauncherSearchResult(item_id_, discrete_value_relevance_, profile_,
                               extension_, icon_image_loader_);
  duplicated_result->set_model_updater(model_updater());
  duplicated_result->SetMetadata(CloneMetadata());
  return base::WrapUnique(duplicated_result);
}

void LauncherSearchResult::Open(int event_flags) {
  RecordHistogram(LAUNCHER_SEARCH_PROVIDER_RESULT);

  Service* service = Service::Get(profile_);
  service->OnOpenResult(extension_->id(), item_id_);
}

void LauncherSearchResult::OnIconImageChanged(
    LauncherSearchIconImageLoader* image_loader) {
  DCHECK_EQ(image_loader, icon_image_loader_.get());
  SetIcon(icon_image_loader_->GetIconImage());
}

void LauncherSearchResult::OnBadgeIconImageChanged(
    LauncherSearchIconImageLoader* image_loader) {
  DCHECK_EQ(image_loader, icon_image_loader_.get());
  SetBadgeIcon(icon_image_loader_->GetBadgeIconImage());
}

LauncherSearchResult::LauncherSearchResult(
    const std::string& item_id,
    const int discrete_value_relevance,
    Profile* profile,
    const extensions::Extension* extension,
    const scoped_refptr<LauncherSearchIconImageLoader>& icon_image_loader)
    : item_id_(item_id),
      discrete_value_relevance_(discrete_value_relevance),
      profile_(profile),
      extension_(extension),
      icon_image_loader_(icon_image_loader) {
  DCHECK(icon_image_loader_);
  Initialize();
}

void LauncherSearchResult::Initialize() {
  set_id(GetSearchResultId());
  set_relevance(static_cast<double>(discrete_value_relevance_) /
                static_cast<double>(
                    chromeos::launcher_search_provider::kMaxSearchResultScore));
  SetDetails(base::UTF8ToUTF16(extension_->name()));
  SetResultType(ResultType::kLauncher);

  icon_image_loader_->AddObserver(this);

  SetIcon(icon_image_loader_->GetIconImage());
  SetBadgeIcon(icon_image_loader_->GetBadgeIconImage());
}

std::string LauncherSearchResult::GetSearchResultId() {
  return extension_->id() + kResultIdDelimiter + item_id_;
}

}  // namespace app_list
