/**
 * @license
 * Copyright (C) 2017 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';

  // Prevent redefinition.
  if (window.GrRepoApi) { return; }

  function GrRepoApi(plugin) {
    this._hook = null;
    this.plugin = plugin;
  }

  GrRepoApi.prototype._createHook = function(title) {
    this._hook = this.plugin.hook('repo-command').onAttached(element => {
      const pluginCommand =
            document.createElement('gr-plugin-repo-command');
      pluginCommand.title = title;
      element.appendChild(pluginCommand);
    });
  };

  GrRepoApi.prototype.createCommand = function(title, callback) {
    if (this._hook) {
      console.warn('Already set up.');
      return this._hook;
    }
    this._createHook(title);
    this._hook.onAttached(element => {
      if (callback(element.repoName, element.config) === false) {
        element.hidden = true;
      }
    });
    return this;
  };

  GrRepoApi.prototype.onTap = function(callback) {
    if (!this._hook) {
      console.warn('Call createCommand first.');
      return this;
    }
    this._hook.onAttached(element => {
      this.plugin.eventHelper(element).on('command-tap', callback);
    });
    return this;
  };

  window.GrRepoApi = GrRepoApi;
})(window);
