tree = require('../states/appState')
reqwest = require('reqwest')

isValidEmailAddress = (address) ->
  pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i)
  return pattern.test(address)

peopleState = tree.select('people')

actions =
  loadUsers: ->
    reqwest
      url: "/users/team-invites/current/details/"
    .then (team) ->
      peopleState.select('userlist').set(team)
  saveChanges: ->
    reqwest
      url: "/users/team-invites/edit/"
      method: 'post'
      data:
        csrfmiddlewaretoken: Django.csrf_token()
        users_removed: peopleState.select('users_removed').get()
        invite_cancel_ids: peopleState.select('invites_removed').get()
        users_to_admin: peopleState.select('users_to_admin').get()
        users_to_non_admin: peopleState.select('users_to_non_admin').get()
    .then (res) ->
      peopleState.select('status').set(
        show: true
        status: "success"
        message: "Changes successfully made"
      )
      peopleState.select('users_removed').set([])
      peopleState.select('invites_removed').set([])
      peopleState.select('users_to_admin').set([])
      peopleState.select('users_to_non_admin').set([])
      peopleState.select('newchanges').set(false)
      peopleState.select('window', 'onbeforeunload').set(null)
      reqwest
        url: "/users/team-invites/current/details/"
      .then (team) ->
        peopleState.select('userlist').set(team)
  handleNewUser: (newUserEmail) ->
    if peopleState.select('userlist', {email: newUserEmail}).relevant
        peopleState.select('status').set(
          show: true
          status: "error"
          message: "User already exists"
        )
    else
      reqwest
        url: "/users/team-invites/"
        method: 'post'
        data:
          csrfmiddlewaretoken: Django.csrf_token()
          team_invite_email: newUserEmail
      .then (res) ->
        invited_user = {active: false, admin: false, email: newUserEmail, id: res}
        peopleState.select('userlist').push(invited_user)
      .fail (err) ->
        if err.status == 400
          peopleState.select('status').set(
            show: true
            status: "error"
            message: "This email address is already associated with an account"
          )
  handleRemoveUser: (removeUserId, userIsActive) ->
    peopleState.select('userlist', {id: removeUserId}).set('removed', true)
    if userIsActive
      peopleState.select('users_removed').push([removeUserId])
    else
      peopleState.select('invites_removed').push([removeUserId])
    peopleState.select('newchanges').set(true)
    peopleState.select('window', 'onbeforeunload').set( ->
      return "You have unsaved changes"
    )
  handleToggleAdmin: (toggleUserId, userIsAdmin) ->
    if userIsAdmin
      peopleState.select('users_to_non_admin').push(toggleUserId)
      peopleState.select('userlist', {id: toggleUserId}, 'admin').set(false)
    else
      peopleState.select('users_to_admin').push(toggleUserId)
      peopleState.select('userlist', {id: toggleUserId}, 'admin').set(true)
    peopleState.select('newchanges').set(true)
  userSubmitChangeHandler: (e) ->
    peopleState.select('usercreate').set(
      value: e.target.value
      enabled: isValidEmailAddress(e.target.value)
    )
      
module.exports = actions
