/**
 * @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 './gr-create-checkers-dialog.js';
import {htmlTemplate} from './gr-checkers-list_html.js';

const CHECKERS_PER_PAGE = 15;
const GET_CHECKERS_URL = '/plugins/checks/checkers/';

/**
 * Show a list of all checkers along with creating/editing them
 */
class GrCheckersList extends Polymer.GestureEventListeners(
    Polymer.LegacyElementMixin(
        Polymer.Element)) {
/** @returns {?} template for this component */
  static get template() { return htmlTemplate; }

  /** @returns {string} name of the component */
  static get is() { return 'gr-checkers-list'; }

  /**
   * Defines properties of the component
   *
   * @returns {?}
   */
  static get properties() {
    return {
      /**
       * Add observer on pluginRestApi to call getCheckers when it's defined
       * as initially getCheckers was being called before pluginRestApi was
       * initialised by gr-checks-view
       */
      pluginRestApi: {
        type: Object,
      },
      // Checker that will be passed to the editOverlay modal
      checker: Object,
      _checkers: Array,
      // List of checkers that contain the filtered text
      _filteredCheckers: Array,
      _loading: {
        type: Boolean,
        value: true,
      },
      _filter: {
        type: String,
        value: '',
      },
      _visibleCheckers: {
        type: Array,
        computed: '_computeVisibleCheckers(' +
            '_startingIndex, _filteredCheckers)',
      },
      _createNewCapability: {
        type: Boolean,
        value: true,
      },
      _startingIndex: {
        type: Number,
        value: 0,
      },
      _showNextButton: {
        type: Boolean,
        value: true,
        computed: '_computeShowNextButton(_startingIndex, _filteredCheckers)',
      },
      _showPrevButton: {
        type: Boolean,
        value: true,
        computed: '_computeShowPrevButton(_startingIndex, _filteredCheckers)',
      },
    };
  }

  static get observers() {
    return [
      '_showCheckers(_checkers, _filter)',
    ];
  }

  attached() {
    super.attached();
    /**
     * Adding an observer to listBody element as gr-overlay does not
     * automatically resize itself once the getCheckers response comes.
     * Polymer 2 will deprecate use of obserNodes so replacing it
     * with FlattenedNodesObserver
     */
    if (Polymer.FlattenedNodesObserver) {
      this._checkersListObserver = new Polymer.FlattenedNodesObserver(
          this.$.listBody, () => {
            this.$.listOverlay.refit();
          });
    } else {
      this._checkersListObserver = Polymer.dom(this.$.listBody).observeNodes(
          () => {
            this.$.listOverlay.refit();
          });
    }
  }

  detached() {
    super.detached();
    Polymer.dom(this.$.listBody).unobserveNodes(this._checkersListObserver);
  }

  _contains(target, keyword) {
    return target.toLowerCase().includes(keyword.toLowerCase().trim());
  }

  _showConfigureOverlay() {
    this.$.listOverlay.open().then(
        () => {
          this._getCheckers();
        }
    );
  }

  _showCheckers(_checkers, _filter) {
    if (!_checkers) return;
    if (!_filter) _filter = '';
    // TODO(dhruvsri): highlight matching part
    this._filteredCheckers = this._checkers.filter(checker =>
      this._contains(checker.name, this._filter) ||
        this._contains(checker.repository, this._filter));
    this._startingIndex = 0;
  }

  computeLoadingClass(loading) {
    return loading ? 'loading' : '';
  }

  _computeVisibleCheckers(_startingIndex, _filteredCheckers) {
    if (!_filteredCheckers) {
      return [];
    }
    return this._filteredCheckers.slice(this._startingIndex,
        this._startingIndex + CHECKERS_PER_PAGE);
  }

  _computeShowNextButton(_startingIndex, _filteredCheckers) {
    if (!_filteredCheckers) {
      return false;
    }
    return _startingIndex + CHECKERS_PER_PAGE < _filteredCheckers.length;
  }

  _computeShowPrevButton(_startingIndex, _filteredCheckers) {
    if (!_filteredCheckers) {
      return false;
    }
    return _startingIndex >= CHECKERS_PER_PAGE;
  }

  _handleNextClicked() {
    if (this._startingIndex + CHECKERS_PER_PAGE <
        this._filteredCheckers.length) {
      this._startingIndex += CHECKERS_PER_PAGE;
    }
  }

  _handlePrevClicked() {
    if (this._startingIndex >= CHECKERS_PER_PAGE) {
      this._startingIndex -= CHECKERS_PER_PAGE;
    }
  }

  _getCheckers() {
    if (!this.pluginRestApi) return;
    this.pluginRestApi.get(GET_CHECKERS_URL).then(checkers => {
      if (!checkers) { return; }
      this._checkers = checkers;
      this._startingIndex = 0;
      this._loading = false;
    });
  }

  _handleEditConfirm() {
    this.$.editModal.handleEditChecker();
  }

  _handleEditIconClicked(e) {
    const checker = e.model.item;
    this.checker = checker;
    this.$.editOverlay.open();
  }

  _handleEditCancel(e) {
    if (e.detail.reload) {
      this._getCheckers();
    }
    this.$.editOverlay.close();
  }

  _computeCreateClass(createNew) {
    return createNew ? 'show' : '';
  }

  _computeBlocking(checker) {
    return (checker && checker.blocking && checker.blocking.length > 0)
      ? 'YES': 'NO';
  }

  _handleCreateConfirm() {
    this.$.createNewModal.handleCreateChecker();
  }

  _handleCreateClicked() {
    this.$.createOverlay.open();
  }

  _handleCreateCancel(e) {
    if (e.detail && e.detail.reload) {
      this._getCheckers();
    }
    this.$.createOverlay.close();
  }
}

customElements.define(GrCheckersList.is, GrCheckersList);