// Copyright (c) 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
 * @unrestricted
 */
export default class AnimationGroupPreviewUI {
  /**
   * @param {!Animation.AnimationModel.AnimationGroup} model
   */
  constructor(model) {
    this._model = model;
    this.element = createElementWithClass('div', 'animation-buffer-preview');
    this.element.createChild('div', 'animation-paused fill');
    this._removeButton = this.element.createChild('div', 'animation-remove-button');
    this._removeButton.textContent = '\u2715';
    this._replayOverlayElement = this.element.createChild('div', 'animation-buffer-preview-animation');
    this._svg = this.element.createSVGChild('svg');
    this._svg.setAttribute('width', '100%');
    this._svg.setAttribute('preserveAspectRatio', 'none');
    this._svg.setAttribute('height', '100%');
    this._viewBoxHeight = 32;
    this._svg.setAttribute('viewBox', '0 0 100 ' + this._viewBoxHeight);
    this._svg.setAttribute('shape-rendering', 'crispEdges');
    this._render();
  }

  /**
   * @return {number}
   */
  _groupDuration() {
    let duration = 0;
    for (const anim of this._model.animations()) {
      const animDuration = anim.source().delay() + anim.source().duration();
      if (animDuration > duration) {
        duration = animDuration;
      }
    }
    return duration;
  }

  /**
   * @return {!Element}
   */
  removeButton() {
    return this._removeButton;
  }

  replay() {
    this._replayOverlayElement.animate(
        [
          {offset: 0, width: '0%', opacity: 1}, {offset: 0.9, width: '100%', opacity: 1},
          {offset: 1, width: '100%', opacity: 0}
        ],
        {duration: 200, easing: 'cubic-bezier(0, 0, 0.2, 1)'});
  }

  _render() {
    this._svg.removeChildren();
    const maxToShow = 10;
    const numberOfAnimations = Math.min(this._model.animations().length, maxToShow);
    const timeToPixelRatio = 100 / Math.max(this._groupDuration(), 750);
    for (let i = 0; i < numberOfAnimations; i++) {
      const effect = this._model.animations()[i].source();
      const line = this._svg.createSVGChild('line');
      line.setAttribute('x1', effect.delay() * timeToPixelRatio);
      line.setAttribute('x2', (effect.delay() + effect.duration()) * timeToPixelRatio);
      const y = Math.floor(this._viewBoxHeight / Math.max(6, numberOfAnimations) * i + 1);
      line.setAttribute('y1', y);
      line.setAttribute('y2', y);
      line.style.stroke = Animation.AnimationUI.Color(this._model.animations()[i]);
    }
  }
}

/* Legacy exported object */
self.Animation = self.Animation || {};

/* Legacy exported object */
Animation = Animation || {};

/**
 * @constructor
 * @unrestricted
 */
Animation.AnimationGroupPreviewUI = AnimationGroupPreviewUI;
