// Copyright 2013 The Flutter 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 FLUTTER_IMPELLER_AIKS_EXPERIMENTAL_CANVAS_H_
#define FLUTTER_IMPELLER_AIKS_EXPERIMENTAL_CANVAS_H_

#include <memory>
#include <optional>
#include <vector>

#include "impeller/aiks/canvas.h"
#include "impeller/aiks/image_filter.h"
#include "impeller/aiks/paint.h"
#include "impeller/entity/entity.h"
#include "impeller/entity/entity_pass.h"

namespace impeller {

class ExperimentalCanvas : public Canvas {
 public:
  ExperimentalCanvas(ContentContext& renderer, RenderTarget& render_target);

  ExperimentalCanvas(ContentContext& renderer,
                     RenderTarget& render_target,
                     Rect cull_rect);

  ExperimentalCanvas(ContentContext& renderer,
                     RenderTarget& render_target,
                     IRect cull_rect);

  ~ExperimentalCanvas() override = default;

  void Save(uint32_t total_content_depth) override;

  void SaveLayer(const Paint& paint,
                 std::optional<Rect> bounds,
                 const std::shared_ptr<ImageFilter>& backdrop_filter,
                 ContentBoundsPromise bounds_promise,
                 uint32_t total_content_depth) override;

  bool Restore() override;

  void EndReplay() {
    FML_DCHECK(inline_pass_contexts_.size() == 1u);
    inline_pass_contexts_.back()->EndPass();
    render_passes_.clear();
    inline_pass_contexts_.clear();
    renderer_.GetRenderTargetCache()->End();

    Reset();
    Initialize(initial_cull_rect_);
  }

  void DrawTextFrame(const std::shared_ptr<TextFrame>& text_frame,
                     Point position,
                     const Paint& paint) override;

  struct SaveLayerState {
    Paint paint;
    Rect coverage;
  };

 private:
  ContentContext& renderer_;
  RenderTarget& render_target_;
  std::vector<std::unique_ptr<InlinePassContext>> inline_pass_contexts_;
  std::vector<std::unique_ptr<EntityPassTarget>> entity_pass_targets_;
  std::vector<SaveLayerState> save_layer_state_;
  std::vector<std::shared_ptr<RenderPass>> render_passes_;

  void SetupRenderPass();

  void AddRenderEntityToCurrentPass(Entity entity, bool reuse_depth) override;
  void AddClipEntityToCurrentPass(Entity entity) override;

  Point GetGlobalPassPosition() {
    if (save_layer_state_.empty()) {
      return Point(0, 0);
    }
    return save_layer_state_.back().coverage.GetOrigin();
  }

  ExperimentalCanvas(const ExperimentalCanvas&) = delete;

  ExperimentalCanvas& operator=(const ExperimentalCanvas&) = delete;
};

}  // namespace impeller

#endif  // FLUTTER_IMPELLER_AIKS_EXPERIMENTAL_CANVAS_H_
