// 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_BIN_UI_SKETCHY_CANVAS_H_
#define GARNET_BIN_UI_SKETCHY_CANVAS_H_

#include <unordered_map>

#include <fuchsia/ui/sketchy/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>

#include "garnet/bin/ui/sketchy/buffer/shared_buffer_pool.h"
#include "garnet/bin/ui/sketchy/resources/resource_map.h"
#include "garnet/bin/ui/sketchy/resources/stroke_group.h"
#include "garnet/bin/ui/sketchy/resources/types.h"
#include "garnet/bin/ui/sketchy/stroke/stroke_manager.h"
#include "lib/escher/escher.h"
#include "lib/escher/vk/buffer_factory.h"
#include "lib/ui/scenic/cpp/session.h"

namespace sketchy_service {

class CanvasImpl final : public ::fuchsia::ui::sketchy::Canvas {
 public:
  CanvasImpl(async::Loop* loop, scenic::Session* session,
             escher::EscherWeakPtr escher);

  // |::fuchsia::ui::sketchy::Canvas|
  void Init(::fidl::InterfaceHandle<::fuchsia::ui::sketchy::CanvasListener>
                listener) override;
  void Enqueue(
      ::std::vector<::fuchsia::ui::sketchy::Command> commands) override;
  void Present(uint64_t presentation_time, PresentCallback callback) override;

 private:
  bool ApplyCommand(::fuchsia::ui::sketchy::Command command);
  void RequestScenicPresent(uint64_t presentation_time);

  bool ApplyCreateResourceCmd(
      ::fuchsia::ui::sketchy::CreateResourceCmd command);
  bool ApplyReleaseResourceCmd(
      ::fuchsia::ui::sketchy::ReleaseResourceCmd command);
  bool CreateStroke(ResourceId id, ::fuchsia::ui::sketchy::Stroke stroke);
  bool CreateStrokeGroup(ResourceId id,
                         ::fuchsia::ui::sketchy::StrokeGroup stroke_group);

  bool ApplySetPathCmd(::fuchsia::ui::sketchy::SetStrokePathCmd command);
  bool ApplyAddStrokeCmd(::fuchsia::ui::sketchy::AddStrokeCmd command);
  bool ApplyRemoveStrokeCmd(::fuchsia::ui::sketchy::RemoveStrokeCmd command);

  bool ApplyBeginStrokeCmd(::fuchsia::ui::sketchy::BeginStrokeCmd command);
  bool ApplyExtendStrokeCmd(::fuchsia::ui::sketchy::ExtendStrokeCmd command);
  bool ApplyFinishStrokeCmd(::fuchsia::ui::sketchy::FinishStrokeCmd command);

  bool ApplyClearGroupCmd(::fuchsia::ui::sketchy::ClearGroupCmd command);

  bool ApplyScenicImportResourceCmd(
      fuchsia::ui::gfx::ImportResourceCmd import_resource);

  // Imports an exported ScenicNode that can be used as an
  // attachment point for a StrokeGroup.
  //
  // |id| ID that can be used by the Canvas client to refer to
  //     the imported node.
  // |token| Token that the Sketchy service will pass along
  //     to the SceneManager to import the node.
  bool ScenicImportNode(ResourceId id, zx::eventpair token);

  bool ApplyScenicAddChildCmd(fuchsia::ui::gfx::AddChildCmd add_child);

  async::Loop* const loop_;
  scenic::Session* const session_;
  const escher::EscherWeakPtr escher_;
  escher::BufferFactoryAdapter buffer_factory_;
  // Buffers which are sent over the wire are constructed using this pool.
  SharedBufferPool shared_buffer_pool_;

  ::fidl::VectorPtr<::fuchsia::ui::sketchy::Command> commands_;
  ResourceMap resource_map_;
  bool is_scenic_present_requested_ = false;
  std::vector<scenic::Session::PresentCallback> callbacks_;
  size_t canvas_present_count_ = 0;
  size_t session_present_count_ = 0;
  size_t request_scenic_present_count_ = 0;

  StrokeManager stroke_manager_;
};

}  // namespace sketchy_service

#endif  // GARNET_BIN_UI_SKETCHY_CANVAS_H_
