<!--
Copyright (C) 2015 The Android Open Source Project

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

<link rel="import" href="../bower_components/polymer/polymer.html">
<link rel="import" href="gr-message.html">

<dom-module id="gr-messages-list">
  <template>
    <style>
      :host {
        display: block;
      }
      h3 {
        margin-bottom: .35em;
      }
      h3,
      gr-message {
        padding: 0 var(--default-horizontal-margin);
      }
      .highlighted {
        animation: 3s fadeOut;
      }
      @keyframes fadeOut {
        0% { background-color: #fff9c4; }
        100% { background-color: #fff; }
      }
    </style>
    <h3>Messages</h3>
    <template is="dom-repeat" items="[[messages]]" as="message">
      <gr-message change-num="[[changeNum]]"
                  message="[[message]]"
                  comments="[[_computeCommentsForMessage(comments, message, index)]]"
                  project-config="[[projectConfig]]"
                  show-reply-button="[[showReplyButtons]]"
                  on-scroll-to="_handleScrollTo"
                  data-message-id$="[[message.id]]"></gr-message>
    </template>
  </template>
  <script>
  (function() {
    'use strict';

    Polymer({
      is: 'gr-messages-list',

      properties: {
        changeNum: Number,
        messages: {
          type: Array,
          value: function() { return []; },
        },
        comments: Object,
        projectConfig: Object,
        topMargin: Number,
        showReplyButtons: {
          type: Boolean,
          value: false,
        },
      },

      scrollToMessage: function(messageID) {
        var el = this.$$('[data-message-id="' + messageID + '"]');
        if (!el) { return; }

        el.expanded = true;
        var top = el.offsetTop;
        for (var offsetParent = el.offsetParent;
             offsetParent;
             offsetParent = offsetParent.offsetParent) {
          top += offsetParent.offsetTop;
        }
        window.scrollTo(0, top - this.topMargin);
        this._highlightEl(el);
      },

      _highlightEl: function(el) {
        var highlightedEls =
            Polymer.dom(this.root).querySelectorAll('.highlighted');
        for (var i = 0; i < highlightedEls.length; i++) {
          highlightedEls[i].classList.remove('highlighted');
        }
        function handleAnimationEnd() {
          el.removeEventListener('animationend', handleAnimationEnd);
          el.classList.remove('highlighted');
        }
        el.addEventListener('animationend', handleAnimationEnd);
        el.classList.add('highlighted');
      },

      _handleScrollTo: function(e) {
        this.scrollToMessage(e.detail.message.id);
      },

      _computeCommentsForMessage: function(comments, message, index) {
        var comments = comments || {};
        var messages = this.messages || [];
        var msgComments = {};
        var mDate = util.parseDate(message.date);
        var nextMDate;
        if (index < messages.length - 1) {
          nextMDate = util.parseDate(messages[index + 1].date);
        }
        for (var file in comments) {
          var fileComments = comments[file];
          for (var i = 0; i < fileComments.length; i++) {
            var cDate = util.parseDate(fileComments[i].updated);
            if (cDate >= mDate) {
              if (nextMDate && cDate >= nextMDate) {
                continue;
              }
              msgComments[file] = msgComments[file] || [];
              msgComments[file].push(fileComments[i]);
            }
          }
        }
        return msgComments;
      },

    });
  })();
  </script>
</dom-module>
