// 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.

#ifndef COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_FETCHER_H_
#define COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_FETCHER_H_

#include <memory>
#include <vector>

#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/strings/string16.h"
#include "components/keyed_service/core/keyed_service.h"

class GURL;
class TemplateURL;
class TemplateURLService;

namespace network {
namespace mojom {
class URLLoaderFactory;
}
}  // namespace network

namespace url {
class Origin;
}

// TemplateURLFetcher is responsible for downloading OpenSearch description
// documents, creating a TemplateURL from the OSDD, and adding the TemplateURL
// to the TemplateURLService. Downloading is done in the background.
//
class TemplateURLFetcher : public KeyedService {
 public:
  // Creates a TemplateURLFetcher.
  explicit TemplateURLFetcher(TemplateURLService* template_url_service);
  ~TemplateURLFetcher() override;

  // If TemplateURLFetcher is not already downloading the OSDD for osdd_url,
  // it is downloaded. If successful and the result can be parsed, a TemplateURL
  // is added to the TemplateURLService.
  //
  // |keyword| must be non-empty. If there's already a non-replaceable
  // TemplateURL in the model for |keyword|, or we're already downloading an
  // OSDD for this keyword, no download is started.
  //
  void ScheduleDownload(const base::string16& keyword,
                        const GURL& osdd_url,
                        const GURL& favicon_url,
                        const url::Origin& initiator,
                        network::mojom::URLLoaderFactory* url_loader_factory,
                        int render_frame_id,
                        int resource_type);

  // The current number of outstanding requests.
  int requests_count() const { return requests_.size(); }

 protected:
  // A RequestDelegate is created to download each OSDD. When done downloading
  // RequestCompleted is invoked back on the TemplateURLFetcher.
  class RequestDelegate;

  // Invoked from the RequestDelegate when done downloading. Virtual for tests.
  virtual void RequestCompleted(RequestDelegate* request);

 private:
  friend class RequestDelegate;

  TemplateURLService* template_url_service_;

  // In progress requests.
  std::vector<std::unique_ptr<RequestDelegate>> requests_;

  DISALLOW_COPY_AND_ASSIGN(TemplateURLFetcher);
};

#endif  // COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_FETCHER_H_
