// Copyright 2015 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_BROWSER_RENDER_TREE_COMBINER_H_
#define COBALT_BROWSER_RENDER_TREE_COMBINER_H_

#include <map>
#include <memory>

#include "base/optional.h"
#include "base/time/time.h"
#include "cobalt/renderer/submission.h"

namespace cobalt {
namespace browser {

// Combines rendering layers (such as the main, splash screen, and
// debug console). Caches the individual trees as they are produced.
// Re-renders when any tree changes.
class RenderTreeCombiner {
 public:
  // Layer represents the render layer corresponding to the main web
  // module, the splash screen, or the debug console and are used to
  // create and submit a combined tree to the RendererModule's
  // pipeline. Layers are combined in order of the |z_index| specifed
  // at the Layers' creation. The RenderTreeCombiner stores pointers
  // to Layers. The Layers are owned by the caller of
  // RenderTreeCombiner::CreateLayer.
  class Layer {
   public:
    ~Layer();

    void Reset() {
      render_tree_ = base::nullopt;
      receipt_time_ = base::nullopt;
    }

    // Submit render tree to the layer, and specify whether the time
    // received should be stored.
    void Submit(
        const base::Optional<renderer::Submission>& render_tree_submission);

    bool HasRenderTree() { return !!render_tree_; }

    // Returns a current submission object that can be passed into a renderer
    // for rasterization.  If the render tree does not exist, this will
    // return a base::nullopt.
    base::Optional<renderer::Submission> GetCurrentSubmission();

   private:
    friend class RenderTreeCombiner;

    explicit Layer(RenderTreeCombiner* render_tree_combiner = NULL);

    // Returns the current submission time for this particular layer.  This is
    // called by the RenderTreeCombiner on the |timeline_layer_| to determine
    // which value to pass in as the submission time for the renderer.
    base::Optional<base::TimeDelta> CurrentTimeOffset();

    RenderTreeCombiner* render_tree_combiner_;

    base::Optional<renderer::Submission> render_tree_;
    base::Optional<base::TimeTicks> receipt_time_;
  };

  RenderTreeCombiner();
  ~RenderTreeCombiner() {}

  // Create a Layer with a given |z_index|. If a Layer already exists
  // at |z_index|, return NULL, and no Layer is created.
  std::unique_ptr<Layer> CreateLayer(int z_index);

  // Returns a current submission object that can be passed into a renderer
  // for rasterization.  If no layers with render trees exist, this will return
  // a base::nullopt.
  base::Optional<renderer::Submission> GetCurrentSubmission();

  // Names a single layer as the one responsible for providing the timeline
  // id and configuration to the output combined render tree.  Only a single
  // layer can be responsible for providing the timeline.
  void SetTimelineLayer(Layer* layer);

 private:
  // Returns true if the specified layer exists in this render tree combiner's
  // current list of layers (e.g. |layers_|).
  bool OwnsLayer(Layer* layer);

  // The layers keyed on their z_index.
  std::map<int, Layer*> layers_;

  // Removes a layer from |layers_|. Called by the Layer destructor.
  void RemoveLayer(const Layer* layer);

  // Which layer is currently controlling the receipt time submitted to the
  // rasterizer.
  RenderTreeCombiner::Layer* timeline_layer_;
};

}  // namespace browser
}  // namespace cobalt

#endif  // COBALT_BROWSER_RENDER_TREE_COMBINER_H_
