/**
 * @license
 * Copyright (C) 2020 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.
 */
import {CodeOwnersModelMixin} from './code-owners-model-mixin.js';
import {PluginState} from './code-owners-model.js';

export class SuggestOwnersTrigger extends
  CodeOwnersModelMixin(Polymer.Element) {
  static get is() {
    return 'suggest-owners-trigger';
  }

  static get properties() {
    return {
      hidden: {
        type: Boolean,
        computed: '_computeHidden(model.pluginStatus,' +
            'model.areAllFilesApproved, model.userRole, model.branchConfig)',
        reflectToAttribute: true,
      },
    };
  }

  static get template() {
    return Polymer.html`
        <style include="shared-styles">
          :host {
            display: flex;
          }
          a {
            text-decoration: none;
          }
          gr-button {
            --padding: var(--spacing-xs) var(--spacing-s);
          }
        </style>
        <gr-button
          link
          on-click="toggleControlContent"
          has-tooltip
          title="Suggest owners for your change"
        >
          [[computeButtonText(model.showSuggestions)]]
        </gr-button>
        <span>
          <a on-click="_reportBugClick" href="https://bugs.chromium.org/p/gerrit/issues/entry?template=code-owners-plugin" target="_blank">
            <iron-icon icon="gr-icons:bug" title="report a problem"></iron-icon>
          </a>
          <a on-click="_reportDocClick" href="https://gerrit.googlesource.com/plugins/code-owners/+/master/resources/Documentation/how-to-use.md" target="_blank">
            <iron-icon icon="gr-icons:help-outline" title="read documentation"></iron-icon>
          </a>
        </span>
      `;
  }

  loadPropertiesAfterModelChanged() {
    super.loadPropertiesAfterModelChanged();
    this.modelLoader.loadUserRole();
    this.modelLoader.loadPluginStatus();
    this.modelLoader.loadAreAllFilesApproved();
    this.modelLoader.loadBranchConfig();
  }

  _computeHidden(pluginStatus, allFilesApproved, userRole, branchConfig) {
    if (pluginStatus === undefined ||
        allFilesApproved === undefined ||
        userRole === undefined ||
        branchConfig === undefined) {
      return true;
    }
    if (branchConfig.no_code_owners_defined) return true;
    if (pluginStatus.state === PluginState.Enabled) {
      return allFilesApproved;
    } else {
      return true;
    }
  }

  toggleControlContent() {
    this.model.setShowSuggestions(!this.model.showSuggestions);
    this.reporting.reportInteraction('toggle-suggest-owners', {
      expanded: this.expanded,
      user_role: this.model.userRole ?
        this.model.userRole : 'UNKNOWN',
    });
  }

  computeButtonText(expanded) {
    return expanded ? 'Hide owners' : 'Suggest owners';
  }

  _reportDocClick() {
    this.reporting.reportInteraction('code-owners-doc-click');
  }

  _reportBugClick() {
    this.reporting.reportInteraction('code-owners-bug-click');
  }
}

customElements.define(SuggestOwnersTrigger.is, SuggestOwnersTrigger);
