// Copyright 2020 The Fuchsia 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 "src/ui/scenic/lib/annotation/annotation_registry_handler.h"

#include "src/ui/scenic/lib/gfx/engine/annotation_manager.h"

namespace scenic_impl {

AnnotationRegistryHandler::AnnotationRegistryHandler(fidl::InterfaceRequest<Registry> request,
                                                     AnnotationHandlerId handler_id,
                                                     gfx::AnnotationManager *annotation_manager)
    : id_(handler_id), binding_(this, std::move(request)) {
  if (annotation_manager) {
    InitializeWithGfxAnnotationManager(annotation_manager);
  }
  binding_.set_error_handler(fit::bind_member(this, &AnnotationRegistryHandler::ErrorHandler));
}

void AnnotationRegistryHandler::RunPendingCreateCommands() {
  FX_DCHECK(initialized_);
  for (auto &args : pending_create_args_) {
    annotation_manager_->RequestCreate(id_, std::move(args.main_view),
                                       std::move(args.view_holder_token), std::move(args.callback));
  }
  pending_create_args_.clear();
}

void AnnotationRegistryHandler::InitializeWithGfxAnnotationManager(
    scenic_impl::gfx::AnnotationManager *annotation_manager) {
  FX_DCHECK(!initialized_);
  FX_DCHECK(annotation_manager);

  annotation_manager_ = annotation_manager;
  annotation_manager_->RegisterHandler(
      id_, fit::bind_member(this, &AnnotationRegistryHandler::ErrorHandler));

  initialized_ = true;
  RunPendingCreateCommands();
}

// |fuchsia::ui::annotation::Registry|
void AnnotationRegistryHandler::CreateAnnotationViewHolder(
    fuchsia::ui::views::ViewRef main_view, fuchsia::ui::views::ViewHolderToken view_holder_token,
    CreateAnnotationViewHolderCallback callback) {
  if (initialized()) {
    annotation_manager_->RequestCreate(id_, std::move(main_view), std::move(view_holder_token),
                                       std::move(callback));
  } else {
    pending_create_args_.push_back({.main_view = std::move(main_view),
                                    .view_holder_token = std::move(view_holder_token),
                                    .callback = std::move(callback)});
  }
}

}  // namespace scenic_impl
