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

#pragma once

#include <functional>
#include <map>
#include <optional>

#include "flutter/fml/macros.h"
#include "impeller/geometry/size.h"
#include "impeller/renderer/allocator.h"
#include "impeller/renderer/formats.h"

namespace impeller {

class Context;

class RenderTarget {
 public:
  static RenderTarget CreateOffscreen(
      const Context& context,
      ISize size,
      const std::string& label = "Offscreen",
      StorageMode color_storage_mode = StorageMode::kDevicePrivate,
      LoadAction color_load_action = LoadAction::kClear,
      StoreAction color_store_action = StoreAction::kStore,
      StorageMode stencil_storage_mode = StorageMode::kDeviceTransient,
      LoadAction stencil_load_action = LoadAction::kClear,
      StoreAction stencil_store_action = StoreAction::kDontCare);

  static RenderTarget CreateOffscreenMSAA(
      const Context& context,
      ISize size,
      const std::string& label = "Offscreen MSAA",
      StorageMode color_storage_mode = StorageMode::kDeviceTransient,
      StorageMode color_resolve_storage_mode = StorageMode::kDevicePrivate,
      LoadAction color_load_action = LoadAction::kClear,
      StoreAction color_store_action = StoreAction::kMultisampleResolve,
      StorageMode stencil_storage_mode = StorageMode::kDeviceTransient,
      LoadAction stencil_load_action = LoadAction::kClear,
      StoreAction stencil_store_action = StoreAction::kDontCare);

  RenderTarget();

  ~RenderTarget();

  bool IsValid() const;

  SampleCount GetSampleCount() const;

  bool HasColorAttachment(size_t index) const;

  ISize GetRenderTargetSize() const;

  std::shared_ptr<Texture> GetRenderTargetTexture() const;

  std::optional<ISize> GetColorAttachmentSize(size_t index) const;

  RenderTarget& SetColorAttachment(const ColorAttachment& attachment,
                                   size_t index);

  RenderTarget& SetDepthAttachment(DepthAttachment attachment);

  RenderTarget& SetStencilAttachment(StencilAttachment attachment);

  const std::map<size_t, ColorAttachment>& GetColorAttachments() const;

  const std::optional<DepthAttachment>& GetDepthAttachment() const;

  const std::optional<StencilAttachment>& GetStencilAttachment() const;

 private:
  std::map<size_t, ColorAttachment> colors_;
  std::optional<DepthAttachment> depth_;
  std::optional<StencilAttachment> stencil_;

  void IterateAllAttachments(
      const std::function<bool(const Attachment& attachment)>& iterator) const;
};

}  // namespace impeller
