import _ from 'lodash'
/* 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'
const affiliationFormController = function (
  $scope,
  $element,
  $attrs,
  UserAffiliationsDataService
) {
  const ctrl = this
  ctrl.roles = []
  ctrl.departments = []
  ctrl.countries = []
  ctrl.universities = []
  let _defaultDepartments = []

  ctrl.addUniversityToSelection = universityName => ({
    name: universityName,
    isUserSuggested: true
  })
  ctrl.handleFreeformInputChange = function ($select, propertyToMatch) {
    if ($select.search == null || $select.search === '') {
      return
    }
    let resultingItem = $select.search
    if (($select.tagging != null ? $select.tagging.fct : undefined) != null) {
      resultingItem = $select.tagging.fct($select.search)
    }
    if (propertyToMatch != null) {
      const matchingItem = _.find(
        $select.items,
        item => item[propertyToMatch] === $select.search
      )
      if (matchingItem != null) {
        resultingItem = matchingItem
      }
    }
    return $select.searchInput.scope().$broadcast('uis:select', resultingItem)
  }

  // Populates the countries dropdown
  UserAffiliationsDataService.getCountries().then(
    countries => (ctrl.countries = countries)
  )
  // Populates the roles dropdown
  UserAffiliationsDataService.getDefaultRoleHints().then(
    roles => (ctrl.roles = roles)
  )
  // Fetches the default department hints
  UserAffiliationsDataService.getDefaultDepartmentHints().then(
    departments => (_defaultDepartments = departments)
  )
  // Populates the universities dropdown (after selecting a country)
  $scope.$watch(
    '$ctrl.affiliationData.country',
    function (newSelectedCountry, prevSelectedCountry) {
      if (
        newSelectedCountry != null &&
        newSelectedCountry !== prevSelectedCountry
      ) {
        ctrl.affiliationData.university = null
        ctrl.affiliationData.role = null
        ctrl.affiliationData.department = null
        return UserAffiliationsDataService.getUniversitiesFromCountry(
          newSelectedCountry
        ).then(universities => (ctrl.universities = universities))
      }
    }
  )
  // Populates the departments dropdown (after selecting a university)
  $scope.$watch(
    '$ctrl.affiliationData.university',
    function (newSelectedUniversity, prevSelectedUniversity) {
      if (
        newSelectedUniversity != null &&
        newSelectedUniversity !== prevSelectedUniversity &&
        (newSelectedUniversity.departments != null
          ? newSelectedUniversity.departments.length
          : undefined) > 0
      ) {
        return (ctrl.departments = _.uniq(newSelectedUniversity.departments))
      } else {
        return (ctrl.departments = _defaultDepartments)
      }
    }
  )
}

export default App.component('affiliationForm', {
  bindings: {
    affiliationData: '=',
    showUniversityAndCountry: '<',
    showRoleAndDepartment: '<'
  },
  controller: affiliationFormController,
  templateUrl: 'affiliationFormTpl'
})
