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

#ifndef GARNET_LIB_UI_GFX_RESOURCES_IMPORT_H_
#define GARNET_LIB_UI_GFX_RESOURCES_IMPORT_H_

#include <fuchsia/ui/gfx/cpp/fidl.h>
#include <lib/fit/function.h>
#include <lib/zx/eventpair.h>

#include "garnet/lib/ui/gfx/resources/resource.h"
#include "src/lib/fxl/macros.h"
#include "src/lib/fxl/memory/weak_ptr.h"

namespace scenic_impl {
namespace gfx {

class Import;
using ImportPtr = fxl::RefPtr<Import>;

// Callback used by ResourceLinker and UnresolvedImports to indicate the result
// of resolving a resource.
enum class ImportResolutionResult {
  kSuccess,                     // Import was bound successfully to a Resource.
  kExportHandleDiedBeforeBind,  // The peer token of the import was destroyed
                                // before binding could occur.
  kImportDestroyedBeforeBind    // Import was destroyed before binding could
                                // occur.
};
using OnImportResolvedCallback =
    fit::function<void(Resource*, ImportResolutionResult)>;

/// Acts as a placeholder for resources imported from other sessions. Once a
/// binding between the import and the resource has been established, the
/// |imports()| collection of that resource will contain a reference to this
/// import. The import also holds a reference to the import token used for the
/// resolution of the binding between the exported resource and the imported
/// import.
class Import final : public Resource {
 public:
  static const ResourceTypeInfo kTypeInfo;

  Import(Session* session, ResourceId id, ::fuchsia::ui::gfx::ImportSpec spec,
         const fxl::WeakPtr<ResourceLinker>& resource_linker_weak);

  ~Import() override;

  // |Resource|.
  void Accept(class ResourceVisitor* visitor) override;

  /// Returns the resource that is a suitable standin for the resource being
  /// bound to by the import. Imported resources are never modified by the
  /// importing session. Commands directed at the import resource are instead
  /// applied to this delegate. This delegate also holds the side-effects of
  /// these operations such as the list of children which were attached.
  Resource* delegate() { return delegate_.get(); }

  /// The specification used to represent the underlying type of the resource
  /// being bound to the import.
  ::fuchsia::ui::gfx::ImportSpec import_spec() const { return import_spec_; }

  /// If an active binding exists between this import and an imported resource,
  // returns that resource. If no binding exists, returns nullptr.
  Resource* imported_resource() const { return imported_resource_; }

  /// Returns true if the imported resource has been bound.
  bool is_bound() const { return imported_resource_ != nullptr; }

  bool focusable() const { return focusable_; }
  void set_focusable(bool focusable) { focusable_ = focusable; }

 private:
  const ::fuchsia::ui::gfx::ImportSpec import_spec_;
  const ResourcePtr delegate_;
  Resource* imported_resource_ = nullptr;
  // TODO(SCN-1026): Remove this.
  bool focusable_ = true;

  fxl::WeakPtr<ResourceLinker> resource_linker_weak_;

  // |Resource|.
  Resource* GetDelegate(const ResourceTypeInfo& type_info) override;

  // Needed by |Resource::AddImport()| and |Resource::RemoveImport()|.
  friend class Resource;
  // Needed by |ResourceLinker::OnImportResolvedForResource()|.
  friend class ResourceLinker;

  /// Establish a binding between the resource and this import. The type of the
  /// resource being bound to is compatible with the import spec specified when
  /// creating the import resource.
  void BindImportedResource(Resource* resource);

  /// Clear a previous binding to an imported resource, or signal that a pending
  /// binding has failed. The first case can happen when the resource being
  /// imported is is released in its session. The second case can happen if
  /// an export handle is destroyed before ExportResource() is called.
  void UnbindImportedResource();

  FRIEND_MAKE_REF_COUNTED(Import);
  FRIEND_REF_COUNTED_THREAD_SAFE(Import);
  FXL_DISALLOW_COPY_AND_ASSIGN(Import);
};

}  // namespace gfx
}  // namespace scenic_impl

#endif  // GARNET_LIB_UI_GFX_RESOURCES_IMPORT_H_
