/*
 * 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.
 */

#include "cobalt/web_animations/animation_effect_timing_read_only.h"

#include <cmath>
#include <limits>

namespace cobalt {
namespace web_animations {

AnimationEffectTimingReadOnly::Data::IterationProgress
AnimationEffectTimingReadOnly::Data::ComputeIterationProgressFromLocalTime(
    const base::optional<base::TimeDelta>& local_time) const {
  // Calculating the iteration progress from the local time is summarized nicely
  // here: https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#overview
  // Note that the flowchart from that links concludes with the production of
  // "transformed time", which must then have this algorithm:
  //   https://w3c.github.io/web-animations/#calculating-the-iteration-progress
  // applied to obtain the iteration progress.
  IterationProgress ret;

  base::optional<base::TimeDelta> active_time =
      ComputeActiveTimeFromLocalTime(local_time);
  base::optional<base::TimeDelta> scaled_active_time =
      ComputeScaledActiveTimeFromActiveTime(active_time);
  base::optional<base::TimeDelta> iteration_time =
      ComputeIterationTimeFromScaledActiveTime(scaled_active_time);

  ret.current_iteration =
      ComputeCurrentIteration(active_time, scaled_active_time, iteration_time);

  ret.iteration_progress = ComputeIterationProgressFromTransformedTime(
      ComputeTransformedTimeFromDirectedTime(
          ComputeDirectedTimeFromIterationTime(iteration_time,
                                               ret.current_iteration)));

  return ret;
}

// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#animation-effect-phases-and-states
AnimationEffectTimingReadOnly::Data::Phase
AnimationEffectTimingReadOnly::Data::GetPhase(
    const base::optional<base::TimeDelta>& local_time) const {
  if (!local_time) {
    return kNoPhase;
  }

  if (*local_time < delay_) {
    return kBeforePhase;
  }

  if (iterations_ == std::numeric_limits<double>::infinity() ||
      *local_time < delay_ + active_duration()) {
    return kActivePhase;
  }

  return kAfterPhase;
}

base::TimeDelta AnimationEffectTimingReadOnly::Data::time_until_after_phase(
    base::TimeDelta local_time) const {
  if (iterations_ == std::numeric_limits<double>::infinity()) {
    return base::TimeDelta::Max();
  }
  return (delay_ + active_duration()) - local_time;
}

namespace {
base::TimeDelta ScaleTime(const base::TimeDelta& time, double scale) {
  return base::TimeDelta::FromMillisecondsD(time.InMillisecondsF() * scale);
}
}  // namespace

// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#calculating-the-active-duration
base::TimeDelta AnimationEffectTimingReadOnly::Data::active_duration() const {
  return ScaleTime(duration_, iterations_);
}

// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#calculating-the-scaled-active-time
base::TimeDelta AnimationEffectTimingReadOnly::Data::start_offset() const {
  return ScaleTime(duration_, iteration_start_);
}

// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#calculating-the-active-time
base::optional<base::TimeDelta>
AnimationEffectTimingReadOnly::Data::ComputeActiveTimeFromLocalTime(
    const base::optional<base::TimeDelta>& local_time) const {
  Phase phase = GetPhase(local_time);

  switch (phase) {
    case kBeforePhase:
      if (fill_ == AnimationEffectTimingReadOnly::kBackwards ||
          fill_ == AnimationEffectTimingReadOnly::kBoth) {
        return base::TimeDelta();
      } else {
        return base::nullopt;
      }
    case kActivePhase:
      return *local_time - delay_;
    case kAfterPhase:
      if (fill_ == AnimationEffectTimingReadOnly::kForwards ||
          fill_ == AnimationEffectTimingReadOnly::kBoth) {
        return active_duration();
      } else {
        return base::nullopt;
      }
    case kNoPhase:
      return base::nullopt;
  }

  NOTREACHED();
  return base::nullopt;
}

// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#calculating-the-scaled-active-time
base::optional<base::TimeDelta>
AnimationEffectTimingReadOnly::Data::ComputeScaledActiveTimeFromActiveTime(
    const base::optional<base::TimeDelta>& active_time) const {
  if (!active_time) return base::nullopt;

  return *active_time + start_offset();
}

// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#calculating-the-iteration-time
base::optional<base::TimeDelta>
AnimationEffectTimingReadOnly::Data::ComputeIterationTimeFromScaledActiveTime(
    const base::optional<base::TimeDelta>& scaled_active_time) const {
  if (!scaled_active_time) return base::nullopt;

  if (duration_ == base::TimeDelta()) return base::TimeDelta();

  double iteration_count_plus_start = iterations_ + iteration_start_;
  double iteration_count_plus_start_fraction =
      iteration_count_plus_start - std::floor(iteration_count_plus_start);
  if (iteration_count_plus_start_fraction == 0 && iterations_ != 0 &&
      *scaled_active_time - start_offset() == active_duration()) {
    return duration_;
  }

  return base::TimeDelta::FromMicroseconds(
      scaled_active_time->InMicroseconds() % duration_.InMicroseconds());
}

// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#calculating-the-current-iteration
base::optional<double>
AnimationEffectTimingReadOnly::Data::ComputeCurrentIteration(
    const base::optional<base::TimeDelta>& active_time,
    const base::optional<base::TimeDelta>& scaled_active_time,
    const base::optional<base::TimeDelta>& iteration_time) const {
  // 1.  If the active time is unresolved, return unresolved.
  if (!active_time) return base::nullopt;
  // 2.  If the active time is zero, return floor(iteration start).
  if (*active_time == base::TimeDelta()) {
    return std::floor(iteration_start_);
  }
  // 3.  If the iteration duration is zero,
  //       If the iteration count is infinity, return infinity.
  //       Otherwise, return ceil(iteration start + iteration count) - 1.
  if (duration_ == base::TimeDelta()) {
    if (iterations_ == std::numeric_limits<double>::infinity()) {
      return std::numeric_limits<double>::infinity();
    } else {
      return std::ceil(iteration_start_ + iterations_) - 1;
    }
  }
  // 4.  If the iteration time equals the iteration duration, return
  //     iteration start + iteration count - 1.
  if (*iteration_time == duration_) {
    return iteration_start_ + iterations_ - 1;
  }
  // 5.  Return floor(scaled active time / iteration duration).
  return std::floor(scaled_active_time->InMillisecondsF() /
                    duration_.InMillisecondsF());
}

// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#calculating-the-directed-time
base::optional<base::TimeDelta>
AnimationEffectTimingReadOnly::Data::ComputeDirectedTimeFromIterationTime(
    const base::optional<base::TimeDelta>& iteration_time,
    const base::optional<double>& current_iteration) const {
  // 1.  If the iteration time is unresolved, return unresolved.
  if (!iteration_time) return base::nullopt;
  DCHECK(current_iteration);

  enum SimpleDirection { kForwards, kReverse };
  SimpleDirection current_direction;

  // 2.  Calculate the current direction using the first matching condition from
  //     the following list:
  if (direction_ == AnimationEffectTimingReadOnly::kNormal) {
    // If playback direction is normal,
    current_direction = kForwards;
  } else if (direction_ == AnimationEffectTimingReadOnly::kReverse) {
    // If playback direction is reverse,
    current_direction = kReverse;
  } else {
    // Otherwise,
    // 2.1.  Let d be the current iteration.
    double d = *current_iteration;
    if (d == std::numeric_limits<double>::infinity()) {
      current_direction = kForwards;
    } else {
      // 2.2.  If playback direction is alternate-reverse increment d by 1.
      if (direction_ == AnimationEffectTimingReadOnly::kAlternateReverse) {
        d += 1;
      }
      // 2.4.  If d % 2 == 0, let the current direction be forwards, otherwise
      //       let the current direction be reverse.
      if (static_cast<int>(d) % 2 == 0) {
        current_direction = kForwards;
      } else {
        current_direction = kReverse;
      }
    }
  }

  // 3.  If the current direction is forwards then return the iteration time.
  //     Otherwise, return the iteration duration - iteration time.
  return current_direction == kForwards ? *iteration_time
                                        : duration_ - *iteration_time;
}

// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#calculating-the-transformed-time
base::optional<base::TimeDelta>
AnimationEffectTimingReadOnly::Data::ComputeTransformedTimeFromDirectedTime(
    const base::optional<base::TimeDelta>& directed_time) const {
  if (!directed_time) return base::nullopt;
  if (duration_ == base::TimeDelta::Max()) {
    return directed_time;
  }
  double unscaled_progress = 0;
  if (duration_ != base::TimeDelta()) {
    unscaled_progress =
        directed_time->InMillisecondsF() / duration_.InMillisecondsF();
  }

  DCHECK(easing_);
  double scaled_progress = easing_ != cssom::TimingFunction::GetLinear()
                               ? static_cast<double>(easing_->Evaluate(
                                     static_cast<float>(unscaled_progress)))
                               : unscaled_progress;

  return ScaleTime(duration_, scaled_progress);
}

// https://www.w3.org/TR/2015/WD-web-animations-1-20150707/#calculating-the-iteration-progress
base::optional<double> AnimationEffectTimingReadOnly::Data::
    ComputeIterationProgressFromTransformedTime(
        const base::optional<base::TimeDelta>& transformed_time) const {
  if (!transformed_time) return base::nullopt;
  if (duration_ == base::TimeDelta()) {
    // TODO: Support animations with iteration duration set to 0.
    NOTIMPLEMENTED();
    return 0.0;
  } else {
    return transformed_time->InMillisecondsF() / duration_.InMillisecondsF();
  }
}

}  // namespace web_animations
}  // namespace cobalt
