// Copyright 2014 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_LAYOUT_LAYOUT_MANAGER_H_
#define COBALT_LAYOUT_LAYOUT_MANAGER_H_

#include <memory>
#include <string>

#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "cobalt/dom/document.h"
#include "cobalt/dom/window.h"
#include "cobalt/layout/layout_stat_tracker.h"
#include "cobalt/loader/image/image_cache.h"
#include "cobalt/render_tree/node.h"
#include "cobalt/render_tree/resource_provider.h"

namespace cobalt {
namespace layout {

// Produces the render tree each time when the document needs layout update.
class LayoutManager {
 public:
  struct LayoutResults {
    LayoutResults(const scoped_refptr<render_tree::Node>& render_tree,
                  const base::TimeDelta& layout_time,
                  const base::Closure& on_rasterized_callback = base::Closure())
        : render_tree(render_tree),
          layout_time(layout_time),
          on_rasterized_callback(on_rasterized_callback) {}

    // The render tree produced by a layout.
    scoped_refptr<render_tree::Node> render_tree;

    // The time that the render tree was created, which will be used as a
    // reference point for updating the animations in the above render tree.
    base::TimeDelta layout_time;

    // Callback to run whenever the render tree is rasterized.
    base::Closure on_rasterized_callback;
  };

  typedef base::Callback<void(const LayoutResults&)>
      OnRenderTreeProducedCallback;

  typedef base::Callback<void()> OnLayoutCallback;

  // Specifies what event should trigger a layout, and hence what event
  // will result in a render tree being produced and passed in a call to
  // on_render_tree_produced_callback_.
  enum LayoutTrigger {
    kOnDocumentMutation,
#if defined(ENABLE_TEST_RUNNER)
    kTestRunnerMode,
#endif  // ENABLE_TEST_RUNNER
  };

  LayoutManager(const bool suspended, const std::string& name,
                const scoped_refptr<dom::Window>& window,
                const OnRenderTreeProducedCallback& on_render_tree_produced,
                const OnLayoutCallback& on_layout, LayoutTrigger layout_trigger,
                const int dom_max_element_depth,
                const float layout_refresh_rate, const std::string& language,
                bool enable_image_animations,
                LayoutStatTracker* layout_stat_tracker,
                bool clear_window_with_background_color);
  ~LayoutManager();

  void Suspend();
  void Resume();
  void Purge();

  bool IsRenderTreePending() const;

 private:
  class Impl;
  const std::unique_ptr<Impl> impl_;

  DISALLOW_COPY_AND_ASSIGN(LayoutManager);
};

}  // namespace layout
}  // namespace cobalt

#endif  // COBALT_LAYOUT_LAYOUT_MANAGER_H_
