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

import {dedupingMixin} from '@polymer/polymer/lib/utils/mixin.js';

/**
 * @polymer
 * @mixinFunction
 */
export const ChangeTableMixin = dedupingMixin(superClass => {
  /**
   * @polymer
   * @mixinClass
   */
  class Mixin extends superClass {
    static get properties() {
      return {
        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].includes(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;
    }
  }

  return Mixin;
});

