/*
 * Licensed to Elasticsearch B.V. under one or more contributor
 * license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright
 * ownership. Elasticsearch B.V. licenses this file to you 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 { uiModules } from '../modules';
import template from './sortable_column.html';

const app = uiModules.get('kibana');

app.directive('sortableColumn', function (i18n) {
  return {
    restrict: 'E',
    transclude: true,
    template: template,
    scope: {
      field: '@',
      sortField: '=',
      sortReverse: '=',
      onSortChange: '=',
    },
    controllerAs: 'sortableColumn',
    bindToController: true,
    controller: class SortableColumnController {
      toggle = () => {
        if (this.sortField === this.field) {
          this.onSortChange(this.field, !this.sortReverse);
        } else {
          this.onSortChange(this.field, false);
        }
      }

      getAriaLabel() {
        const isAscending = this.isSortedAscending();
        if(isAscending) {
          return i18n('common.ui.sortableColumn.sortAscendingAriaLabel', {
            defaultMessage: 'Sort {field} ascending',
            values: { field: this.field },
          });
        }
        return i18n('common.ui.sortableColumn.sortDescendingAriaLabel', {
          defaultMessage: 'Sort {field} descending',
          values: { field: this.field },
        });
      }

      isSorted() {
        return this.sortField === this.field;
      }

      isSortedAscending() {
        return this.isSorted() && !this.sortReverse;
      }

      isSortedDescending() {
        return this.isSorted() && this.sortReverse;
      }
    }
  };
});
