// Copyright 2017 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 "garnet/lib/ui/gfx/resources/import.h"

#include "garnet/lib/ui/gfx/engine/resource_linker.h"
#include "garnet/lib/ui/gfx/engine/session.h"
#include "garnet/lib/ui/gfx/resources/nodes/entity_node.h"

namespace scenic_impl {
namespace gfx {
namespace {
ResourcePtr CreateDelegate(Session* session, ResourceId id,
                           ::fuchsia::ui::gfx::ImportSpec spec) {
  switch (spec) {
    case ::fuchsia::ui::gfx::ImportSpec::NODE:
      return fxl::MakeRefCounted<EntityNode>(session, id);
  }
  return nullptr;
}
}  // namespace

constexpr ResourceTypeInfo Import::kTypeInfo = {ResourceType::kImport,
                                                "Import"};

Import::Import(Session* session, ResourceId id,
               fuchsia::ui::gfx::ImportSpec spec,
               const fxl::WeakPtr<ResourceLinker>& resource_linker_weak)
    : Resource(session, id, Import::kTypeInfo),
      import_spec_(spec),
      delegate_(CreateDelegate(session, id, spec)),
      resource_linker_weak_(resource_linker_weak) {
  FXL_DCHECK(delegate_);
  FXL_DCHECK(!delegate_->type_info().IsKindOf(Import::kTypeInfo));
}

Import::~Import() {
  if (imported_resource_ != nullptr) {
    imported_resource_->RemoveImport(this);
  }
  if (resource_linker_weak_) {
    resource_linker_weak_->OnImportDestroyed(this);
  }
}

Resource* Import::GetDelegate(const ResourceTypeInfo& type_info) {
  if (Import::kTypeInfo == type_info) {
    return this;
  }
  return delegate_->GetDelegate(type_info);
}

void Import::BindImportedResource(Resource* resource) {
  imported_resource_ = resource;
}

void Import::UnbindImportedResource() {
  imported_resource_ = nullptr;

  // Send a ImportUnboundEvent to the SessionListener.
  auto event = ::fuchsia::ui::gfx::Event();
  event.set_import_unbound(::fuchsia::ui::gfx::ImportUnboundEvent());
  event.import_unbound().resource_id = id();
  session()->EnqueueEvent(std::move(event));
}

}  // namespace gfx
}  // namespace scenic_impl
