/**
 * @license
 * 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.
 */

/** @polymerBehavior Gerrit.ChangeTableBehavior */
export const ChangeTableBehavior = {
  properties: {
    columnNames: {
      type: Array,
      value: [
        'Subject',
        'Status',
        'Owner',
        'Assignee',
        'Reviewers',
        'Comments',
        'Repo',
        'Branch',
        'Updated',
        'Size',
      ],
      readOnly: true,
    },
  },

  /**
   * Returns the complement to the given column array
   *
   * @param {Array} columns
   * @return {!Array}
   */
  getComplementColumns(columns) {
    return this.columnNames.filter(column => !columns.includes(column));
  },

  /**
   * @param {string} columnToCheck
   * @param {!Array} columnsToDisplay
   * @return {boolean}
   */
  isColumnHidden(columnToCheck, columnsToDisplay) {
    if ([columnsToDisplay, columnToCheck].some(arg => arg === undefined)) {
      return false;
    }
    return !columnsToDisplay.includes(columnToCheck);
  },

  /**
   * Is the column disabled by a server config or experiment? For example the
   * assignee feature might be disabled and thus the corresponding column is
   * also disabled.
   *
   * @param {string} column
   * @param {Object} config
   * @param {!Array<string>} experiments
   * @return {boolean}
   */
  isColumnEnabled(column, config, experiments) {
    if (!config || !config.change) return true;
    if (column === 'Assignee') return !!config.change.enable_assignee;
    if (column === 'Comments') return experiments.includes('comments-column');
    if (column === 'Reviewers') return !!config.change.enable_attention_set;
    return true;
  },

  /**
   * @param {!Array<string>} columns
   * @param {Object} config
   * @param {!Array<string>} experiments
   * @return {!Array<string>} enabled columns, see isColumnEnabled().
   */
  getEnabledColumns(columns, config, experiments) {
    return columns.filter(
        col => this.isColumnEnabled(col, config, experiments));
  },

  /**
   * The Project column was renamed to Repo, but some users may have
   * preferences that use its old name. If that column is found, rename it
   * before use.
   *
   * @param {!Array<string>} columns
   * @return {!Array<string>} If the column was renamed, returns a new array
   *     with the corrected name. Otherwise, it returns the original param.
   */
  getVisibleColumns(columns) {
    const projectIndex = columns.indexOf('Project');
    if (projectIndex === -1) { return columns; }
    const newColumns = columns.slice(0);
    newColumns[projectIndex] = 'Repo';
    return newColumns;
  },
};

// TODO(dmfilippov) Remove the following lines with assignments
// Plugins can use the behavior because it was accessible with
// the global Gerrit... variable. To avoid breaking changes in plugins
// temporary assign global variables.
window.Gerrit = window.Gerrit || {};
window.Gerrit.ChangeTableBehavior = ChangeTableBehavior;
