<!--
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-linked-text/gr-linked-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 {
        background-color: #ffd;
        display: block;
        --iron-autogrow-textarea: {
          padding: 2px;
        };
      }
      :host([disabled]) {
        pointer-events: none;
      }
      :host([disabled]) .container {
        opacity: .5;
      }
      .header,
      .message,
      .actions {
        padding: .5em .7em;
      }
      .header {
        cursor: pointer;
        display: flex;
        font-family: 'Open Sans', sans-serif;
        padding-bottom: 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-linked-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$="[[_commentCollapsed]]"
               on-change="_handleToggleCollapsed">
            [[_computeShowHideText(_commentCollapsed)]]
          </label>
        </div>
      </div>
      <iron-autogrow-textarea
          id="editTextarea"
          class="editMessage"
          disabled="{{disabled}}"
          rows="4"
          bind-value="{{_messageText}}"
          on-keydown="_handleTextareaKeydown"></iron-autogrow-textarea>
      <gr-linked-text class="message"
          pre
          content="[[comment.message]]"
          collapsed="[[_commentCollapsed]]"
          config="[[projectConfig.commentlinks]]"></gr-linked-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>
