<!--
@license
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="/bower_components/iron-icon/iron-icon.html">
<link rel="import" href="../../../behaviors/fire-behavior/fire-behavior.html">
<link rel="import" href="../../shared/gr-account-label/gr-account-label.html">
<link rel="import" href="../../shared/gr-button/gr-button.html">
<link rel="import" href="../../shared/gr-date-formatter/gr-date-formatter.html">
<link rel="import" href="../../shared/gr-formatted-text/gr-formatted-text.html">
<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
<link rel="import" href="../../../styles/shared-styles.html">
<link rel="import" href="../../../styles/gr-voting-styles.html">

<link rel="import" href="../gr-comment-list/gr-comment-list.html">

<dom-module id="gr-message">
  <template>
    <style include="gr-voting-styles"></style>
    <style include="shared-styles">
      :host {
        border-bottom: 1px solid var(--border-color);
        display: block;
        position: relative;
        cursor: pointer;
        overflow-y: hidden;
      }
      :host(.expanded) {
        cursor: auto;
      }
      :host > div {
        padding: 0 var(--default-horizontal-margin);
      }
      gr-avatar {
        position: absolute;
        left: var(--default-horizontal-margin);
      }
      .collapsed .contentContainer {
        align-items: baseline;
        color: var(--deemphasized-text-color);
        display: flex;
        white-space: nowrap;
      }
      .contentContainer {
        margin-left: calc(var(--default-horizontal-margin) + 2.5em);
        padding: 10px 0;
      }
      .showAvatar.collapsed .contentContainer {
        margin-left: calc(var(--default-horizontal-margin) + 1.75em);
      }
      .hideAvatar.collapsed .contentContainer,
      .hideAvatar.expanded .contentContainer {
        margin-left: 0;
      }
      .showAvatar.collapsed .contentContainer,
      .hideAvatar.collapsed .contentContainer,
      .hideAvatar.expanded .contentContainer {
        padding: .75em 0;
      }
      .collapsed gr-avatar {
        top: .5em;
        height: 1.75em;
        width: 1.75em;
      }
      .expanded gr-avatar {
        top: 12px;
        height: 2.5em;
        width: 2.5em;
      }
      .name {
        font-weight: var(--font-weight-bold);
      }
      .message {
        --gr-formatted-text-prose-max-width: 80ch;
      }
      .collapsed .message {
        max-width: none;
        overflow: hidden;
        text-overflow: ellipsis;
      }
      .collapsed .author,
      .collapsed .content,
      .collapsed .message,
      .collapsed .updateCategory,
      gr-account-chip {
        display: inline;
      }
      gr-button {
        margin: 0 -4px;
      }
      .collapsed gr-comment-list,
      .collapsed .replyContainer,
      .collapsed .hideOnCollapsed,
      .hideOnOpen {
        display: none;
      }
      .collapsed .hideOnOpen {
        display: block;
      }
      .collapsed .content {
        flex: 1;
        margin-right: .25em;
        min-width: 0;
        overflow: hidden;
        text-overflow: ellipsis;
      }
      .collapsed .dateContainer {
        position: static;
      }
      .collapsed .author {
        overflow: hidden;
        color: var(--primary-text-color);
        margin-right: .4em;
      }
      .expanded .author {
        cursor: pointer;
        margin-bottom: .4em;
      }
      .dateContainer {
        position: absolute;
        right: var(--default-horizontal-margin);
        top: 10px;
      }
      span.date {
        color: var(--deemphasized-text-color);
      }
      span.date:hover {
        text-decoration: underline;
      }
      .dateContainer iron-icon {
        cursor: pointer;
      }
      .replyContainer {
        padding: .5em 0 0 0;
      }
      .score {
        border: 1px solid rgba(0,0,0,.12);
        border-radius: 3px;
        color: var(--primary-text-color);
        display: inline-block;
        margin: -.1em 0;
        padding: 0 .1em;
      }
      .score.negative {
        background-color: var(--vote-color-disliked);
      }
      .score.negative.min {
        background-color: var(--vote-color-rejected);
      }
      .score.positive {
        background-color: var(--vote-color-recommended);
      }
      .score.positive.max {
        background-color: var(--vote-color-approved);
      }
      gr-account-label {
        --gr-account-label-text-style: {
          font-weight: var(--font-weight-bold);
        };
      }
    </style>
    <div class$="[[_computeClass(_expanded, showAvatar, message)]]">
      <gr-avatar account="[[author]]" image-size="100"></gr-avatar>
      <div class="contentContainer">
        <div class="author" on-tap="_handleAuthorTap">
          <span hidden$="[[!showOnBehalfOf]]">
            <span class="name">[[message.real_author.name]]</span>
            on behalf of
          </span>
          <gr-account-label
              account="[[author]]"
              hide-avatar></gr-account-label>
          <template is="dom-repeat" items="[[_getScores(message)]]" as="score">
            <span class$="score [[_computeScoreClass(score, labelExtremes)]]">
              [[score.label]] [[score.value]]
            </span>
          </template>
        </div>
        <template is="dom-if" if="[[message.message]]">
          <div class="content">
            <div class="message hideOnOpen">[[message.message]]</div>
            <gr-formatted-text
                no-trailing-margin
                class="message hideOnCollapsed"
                content="[[message.message]]"
                config="[[_projectConfig.commentlinks]]"></gr-formatted-text>
            <div class="replyContainer" hidden$="[[!showReplyButton]]" hidden>
              <gr-button link small on-click="_handleReplyTap">Reply</gr-button>
            </div>
            <gr-comment-list
                comments="[[comments]]"
                change-num="[[changeNum]]"
                patch-num="[[message._revision_number]]"
                project-name="[[projectName]]"
                project-config="[[_projectConfig]]"></gr-comment-list>
          </div>
        </template>
        <template is="dom-if" if="[[_computeIsReviewerUpdate(message)]]">
          <div class="content">
            <template is="dom-repeat" items="[[message.updates]]" as="update">
              <div class="updateCategory">
                [[update.message]]
                <template
                    is="dom-repeat" items="[[update.reviewers]]" as="reviewer">
                  <gr-account-chip account="[[reviewer]]">
                  </gr-account-chip>
                </template>
              </div>
            </template>
          </div>
        </template>
        <span class="dateContainer">
          <template is="dom-if" if="[[!message.id]]">
            <span class="date">
              <gr-date-formatter
                  has-tooltip
                  show-date-and-time
                  date-str="[[message.date]]"></gr-date-formatter>
            </span>
          </template>
          <template is="dom-if" if="[[message.id]]">
            <span class="date" on-tap="_handleAnchorTap">
              <gr-date-formatter
                  has-tooltip
                  show-date-and-time
                  date-str="[[message.date]]"></gr-date-formatter>
            </span>
          </template>
          <iron-icon
              id="expandToggle"
              on-tap="_toggleExpanded"
              title="Toggle expanded state"
              icon="[[_computeExpandToggleIcon(_expanded)]]">
        </span>
      </div>
    </div>
    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
  </template>
  <script src="gr-message.js"></script>
</dom-module>
