<!--
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="../bower_components/iron-dropdown/iron-dropdown.html">
<link rel="import" href="../bower_components/iron-selector/iron-selector.html">
<link rel="import" href="../behaviors/rest-client-behavior.html">
<link rel="import" href="gr-ajax.html">
<link rel="import" href="gr-request.html">

<dom-module id="gr-reply-dropdown">
  <style>
    :host {
      display: inline-block;
    }
    :host([disabled]) {
      pointer-events: none;
    }
    :host([disabled]) .dropdown-content {
      opacity: .5;
    }
    iron-dropdown {
      background-color: #fff;
      box-shadow: 0 1px 5px rgba(0, 0, 0, .3);
      width: 40em;
    }
    button {
      background-color: #f1f2f3;
      border: 1px solid #aaa;
      border-radius: 2px;
      cursor: pointer;
      font: inherit;
      padding: .2em .5em;
    }
    section {
      border-top: 1px solid #ddd;
      padding: .5em .75em;
    }
    .textareaContainer {
      position: relative;
    }
    iron-autogrow-textarea {
      padding: 0;
    }
    .message {
      border: none;
      width: 100%;
    }
    .labelContainer:not(:first-of-type) {
      margin-top: .5em;
    }
    .labelName {
      display: inline-block;
      text-align: right;
      width: 7em;
      margin-right: .5em;
      white-space: nowrap;
    }
    iron-selector {
      display: inline-flex;
    }
    iron-selector > button {
      background-color: #fff;
      border: 1px solid #ddd;
      border-left: none;
      padding: .25em 0;
      cursor: pointer;
      width: 3em;
      text-align: center;
    }
    iron-selector > button:first-of-type {
      border-top-left-radius: 2px;
      border-bottom-left-radius: 2px;
      border-left: 1px solid #ddd;
    }
    iron-selector > button:last-of-type {
      border-top-right-radius: 2px;
      border-bottom-right-radius: 2px;
    }
    iron-selector > button.iron-selected {
      background-color: #ddd;
    }
    .draftsContainer h3 {
      margin-top: .25em;
    }
    .actionsContainer {
      display: flex;
    }
    .action:link,
    .action:visited {
      color: #00e;
    }
    .danger {
      display: flex;
      flex: 1;
      justify-content: flex-end;
    }
  </style>
  <template>
    <gr-ajax id="draftsXHR"
        url="[[_computeDraftsURL(changeNum)]]"
        last-response="{{_drafts}}"></gr-ajax>
    <button id="trigger" on-tap="_showPopupTapHandler">Reply</button>
    <iron-dropdown id="dropdown"
        vertical-align="top"
        vertical-offset="25"
        horizontal-align="right">
      <div class="dropdown-content">
        <section class="textareaContainer">
          <iron-autogrow-textarea
              id="textarea"
              class="message"
              placeholder="Say something..."
              disabled="{{disabled}}"
              rows="1"
              bind-value="{{draft}}"></iron-autogrow-textarea>
        </section>
        <section>
          <template is="dom-repeat"
              items="[[_computeLabelArray(permittedLabels)]]" as="label">
            <div class="labelContainer">
              <span class="labelName">[[label]]</span>
              <iron-selector data-label$="[[label]]"
                  selected="[[_computeIndexOfLabelValue(labels, permittedLabels, label, _account)]]">
                <template is="dom-repeat"
                    items="[[_computePermittedLabelValues(permittedLabels, label)]]"
                    as="value">
                  <button data-value$="[[value]]">[[value]]</button>
                </template>
              </iron-selector>
            </div>
          </template>
        </section>
        <section class="draftsContainer" hidden$="[[_computeHideDraftList(_drafts)]]">
          <h3>[[_computeDraftsTitle(_drafts)]]</h3>
          <gr-comment-list
              comments="[[_drafts]]"
              change-num="[[changeNum]]"
              patch-num="[[patchNum]]"></gr-comment-list>
        </section>
        <section class="actionsContainer">
          <button class="action send" on-tap="_sendTapHandler">Send</button>
          <div class="danger">
            <button class="action cancel" on-tap="_cancelTapHandler">Cancel</button>
          </div>
        </section>
      </div>
    </iron-dropdown>
  </template>
  <script>
  (function() {
    'use strict';

    Polymer({
      is: 'gr-reply-dropdown',

      /**
       * Fired when a reply is successfully sent.
       *
       * @event send
       */

      properties: {
        changeNum: String,
        patchNum: String,
        disabled: {
          type: Boolean,
          value: false,
          reflectToAttribute: true,
        },
        draft: {
          type: String,
          value: '',
        },
        labels: Object,
        permittedLabels: Object,

        _account: Object,
        _drafts: Object,
        _xhrPromise: Object,  // Used for testing.
      },

      behaviors: [ Gerrit.RESTClientBehavior ],

      get opened() {
        return this.$.dropdown.opened;
      },

      ready: function() {
        app.accountReady.then(function() {
          this._account = app.account;
        }.bind(this));
      },

      open: function() {
        this.$.draftsXHR.generateRequest();
        this.$.dropdown.open();
        this.async(function() {
          this.$.textarea.textarea.focus();
        }.bind(this));
      },

      close: function() {
        this._drafts = null;
        this.$.dropdown.close();
      },

      _computeDraftsURL: function(changeNum) {
        return '/changes/' + changeNum + '/drafts';
      },

      _computeHideDraftList: function(drafts) {
        return Object.keys(drafts || {}).length == 0;
      },

      _computeDraftsTitle: function(drafts) {
        var total = 0;
        for (var file in drafts) {
          total += drafts[file].length;
        }
        if (total == 0) { return ''; }
        if (total == 1) { return '1 Draft'; }
        if (total > 1) { return total + ' Drafts'; };
      },

      _computeLabelArray: function(labelsObj) {
        return Object.keys(labelsObj).sort();
      },

      _computeIndexOfLabelValue: function(
          labels, permittedLabels, labelName, account) {
        var t = labels[labelName];
        if (!t) { return null; }
        var labelValue = t.default_value;

        // Is there an existing vote for the current user? If so, use that.
        var votes = labels[labelName];
        if (votes.all && votes.all.length > 0) {
          for (var i = 0; i < votes.all.length; i++) {
            if (votes.all[i]._account_id == account._account_id) {
              labelValue = votes.all[i].value;
              break;
            }
          }
        }

        var len = permittedLabels[labelName] != null ?
            permittedLabels[labelName].length : 0;
        for (var i = 0; i < len; i++) {
          var val = parseInt(permittedLabels[labelName][i], 10);
          if (val == labelValue) {
            return i;
          }
        }
        return null;
      },

      _computePermittedLabelValues: function(permittedLabels, label) {
        return permittedLabels[label];
      },

      _showPopupTapHandler: function(e) {
        e.preventDefault();
        this.open();
      },

      _cancelTapHandler: function(e) {
        e.preventDefault();
        this.$.dropdown.close();
      },

      _sendTapHandler: function(e) {
        e.preventDefault();
        var obj = {
          drafts: 'PUBLISH_ALL_REVISIONS',
          labels: {},
        };
        for (var label in this.permittedLabels) {
          var selectorEl = this.$$('iron-selector[data-label="' + label + '"]');
          var selectedVal = selectorEl.selectedItem.getAttribute('data-value');
          selectedVal = parseInt(selectedVal, 10);
          obj.labels[label] = selectedVal;
        }
        if (this.draft != null) {
          obj.message = this.draft;
        }
        this.disabled = true;
        this._send(obj).then(function(req) {
          this.fire('send', null, {bubbles: false});
          this.draft = '';
          this.disabled = false;
          this.$.dropdown.close();
        }.bind(this)).catch(function(err) {
          alert('Oops. Something went wrong. Check the console and bug the ' +
              'PolyGerrit team for assistance.');
          throw err;
        }.bind(this));
      },

      _send: function(payload) {
        var xhr = document.createElement('gr-request');
        this._xhrPromise = xhr.send({
          method: 'POST',
          url: this.changeBaseURL(this.changeNum, this.patchNum) + '/review',
          body: payload,
        });

        return this._xhrPromise;
      },
    });
  })();
  </script>
</dom-module>
