<!--
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-autogrow-textarea/iron-autogrow-textarea.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-storage/gr-storage.html">
<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">

<dom-module id="gr-diff-comment">
  <template>
    <style>
      :host {
        display: block;
        font-family: var(--font-family);
        margin: .7em 0;
        --iron-autogrow-textarea: {
          padding: 2px;
        };
      }
      :host([disabled]) {
        pointer-events: none;
      }
      :host([disabled]) .container {
        opacity: .5;
      }
      .header {
        cursor: pointer;
        display: flex;
        font-family: 'Open Sans', sans-serif;
        margin: 0.7em 0;
        padding-bottom: 0;
      }
      .container.collapsed .header {
        margin: 0;
      }
      .headerMiddle {
        color: #666;
        flex: 1;
        overflow: hidden;
      }
      .authorName,
      .draftLabel {
        display: block;
        float: left;
        font-weight: bold;
      }
      .draftLabel {
        color: #999;
        display: none;
      }
      .date {
        justify-content: flex-end;
        margin-left: 5px;
        white-space: nowrap;
      }
      a.date:link,
      a.date:visited {
        color: #666;
      }
      .actions {
        display: flex;
        padding-top: 0;
      }
      .action {
        margin-right: .5em;
      }
      .danger {
        display: flex;
        flex: 1;
        justify-content: flex-end;
      }
      .editMessage {
        display: none;
        margin: .5em .7em;
        width: calc(100% - 1.4em - 2px);
      }
      .danger .action {
        margin-right: 0;
      }
      .container:not(.draft) .actions :not(.reply):not(.quote):not(.done) {
        display: none;
      }
      .draft .reply,
      .draft .quote,
      .draft .done {
        display: none;
      }
      .draft .draftLabel {
        display: inline;
      }
      .draft:not(.editing) .save,
      .draft:not(.editing) .cancel {
        display: none;
      }
      .editing .message,
      .editing .reply,
      .editing .quote,
      .editing .done,
      .editing .edit {
        display: none;
      }
      .editing .editMessage {
        background-color: #fff;
        display: block;
      }
      .show-hide {
        margin-left: .4em;
      }
      input.show-hide {
        display: none;
      }
      label.show-hide {
        color: #000;
        cursor: pointer;
        display: block;
        font-size: .8em;
        height: 1.1em;
        margin-top: .1em;
      }
      #container .collapsedContent {
        display: none;
      }
      #container.collapsed {
        padding-bottom: 3px;
      }
      #container.collapsed .collapsedContent {
        display: block;
        overflow: hidden;
        padding-left: 5px;
        text-overflow: ellipsis;
        white-space: nowrap;
      }
      #container.collapsed .actions,
      #container.collapsed gr-formatted-text,
      #container.collapsed iron-autogrow-textarea {
        display: none;
      }
    </style>
    <div id="container"
        class="container"
        on-mouseenter="_handleMouseEnter"
        on-mouseleave="_handleMouseLeave">
      <div class="header" id="header" on-click="_handleToggleCollapsed">
        <div class="headerLeft">
          <span class="authorName">[[comment.author.name]]</span>
          <span class="draftLabel">DRAFT</span>
        </div>
        <div class="headerMiddle">
          <span class="collapsedContent">[[comment.message]]</span>
        </div>
        <a class="date" href$="[[_computeLinkToComment(comment)]]" on-tap="_handleLinkTap">
          <gr-date-formatter date-str="[[comment.updated]]"></gr-date-formatter>
        </a>
        <div class="show-hide">
          <label class="show-hide">
            <input type="checkbox" class="show-hide"
               checked$="[[collapsed]]"
               on-change="_handleToggleCollapsed">
            [[_computeShowHideText(collapsed)]]
          </label>
        </div>
      </div>
      <iron-autogrow-textarea
          id="editTextarea"
          class="editMessage"
          autocomplete="on"
          disabled="{{disabled}}"
          rows="4"
          bind-value="{{_messageText}}"
          on-keydown="_handleTextareaKeydown"></iron-autogrow-textarea>
      <gr-formatted-text class="message"
          content="[[comment.message]]"
          collapsed="[[collapsed]]"
          config="[[projectConfig.commentlinks]]"></gr-formatted-text>
      <div class="actions" hidden$="[[!showActions]]">
        <gr-button class="action reply" on-tap="_handleReply">Reply</gr-button>
        <gr-button class="action quote" on-tap="_handleQuote">Quote</gr-button>
        <gr-button class="action done" on-tap="_handleDone">Done</gr-button>
        <gr-button class="action edit" on-tap="_handleEdit">Edit</gr-button>
        <gr-button class="action save" on-tap="_handleSave"
            disabled$="[[_computeSaveDisabled(_messageText)]]">Save</gr-button>
        <gr-button class="action cancel" on-tap="_handleCancel" hidden>Cancel</gr-button>
        <div class="danger">
          <gr-button class="action discard" on-tap="_handleDiscard">Discard</gr-button>
        </div>
      </div>
    </div>
    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
    <gr-storage id="storage"></gr-storage>
  </template>
  <script src="gr-diff-comment.js"></script>
</dom-module>
