<!--
@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="../../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;
      }
      :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>
            <template is="dom-if" if="[[_expanded]]">
              <div class="replyContainer" hidden$="[[!showReplyButton]]" hidden>
                <gr-button link small on-tap="_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>
            </template>
          </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>
