// Copyright 2015 Google Inc. 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_WEB_ANIMATIONS_BAKED_ANIMATION_SET_H_
#define COBALT_WEB_ANIMATIONS_BAKED_ANIMATION_SET_H_

#include "base/memory/ref_counted.h"
#include "base/memory/scoped_vector.h"
#include "base/time.h"
#include "cobalt/cssom/css_declared_style_data.h"
#include "cobalt/web_animations/animation.h"
#include "cobalt/web_animations/animation_effect_timing_read_only.h"
#include "cobalt/web_animations/animation_set.h"
#include "cobalt/web_animations/keyframe_effect_read_only.h"

namespace cobalt {
namespace web_animations {

// A BakedAnimation is an immutable object that can be used to animate
// CSS style over time.  The BakedAnimation object is completely independent
// of references to other objects and can be easily copied and passed around.
// It is constructed from a web_animations::Animation object, and upon
// construction will traverse other web_animations objects referenced by
// the Animation object, extracting all internal Data objects necessary to
// apply the animation to CSS styles.
// Its primary use-case is to snapshot the state of Web Animations at layout
// time so that animation data can be packaged and shipped off to the renderer
// thread with no dependencies on the Animation script objects.
class BakedAnimation {
 public:
  explicit BakedAnimation(const Animation& animation);

  // Apply an animation at the given timeline time, using the provided
  // style as the underlying input data, and updating it to the animated
  // output data.
  void Apply(const base::TimeDelta& timeline_time,
             cssom::CSSComputedStyleData* in_out_style) const;

  // Returns the timeline time at which this animation will end.  If the
  // animation has no ending, base::TimeDelta::Max() will be returned.
  base::TimeDelta end_time() const;

 private:
  const Animation::Data animation_data_;
  const AnimationEffectTimingReadOnly::Data effect_timing_data_;
  const KeyframeEffectReadOnly::Data keyframe_data_;
};

// Maintains an immutable set of BakedAnimations, which should contain all
// data necessary to apply all animations to a targeted CSS style.
class BakedAnimationSet {
 public:
  explicit BakedAnimationSet(const AnimationSet& animation_set);
  explicit BakedAnimationSet(const BakedAnimationSet& animation_set);

  // Apply all animations in the set to the specified input style, updating
  // it to the output animated style.
  void Apply(const base::TimeDelta& timeline_time,
             cssom::CSSComputedStyleData* in_out_style) const;

  // Returns the timeline time at which point all animations in the set are
  // ended, or base::TimeDelta::Max() if at leats one animation will never end.
  base::TimeDelta end_time() const;

 private:
  typedef ScopedVector<BakedAnimation> AnimationList;
  AnimationList animations_;
};

}  // namespace web_animations
}  // namespace cobalt

#endif  // COBALT_WEB_ANIMATIONS_BAKED_ANIMATION_SET_H_
