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

#include "flutter/shell/platform/embedder/embedder_render_target_cache.h"

namespace flutter {

EmbedderRenderTargetCache::EmbedderRenderTargetCache() = default;

EmbedderRenderTargetCache::~EmbedderRenderTargetCache() = default;

std::pair<EmbedderRenderTargetCache::RenderTargets,
          EmbedderExternalView::ViewIdentifierSet>
EmbedderRenderTargetCache::GetExistingTargetsInCache(
    const EmbedderExternalView::PendingViews& pending_views) {
  RenderTargets resolved_render_targets;
  EmbedderExternalView::ViewIdentifierSet unmatched_identifiers;

  for (const auto& view : pending_views) {
    const auto& external_view = view.second;
    if (!external_view->HasEngineRenderedContents()) {
      continue;
    }
    auto& compatible_targets =
        cached_render_targets_[external_view->CreateRenderTargetDescriptor()];
    if (compatible_targets.empty()) {
      unmatched_identifiers.insert(view.first);
    } else {
      std::unique_ptr<EmbedderRenderTarget> target =
          std::move(compatible_targets.top());
      compatible_targets.pop();
      resolved_render_targets[view.first] = std::move(target);
    }
  }
  return {std::move(resolved_render_targets), std::move(unmatched_identifiers)};
}

std::set<std::unique_ptr<EmbedderRenderTarget>>
EmbedderRenderTargetCache::ClearAllRenderTargetsInCache() {
  std::set<std::unique_ptr<EmbedderRenderTarget>> cleared_targets;
  for (auto& targets : cached_render_targets_) {
    auto& targets_stack = targets.second;
    while (!targets_stack.empty()) {
      cleared_targets.emplace(std::move(targets_stack.top()));
      targets_stack.pop();
    }
  }
  cached_render_targets_.clear();
  return cleared_targets;
}

void EmbedderRenderTargetCache::CacheRenderTarget(
    EmbedderExternalView::ViewIdentifier view_identifier,
    std::unique_ptr<EmbedderRenderTarget> target) {
  if (target == nullptr) {
    return;
  }
  auto surface = target->GetRenderSurface();
  auto desc = EmbedderExternalView::RenderTargetDescriptor{
      view_identifier, SkISize::Make(surface->width(), surface->height())};
  cached_render_targets_[desc].push(std::move(target));
}

size_t EmbedderRenderTargetCache::GetCachedTargetsCount() const {
  size_t count = 0;
  for (const auto& targets : cached_render_targets_) {
    count += targets.second.size();
  }
  return count;
}

}  // namespace flutter
