// 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 "ios/chrome/browser/rlz/rlz_tracker_delegate_impl.h"

#include "base/command_line.h"
#include "base/logging.h"
#include "components/omnibox/browser/omnibox_event_global_tracker.h"
#include "components/omnibox/browser/omnibox_log.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_service.h"
#include "ios/chrome/browser/application_context.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/google/google_brand.h"
#include "ios/chrome/browser/search_engines/template_url_service_factory.h"
#include "ios/web/public/web_thread.h"

RLZTrackerDelegateImpl::RLZTrackerDelegateImpl() {}

RLZTrackerDelegateImpl::~RLZTrackerDelegateImpl() {}

// static
bool RLZTrackerDelegateImpl::IsGoogleDefaultSearch(
    ios::ChromeBrowserState* browser_state) {
  bool is_google_default_search = false;
  TemplateURLService* template_url_service =
      ios::TemplateURLServiceFactory::GetForBrowserState(browser_state);
  if (template_url_service) {
    const TemplateURL* url_template =
        template_url_service->GetDefaultSearchProvider();
    is_google_default_search = url_template &&
                               url_template->url_ref().HasGoogleBaseURLs(
                                   template_url_service->search_terms_data());
  }
  return is_google_default_search;
}

// static
bool RLZTrackerDelegateImpl::IsGoogleHomepage(
    ios::ChromeBrowserState* browser_state) {
  // iOS does not have a notion of home page.
  return false;
}

// static
bool RLZTrackerDelegateImpl::IsGoogleInStartpages(
    ios::ChromeBrowserState* browser_state) {
  // iOS does not have a notion of start pages.
  return false;
}

void RLZTrackerDelegateImpl::Cleanup() {
  on_omnibox_search_callback_.Reset();
}

bool RLZTrackerDelegateImpl::IsOnUIThread() {
  return web::WebThread::CurrentlyOn(web::WebThread::UI);
}

net::URLRequestContextGetter* RLZTrackerDelegateImpl::GetRequestContext() {
  return GetApplicationContext()->GetSystemURLRequestContext();
}

bool RLZTrackerDelegateImpl::GetBrand(std::string* brand) {
  return ios::google_brand::GetBrand(brand);
}

bool RLZTrackerDelegateImpl::IsBrandOrganic(const std::string& brand) {
  return brand.empty() || ios::google_brand::IsOrganic(brand);
}

bool RLZTrackerDelegateImpl::GetReactivationBrand(std::string* brand) {
  // iOS does not have reactivation brand.
  return false;
}

bool RLZTrackerDelegateImpl::ShouldEnableZeroDelayForTesting() {
  return false;
}

bool RLZTrackerDelegateImpl::GetLanguage(base::string16* language) {
  // TODO(thakis): Implement.
  NOTIMPLEMENTED();
  return false;
}

bool RLZTrackerDelegateImpl::GetReferral(base::string16* referral) {
  // The referral program is defunct and not used. No need to implement this
  // function on non-Win platforms.
  return true;
}

bool RLZTrackerDelegateImpl::ClearReferral() {
  // The referral program is defunct and not used. No need to implement this
  // function on non-Win platforms.
  return true;
}

void RLZTrackerDelegateImpl::SetOmniboxSearchCallback(
    const base::Closure& callback) {
  DCHECK(!callback.is_null());
  on_omnibox_search_callback_ = callback;
  on_omnibox_url_opened_subscription_ =
      OmniboxEventGlobalTracker::GetInstance()->RegisterCallback(
          base::Bind(&RLZTrackerDelegateImpl::OnURLOpenedFromOmnibox,
                     base::Unretained(this)));
}

void RLZTrackerDelegateImpl::SetHomepageSearchCallback(
    const base::Closure& callback) {
  NOTREACHED();
}

void RLZTrackerDelegateImpl::OnURLOpenedFromOmnibox(OmniboxLog* log) {
  // In M-36, we made NOTIFICATION_OMNIBOX_OPENED_URL fire more often than
  // it did previously.  The RLZ folks want RLZ's "first search" detection
  // to remain as unaffected as possible by this change.  This test is
  // there to keep the old behavior.
  if (!log->is_popup_open)
    return;

  on_omnibox_url_opened_subscription_.reset();

  using std::swap;
  base::Closure callback_to_run;
  swap(callback_to_run, on_omnibox_search_callback_);
  if (!callback_to_run.is_null())
    callback_to_run.Run();
}
