// 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 "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_
