// Copyright 2013 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_DOM_DISTILLER_CORE_DISTILLER_PAGE_H_
#define COMPONENTS_DOM_DISTILLER_CORE_DISTILLER_PAGE_H_

#include <string>

#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/values.h"
#include "third_party/dom_distiller_js/dom_distiller.pb.h"
#include "ui/gfx/geometry/size.h"
#include "url/gurl.h"

namespace dom_distiller {

class SourcePageHandle {
 public:
  virtual ~SourcePageHandle() {}
};

// Injects JavaScript into a page, and uses it to extract and return long-form
// content. The class can be reused to load and distill multiple pages,
// following the state transitions described along with the class's states.
// Constructing a DistillerPage should be cheap, as some of the instances can be
// thrown away without ever being used.
class DistillerPage {
 public:
  typedef base::Callback<
      void(scoped_ptr<proto::DomDistillerResult> distilled_page,
           bool distillation_successful)> DistillerPageCallback;

  DistillerPage();
  virtual ~DistillerPage();

  // Loads a URL. |OnDistillationDone| is called when the load completes or
  // fails. May be called when the distiller is idle. Callers can assume that,
  // for a given |url| and |options|, any DistillerPage implementation will
  // extract the same content.
  void DistillPage(const GURL& url,
                   const proto::DomDistillerOptions options,
                   const DistillerPageCallback& callback);

  // Called when the JavaScript execution completes. |page_url| is the url of
  // the distilled page. |value| contains data returned by the script.
  virtual void OnDistillationDone(const GURL& page_url,
                                  const base::Value* value);

 protected:
  // Called by |DistillPage| to carry out platform-specific instructions to load
  // and distill the |url| using the provided |script|. The extracted content
  // should be the same regardless of the DistillerPage implementation.
  virtual void DistillPageImpl(const GURL& url, const std::string& script) = 0;

  // The value returned between the JavaScript and the DistillerPage can be
  // either a dictionary with all the content, or a stringified version.
  virtual bool StringifyOutput() = 0;

 private:
  bool ready_;
  DistillerPageCallback distiller_page_callback_;
  base::TimeTicks distillation_start_;
  DISALLOW_COPY_AND_ASSIGN(DistillerPage);
};

// Factory for generating a |DistillerPage|.
class DistillerPageFactory {
 public:
  virtual ~DistillerPageFactory();

  // Constructs and returns a new DistillerPage. The implementation of this
  // should be very cheap, since the pages can be thrown away without being
  // used.
  virtual scoped_ptr<DistillerPage> CreateDistillerPage(
      const gfx::Size& render_view_size) const = 0;
  virtual scoped_ptr<DistillerPage> CreateDistillerPageWithHandle(
      scoped_ptr<SourcePageHandle> handle) const = 0;
};

}  // namespace dom_distiller

#endif  // COMPONENTS_DOM_DISTILLER_CORE_DISTILLER_PAGE_H_
