// Copyright 2014 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.

(function(shared, scope, testing) {

  function constructor(children, timingInput) {
    this.children = children || [];
    this._timing = shared.normalizeTimingInput(timingInput, true);
    this.timing = shared.makeTiming(timingInput, true);

    if (this._timing.duration === 'auto')
      this._timing.duration = this.activeDuration;
  }

  window.AnimationSequence = function() {
    constructor.apply(this, arguments);
  };

  window.AnimationGroup = function() {
    constructor.apply(this, arguments);
  };

  window.AnimationSequence.prototype = {
    get activeDuration() {
      var total = 0;
      this.children.forEach(function(child) {
        total += scope.groupChildDuration(child);
      });
      return Math.max(total, 0);
    }
  };

  window.AnimationGroup.prototype = {
    get activeDuration() {
      var max = 0;
      this.children.forEach(function(child) {
        max = Math.max(max, scope.groupChildDuration(child));
      });
      return max;
    }
  };

  scope.newUnderlyingPlayerForGroup = function(group) {
    var underlyingPlayer;
    var ticker = function(tf) {
      var player = underlyingPlayer._wrapper;
      if (player.playState == 'pending') return;

      if (!player.source)
        return;
      if (tf == null) {
        player._removePlayers();
        return;
      }

      player._updateChildren();
    };

    underlyingPlayer = scope.timeline.play(new scope.Animation(null, ticker, group._timing));
    return underlyingPlayer;
  };

  scope.bindPlayerForGroup = function(player) {
    player._player._wrapper = player;
    player._isGroup = true;
    scope.awaitStartTime(player);
    player._updateChildren();
  };


})(webAnimationsShared, webAnimationsNext, webAnimationsTesting);
