// 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_RESOURCES_STROKE_GROUP_H_
#define GARNET_BIN_UI_SKETCHY_RESOURCES_STROKE_GROUP_H_

#include <set>
#include "garnet/bin/ui/sketchy/buffer/mesh_buffer.h"
#include "garnet/bin/ui/sketchy/frame.h"
#include "garnet/bin/ui/sketchy/resources/resource.h"
#include "garnet/bin/ui/sketchy/resources/stroke.h"
#include "src/ui/lib/escher/geometry/bounding_box.h"
#include "lib/ui/scenic/cpp/resources.h"
#include "lib/ui/scenic/cpp/session.h"

namespace sketchy_service {

class StrokeGroup;
using StrokeGroupPtr = fxl::RefPtr<StrokeGroup>;

class StrokeGroup final : public Resource {
 public:
  static const ResourceTypeInfo kTypeInfo;
  const ResourceTypeInfo& type_info() const override { return kTypeInfo; }

  explicit StrokeGroup(scenic::Session* session);

  // Record the stroke to add.
  bool AddStroke(StrokePtr stroke);
  // Remove a stroke from record.
  bool RemoveStroke(StrokePtr stroke);
  // Clear all strokes from record.
  bool Clear();

  void SetNeedsReTessellation() { needs_re_tessellation_ = true; }

  // Record the command to update the mesh.
  void UpdateMesh(Frame* frame);

  const scenic::ShapeNode& shape_node() const { return shape_node_; }

 private:
  // Record the command to merge the strokes to add.
  void MergeStrokes(Frame* frame);

  // Record the command to re-tessellate the strokes.
  void ReTessellateStrokes(Frame* frame);

  scenic::ShapeNode shape_node_;
  scenic::Mesh mesh_;
  scenic::Material material_;

  std::set<StrokePtr> strokes_to_add_;
  std::set<StrokePtr> strokes_;
  MeshBuffer mesh_buffer_;
  bool needs_re_tessellation_ = false;

  FXL_DISALLOW_COPY_AND_ASSIGN(StrokeGroup);
};

}  // namespace sketchy_service

#endif  // GARNET_BIN_UI_SKETCHY_RESOURCES_STROKE_GROUP_H_
