import store from 'common/store'
import request from 'common/request'
import {array_contains, property_getter, array_from_hash} from 'common/utilities'
import {is_valid_email} from 'common/users'
import {update_recruiter, store_teams, store_recruiters} from 'actions/recruiters'
import {update_profile} from 'actions/profile'
import {show_popover, dismiss_popover, alert_success, alert_warning, alert_failure} from 'actions/display'
import NewRecruiter from 'components/popovers/new_recruiter'

export function recruiter_full_name({first_name, last_name, email}) {
  first_name = first_name ? first_name.trim() : ""
  last_name = last_name ? last_name.trim() : ""
  return `${first_name} ${last_name}`.trim() || email
}

export function action_update_recruiter(recruiter) {
  store.dispatch(update_recruiter(recruiter))
  request.delayed_put(`recruiters/${recruiter.id}`, {recruiter})
}

export function action_create_team(name) {
  const {profile: {agency: {id}}} = store.getState()
  return request.post(`agencies/${id}/teams`, {team: {name}})
  .then((team) => {
    store.dispatch(store_teams([team]))
    return team.id
  })
}

export function action_invite_recruiter() {
  store.dispatch(show_popover(
    NewRecruiter,
    {invite_recruiter(recruiter) {
      const email = recruiter.email
      if (!email) {
        store.dispatch(alert_failure("Veuillez renseigner une adresse mail."))
      } else if (array_contains(array_from_hash(store.getState().recruiters.recruiters).map(property_getter('email')), email)) {
        store.dispatch(alert_failure("Vous avez déjà invité ce recruteur."))
      } else if (!is_valid_email(email)) {
        store.dispatch(alert_failure("Ce n'est pas une adresse mail valide."))
      } else {
        request.post('recruiters', {recruiter})
        .then((recruiter) => {
          store.dispatch(alert_success(`Nous avons envoyé un mail d'invitation à ${recruiter_full_name(recruiter)}`))
          store.dispatch(store_recruiters([recruiter]))
        }, () => {
          store.dispatch(alert_warning(`Ce recruteur fait déjà partie d'une autre agence, par conséquent nous n'avons pas envoyé de mail à ${recruiter_full_name(recruiter)}.`))
        })
        store.dispatch(dismiss_popover())
      }
    }},
    'Ajouter un collaborateur'
  ))
}

export function action_update_profile(profile) {
  store.dispatch(update_profile(profile))
  const {id} = store.getState().profile
  return request.put(`recruiters/${id}`, {recruiter: profile})
}
