// Copyright 2013 The Flutter 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 FLUTTER_IMPELLER_SCENE_ANIMATION_ANIMATION_PLAYER_H_
#define FLUTTER_IMPELLER_SCENE_ANIMATION_ANIMATION_PLAYER_H_

#include <map>
#include <memory>
#include <optional>
#include <vector>

#include "flutter/fml/hash_combine.h"
#include "flutter/fml/macros.h"
#include "flutter/fml/time/time_delta.h"
#include "impeller/base/timing.h"
#include "impeller/geometry/matrix.h"
#include "impeller/geometry/matrix_decomposition.h"
#include "impeller/scene/animation/animation_clip.h"

namespace impeller {
namespace scene {

class Node;

class AnimationPlayer final {
 public:
  AnimationPlayer();
  ~AnimationPlayer();

  AnimationPlayer(AnimationPlayer&&);
  AnimationPlayer& operator=(AnimationPlayer&&);

  AnimationClip* AddAnimation(const std::shared_ptr<Animation>& animation,
                              Node* bind_target);

  AnimationClip* GetClip(const std::string& name) const;

  /// @brief  Advanced all clips and updates animated properties in the scene.
  void Update();

 private:
  std::unordered_map<Node*, AnimationTransforms> target_transforms_;

  std::map<std::string, AnimationClip> clips_;

  std::optional<TimePoint> previous_time_;

  AnimationPlayer(const AnimationPlayer&) = delete;

  AnimationPlayer& operator=(const AnimationPlayer&) = delete;
};

}  // namespace scene
}  // namespace impeller

#endif  // FLUTTER_IMPELLER_SCENE_ANIMATION_ANIMATION_PLAYER_H_
