// 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_CSSOM_CSS_TRANSITION_H_
#define COBALT_CSSOM_CSS_TRANSITION_H_

#include <algorithm>

#include "base/memory/ref_counted.h"
#include "base/time.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/cssom/timing_function.h"

namespace cobalt {
namespace cssom {

class PropertyValue;

// A Transition object represents a persistant transition from one CSS style
// value to another.  Most of the data members of this class are defined with
// names based off of the concepts named here:
//   https://www.w3.org/TR/2013/WD-css3-transitions-20131119/#starting
class Transition {
 public:
  Transition(PropertyKey target_property,
             const scoped_refptr<PropertyValue>& start_value,
             const scoped_refptr<PropertyValue>& end_value,
             const base::TimeDelta& start_time, const base::TimeDelta& duration,
             const base::TimeDelta& delay,
             const scoped_refptr<TimingFunction>& timing_function,
             scoped_refptr<PropertyValue> reversing_adjusted_start_value,
             float reversing_shortening_factor);

  PropertyKey target_property() const { return target_property_; }
  const base::TimeDelta& start_time() const { return start_time_; }
  const base::TimeDelta& duration() const { return duration_; }
  const base::TimeDelta& delay() const { return delay_; }
  const scoped_refptr<TimingFunction>& timing_function() const {
    return timing_function_;
  }
  const scoped_refptr<PropertyValue>& start_value() const {
    return start_value_;
  }
  const scoped_refptr<PropertyValue>& end_value() const { return end_value_; }

  // The reversing shortening factor and reversing adjusted start value are
  // both used for dealing with the special case where a property that is
  // already transitioning is modified again to now transition back to where
  // it was transitioning from.  In this case, it would look weird if the
  // reversing transition took the full duration despite the original transition
  // being cancelled part-way through and so not taking the full duration.
  // These members help us know how to modify the reversing transition to have
  // the same duration as the cancelled initial transition.  They are described
  // here:
  //   https://www.w3.org/TR/2013/WD-css3-transitions-20131119/#reversing
  const scoped_refptr<PropertyValue>& reversing_adjusted_start_value() const {
    return reversing_adjusted_start_value_;
  }
  float reversing_shortening_factor() const {
    return reversing_shortening_factor_;
  }

  // Returns the animation progress at a specified time.  This will take into
  // account animation delay, duration, and timing function.
  float Progress(const base::TimeDelta& time) const;
  const base::TimeDelta EndTime() const;

  // Produces an animated property value for the specified time.
  scoped_refptr<PropertyValue> Evaluate(const base::TimeDelta& time) const;

 private:
  PropertyKey target_property_;
  scoped_refptr<PropertyValue> start_value_;
  scoped_refptr<PropertyValue> end_value_;
  base::TimeDelta start_time_;
  base::TimeDelta duration_;
  base::TimeDelta delay_;
  scoped_refptr<TimingFunction> timing_function_;

  // See the getter methods for these members for documentation.
  scoped_refptr<PropertyValue> reversing_adjusted_start_value_;
  float reversing_shortening_factor_;
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_CSS_TRANSITION_H_
