// Copyright (c) 2012 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/extensions/api/top_sites/top_sites_api.h"

#include "base/bind.h"
#include "base/values.h"
#include "chrome/browser/history/top_sites.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/ntp/new_tab_ui.h"

namespace extensions {

TopSitesGetFunction::TopSitesGetFunction()
    : weak_ptr_factory_(this) {}

TopSitesGetFunction::~TopSitesGetFunction() {}

bool TopSitesGetFunction::RunImpl() {
  history::TopSites* ts = GetProfile()->GetTopSites();
  if (!ts)
    return false;

  ts->GetMostVisitedURLs(
      base::Bind(&TopSitesGetFunction::OnMostVisitedURLsAvailable,
                 weak_ptr_factory_.GetWeakPtr()));
  return true;
}

void TopSitesGetFunction::OnMostVisitedURLsAvailable(
    const history::MostVisitedURLList& data) {
  scoped_ptr<base::ListValue> pages_value(new base::ListValue);
  for (size_t i = 0; i < data.size(); i++) {
    const history::MostVisitedURL& url = data[i];
    if (!url.url.is_empty()) {
      base::DictionaryValue* page_value = new base::DictionaryValue();
      page_value->SetString("url", url.url.spec());
      if (url.title.empty())
        page_value->SetString("title", url.url.spec());
      else
        page_value->SetString("title", url.title);
      pages_value->Append(page_value);
    }
  }

  SetResult(pages_value.release());
  SendResponse(true);
}

}  // namespace extensions
