// Copyright 2015 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_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_
