// Copyright 2020 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_DOM_LOTTIE_PLAYER_H_
#define COBALT_DOM_LOTTIE_PLAYER_H_

#include <string>

#include "cobalt/dom/event_queue.h"
#include "cobalt/dom/html_element.h"
#include "cobalt/loader/image/image_cache.h"
#include "cobalt/render_tree/lottie_animation.h"
#include "cobalt/script/environment_settings.h"
#include "cobalt/script/global_environment.h"
#include "cobalt/script/union_type.h"

namespace cobalt {
namespace dom {

class Document;

typedef render_tree::LottieAnimation LottieAnimation;

// Custom element that represents a Lottie web player, which embeds and plays
// Lottie animations.
// Although LottiePlayer does not inherit from HTMLImageElement, much of its
// functionality is based off that of HTMLImageElement - in particular, loading
// the animation pointed to by the "src" attribute.
//   https://lottiefiles.github.io/lottie-player/
class LottiePlayer : public HTMLElement {
 public:
  static const char kTagName[];

  typedef script::UnionType2<double, std::string> FrameType;

  explicit LottiePlayer(Document* document);

  // Web API: LottiePlayer
  //
  std::string src() const;
  void set_src(const std::string& src);
  bool autoplay() const;
  void set_autoplay(bool loop);
  int count() const;
  void set_count(int count);
  int direction() const;
  void set_direction(int direction);
  bool loop() const;
  void set_loop(bool loop);
  std::string mode() const;
  void set_mode(std::string mode);
  double speed() const;
  void set_speed(double speed);
  std::string renderer() const;
  void Load(std::string src);
  void Play();
  void Pause();
  void Stop();
  void Seek(FrameType frame);
  void SetDirection(int direction);
  void SetLooping(bool loop);
  void SetSpeed(double speed);
  void ToggleLooping();
  void TogglePlay();

  // Custom, not in any spec
  //
  // From HTMLElement
  scoped_refptr<LottiePlayer> AsLottiePlayer() override { return this; }

  const scoped_refptr<loader::image::CachedImage>& cached_image() {
    return cached_image_;
  }

  LottieAnimation::LottieProperties GetUpdatedProperties();

  DEFINE_WRAPPABLE_TYPE(LottiePlayer);

 private:
  ~LottiePlayer() override {}

  // From Node.
  void PurgeCachedBackgroundImagesOfNodeAndDescendants() override;

  // From Element.
  void OnSetAttribute(const std::string& name,
                      const std::string& value) override;
  void OnRemoveAttribute(const std::string& name) override;

  void UpdateAnimationData();

  void OnLoadingSuccess();
  void OnLoadingError();

  void PreventGarbageCollectionUntilEventIsDispatched(base::Token event_name);
  void AllowGarbageCollectionAfterEventIsDispatched(
      base::Token event_name,
      std::unique_ptr<script::GlobalEnvironment::ScopedPreventGarbageCollection>
          scoped_prevent_gc);
  void DestroyScopedPreventGC(
      std::unique_ptr<script::GlobalEnvironment::ScopedPreventGarbageCollection>
          scoped_prevent_gc);

  void UpdateState(LottieAnimation::LottieState state);
  void UpdatePlaybackStateForAutoplay();
  void SetCount(int count);
  void SetMode(std::string mode);
  void SetMode(LottieAnimation::LottieMode mode);
  void UpdateLottieObjects();

  void ScheduleEvent(base::Token event_name);
  void SetAnimationEventCallbacks();

  void OnComplete();
  void OnLoop();

  scoped_refptr<loader::image::CachedImage> cached_image_;
  std::unique_ptr<loader::image::CachedImage::OnLoadedCallbackHandler>
      cached_image_loaded_callback_handler_;

  std::unique_ptr<script::GlobalEnvironment::ScopedPreventGarbageCollection>
      prevent_gc_until_load_complete_;

  // Indicates whether playback is dictated by the "autoplay" attributes, or
  // if other playback methods have been called.
  bool autoplaying_;
  LottieAnimation::LottieProperties properties_;

  EventQueue event_queue_;
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_LOTTIE_PLAYER_H_
