/* eslint-disable
    max-len,
    no-return-assign,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS102: Remove unnecessary code created because of implicit returns
 * DS207: Consider shorter variations of null checks
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
import App from '../base'
App.directive('selectAllList', () => ({
  controller: [
    '$scope',
    function ($scope) {
      // Selecting or deselecting all should apply to all projects
      this.selectAll = () => $scope.$broadcast('select-all:select')

      this.deselectAll = () => $scope.$broadcast('select-all:deselect')

      this.clearSelectAllState = () => $scope.$broadcast('select-all:clear')
    }
  ],
  link(scope, element, attrs) {}
}))

App.directive('selectAll', () => ({
  require: '^selectAllList',
  link(scope, element, attrs, selectAllListController) {
    scope.$on('select-all:clear', () => element.prop('checked', false))

    return element.change(function () {
      if (element.is(':checked')) {
        selectAllListController.selectAll()
      } else {
        selectAllListController.deselectAll()
      }
      return true
    })
  }
}))

App.directive('selectIndividual', () => ({
  require: '^selectAllList',
  scope: {
    ngModel: '='
  },
  link(scope, element, attrs, selectAllListController) {
    let ignoreChanges = false

    scope.$watch('ngModel', function (value) {
      if (value != null && !ignoreChanges) {
        return selectAllListController.clearSelectAllState()
      }
    })

    scope.$on('select-all:select', function () {
      if (element.prop('disabled')) {
        return
      }
      ignoreChanges = true
      scope.$apply(() => (scope.ngModel = true))
      return (ignoreChanges = false)
    })

    scope.$on('select-all:deselect', function () {
      if (element.prop('disabled')) {
        return
      }
      ignoreChanges = true
      scope.$apply(() => (scope.ngModel = false))
      return (ignoreChanges = false)
    })

    return scope.$on('select-all:row-clicked', function () {
      if (element.prop('disabled')) {
        return
      }
      ignoreChanges = true
      scope.$apply(function () {
        scope.ngModel = !scope.ngModel
        if (!scope.ngModel) {
          return selectAllListController.clearSelectAllState()
        }
      })
      return (ignoreChanges = false)
    })
  }
}))

export default App.directive('selectRow', () => ({
  scope: true,
  link(scope, element, attrs) {
    return element.on('click', e => scope.$broadcast('select-all:row-clicked'))
  }
}))
