// Copyright (C) 2016 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.
(function(window) {
  'use strict';

  /**
   * Don't add new API methods to GrChangeReplyInterfaceOld.
   * All new API should be added to GrChangeReplyInterface.
   * @deprecated
   */
  class GrChangeReplyInterfaceOld {
    constructor(el) {
      this._el = el;
    }

    getLabelValue(label) {
      return this._el.getLabelValue(label);
    }

    setLabelValue(label, value) {
      this._el.setLabelValue(label, value);
    }

    send(opt_includeComments) {
      return this._el.send(opt_includeComments);
    }
  }

  class GrChangeReplyInterface extends GrChangeReplyInterfaceOld {
    constructor(plugin, el) {
      super(el);
      this.plugin = plugin;
    }

    addReplyTextChangedCallback(handler) {
      this.plugin.getDomHook('reply-text').then(el => {
        if (!el.content) { return; }
        el.content.addEventListener('value-changed', e => {
          handler(e.detail.value);
        });
      });
    }
  }

  window.GrChangeReplyInterface = GrChangeReplyInterface;
})(window);

// Copyright (C) 2016 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.
(function(window) {
  'use strict';

  /**
   * @deprecated
   */
  function GrChangeReplyInterfaceOld(el) {
    this._el = el;
  }

  GrChangeReplyInterfaceOld.prototype.getLabelValue = function(label) {
    return this._el.getLabelValue(label);
  };

  GrChangeReplyInterfaceOld.prototype.setLabelValue = function(label, value) {
    this._el.setLabelValue(label, value);
  };

  GrChangeReplyInterfaceOld.prototype.send = function(opt_includeComments) {
    return this._el.send(opt_includeComments);
  };

  function GrChangeReplyInterface(plugin, el) {
    GrChangeReplyInterfaceOld.call(this, el);
    this.plugin = plugin;
    this._hookName = plugin.getPluginName() + '-autogenerated-'
      + String(Math.random()).split('.')[1];
  }
  GrChangeReplyInterface.prototype._hookName = '';
  GrChangeReplyInterface.prototype._hookClass = null;
  GrChangeReplyInterface.prototype._hookPromise = null;

  GrChangeReplyInterface.prototype =
    Object.create(GrChangeReplyInterfaceOld.prototype);
  GrChangeReplyInterface.prototype.constructor = GrChangeReplyInterface;

  GrChangeReplyInterface.prototype.getDomHook = function() {
    if (!this._hookPromise) {
      this._hookPromise = new Promise((resolve, reject) => {
        this._hookClass = Polymer({
          is: this._hookName,
          properties: {
            plugin: Object,
            content: Object,
          },
          attached() {
            resolve(this);
          },
        });
        this.plugin.registerCustomComponent('reply-text', this._hookName);
      });
    }
    return this._hookPromise;
  };

  GrChangeReplyInterface.prototype.addReplyTextChangedCallback =
    function(handler) {
      this.getDomHook().then(el => {
        if (!el.content) { return; }
        el.content.addEventListener('value-changed', e => {
          handler(e.detail.value);
        });
      });
    };

  window.GrChangeReplyInterface = GrChangeReplyInterface;
})(window);

Revert gr-change-reply-js-api to non-ES6 class