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

engagementFeedState = tree.select('engagementFeed')
filterState = tree.select('engagementFeed', 'filterState')
FB = tree.select('filterBuilder')
accountState = tree.select('account')
actions =
  initializeFeed: ->
    engagementFeedState.select('lastUpdate').set('add')
    start = moment().format('YYYYMMDDHHmmss')
    engagementFeedState.select('lastLoad').set(
      start
    )
    reqwest
      url: "/engagement/feedback-sessions/?offset=0&limit=25"
    .then (data) ->
      if data.length != 0
        for item in data
          #Default is not selected/expanded
          item.selected = false
          if item.has_responses
            item.responseStatus = 'responded'
          else
            item.responseStatus = 'pending'
            item.responsePending = {
              subject: ''
              body: ''
              enabled: false
            }
          engagementFeedState.select('sessionIds').push(
            item.feedback_session_id
          )
        engagementFeedState.select('moreToLoad').set(true)
      engagementFeedState.select('sessions').set(data)
    reqwest
      url: '/engagement/response-templates'
    .then (data) ->
      templates = []
      for template in data
        firstChar = template.name.charAt(0)
        if firstChar != '_'
          templates.push(template)
      engagementFeedState.select('responseTemplates').set(templates)
  setLoader: (payload) ->
    engagementFeedState.select('moreToLoad').set(payload)
    tree.commit()
  getFilters: ->
    reqwest
      url: '/feedback/filter/'
    .then (data) ->
      filters = []
      filters.push {value: "create-new", label: "Create a new Filter"}
      #add prefix to value for select box
      for filter in data
        filters.push {
          value: "value-" + filter.value
          label: filter.name
          query: filter.query
        }
      filterState.select('filters').set(filters)
  getFeedbackSessions: (start) ->
    engagementFeedState.select('lastUpdate').set('add')
    sessions = engagementFeedState.get('sessions')
    reqwest
      url: "/engagement/feedback-sessions/?offset=#{start}&limit=25"
    .then (data) ->
      if data.length != 0
        for item in data
          if engagementFeedState.get('selectAll')
            item.selected = true
            if item.email and not item.has_responses
              engagementFeedState.select('recipients').push(item)
          else
            item.selected = false
          if item.has_responses
            item.responseStatus = 'responded'
          else
            item.responseStatus = 'pending'
            item.responsePending = {
              subject: ''
              body: ''
              enabled: false
            }
          engagementFeedState.select('sessions').push(item)
          engagementFeedState.select('sessionIds').push(
            item.feedback_session_id
          )
        engagementFeedState.select('moreToLoad').set(true)
  refresh: ->
    engagementFeedState.select('lastUpdate').set('add')
    sessions = engagementFeedState.get('sessions')
    start = engagementFeedState.get('lastLoad')
    end = moment().format('YYYYMMDDHHmmss')
    engagementFeedState.select('lastLoad').set(end)
    engagementFeedState.select('refreshing').set(true)
    tree.commit()
    reqwest
      url: "/engagement/feedback-sessions/?start=#{start}"
    .then (data) ->
      if data.length != 0
        data.reverse()
        for item in data
          if engagementFeedState.get('selectAll')
            item.selected = true
            if item.email and not item.has_responses
              engagementFeedState.select('recipients').push(item)
          else
            item.selected = false
          if item.has_responses
            item.responseStatus = 'responded'
          else
            item.responseStatus = 'pending'
            item.responsePending = {
              subject: ''
              body: ''
              enabled: false
            }
          engagementFeedState.select('sessions').unshift(item)
          engagementFeedState.select('sessionIds').unshift(
            item.feedback_session_id
          )
      engagementFeedState.select('refreshing').set(false)
  setRead: (id) ->
    reqwest
      url: "/feedback/read/#{id}/"
      method: 'post'
      data:
        "csrfmiddlewaretoken": Django.csrf_token(),
    .then ->
      for session, index in engagementFeedState.get('sessions')
        if session.feedback_session_id == id
          session.read = true
          engagementFeedState.select('sessions', index).set(session)
          break
  setOpen: (id) ->
    engagementFeedState.select('lastUpdate').set('open')
    for session, index in engagementFeedState.get('sessions')
      if session.feedback_session_id == id
        session.open = !(
          engagementFeedState.select('sessions', index).get('open')
        )
        engagementFeedState.select('sessions', index).set(session)
        break
  setSelected: (id, state) ->
    engagementFeedState.select('lastUpdate').set('select')
    for session, index in engagementFeedState.get('sessions')
      if session.feedback_session_id == id
        session.selected = state
        engagementFeedState.select('sessions', index).set(session)
        tree.commit()
    if state == false or tree.facets.allSelected.get()
      engagementFeedState.select('selectAll').set(state)
  selectAll: (state) ->
    engagementFeedState.select('lastUpdate').set('select')
    engagementFeedState.select('selectAll').set(state)
    for session, index in engagementFeedState.get('sessions')
      session.selected = state
      engagementFeedState.select('sessions', index).set(session)
      if state == false
        engagementFeedState.select('recipients').set([])
        engagementFeedState.select('selected').set(false)
      else
        if session.email and not session.has_responses
          engagementFeedState.select('recipients').push(session)
          if not engagementFeedState.get('selected')
            engagementFeedState.select('selected').set(true)
  setSort: (type) ->
    engagementFeedState.select('lastUpdate').set('sort')
    currentSortState = engagementFeedState.select('sortState', 'state').get()
    currentType = engagementFeedState.select('sortState', 'type').get()
    if type != currentType
      engagementFeedState.select('sortState', 'state').set('asc')
    else
      switch currentSortState
        when 'asc'
          newState = 'desc'
        when 'desc'
          newState = 'asc'
      engagementFeedState.select('sortState', 'state').set(newState)
    engagementFeedState.select('sortState', 'type').set(type)
  setReplyFilter: (payload) ->
    engagementFeedState.select('lastUpdate').set('replyFilter')
    engagementFeedState.select('replyFilter').set(payload)
  setFilter: (payload) ->
    engagementFeedState.select('lastUpdate').set('filter')
    if payload == 'create-new'
      FB.select('ruleCount').set(1)
      FB.select('rules').set([{
        type: 'VALUE'
        operator: '<='
        value: 'value-1'
        conjunction: 0
      }])
      FB.select('type').set('create-new')
      tree.commit()
      FB.select('active').set(true)
      FB.select('prompt').set(false)
      filterState.select('selectedFilter').set(null)
    else
      FB.select('active').set(false)
      sessions = engagementFeedState.get('sessions')
      filter = filterState.get(
        'filters'
        {value: payload}
      )
      filterState.select('selectedFilter').set(
        id: payload.substr(6)
        label: filter.label
        query: filter.query
      )
  editFilter: ->
    FB.select('active').set(true)
    FB.select('type').set('edit')
    query = filterState.select('selectedFilter').get('query')
    orGroups = query.split('OR;')
    ruleCount = 0
    rules = []
    for orGroup in orGroups
      andGroups = orGroup.split('AND;')
      for andGroup, i in andGroups
        if i == 0
          conj = 1
        else
          conj = 0
        ruleCount++
        split = andGroup.split(';')
        value = 'value-' + split[2]
        rules.push(
          type: split[0]
          operator: split[1]
          value: value
          conjunction: conj
        )
    FB.select('ruleCount').set(ruleCount)
    FB.select('rules').set(rules)
  clearFilter: ->
    filterState.select('selectedFilter').set(null)
  deleteFilter: ->
    engagementFeedState.select('lastUpdate').set('filter')
    filterId = filterState.select('selectedFilter').get('id')
    reqwest
      url: "/feedback/filter/remove/?filter=#{filterId}"
    .then (res) ->
      value = "value-#{res.id}"
      filters = filterState.get('filters')
      index = null
      for filter, i in filters
        if value == filter.value
          index = i
          break
      filterState.select('filters').splice([index, 1])
      FB.select('active').set(false)
      filterState.select('selectedFilter').set(null)
  setResponseName: (payload) ->
    engagementFeedState.select('responseSent', 'responseName').set(payload)
  toggleReplyMultiple: ->
    currentState = engagementFeedState.get('replyMultiple')
    engagementFeedState.select('replyMultiple').set(!(currentState))
  toggleResponseSent: ->
    currentState = engagementFeedState.get('responseSent', 'active')
    engagementFeedState.select('responseSent', 'active').set(!(currentState))
    if !(currentState) == false
      engagementFeedState.select('responseSent', 'save').set(false)
      engagementFeedState.select('responseSent', 'responseName').set('')
  toggleSaveResponse: ->
    currentState = engagementFeedState.get('responseSent', 'save')
    engagementFeedState.select('responseSent', 'save').set(!(currentState))
  addRecipient: (payload) ->
    recipient = engagementFeedState.get(
      'sessions', {feedback_session_id: payload}
    )
    if not recipient.email or recipient.has_responses
      return
    engagementFeedState.select('recipients').push(recipient)
    if not engagementFeedState.get('selected')
      engagementFeedState.select('selected').set(true)
  checkRecipientWidth: (width, index) ->
    removeDuplicates = (ar) ->
      if ar.length == 0
        return []
      res = {}
      res[ar[key]] = ar[key] for key in [0..ar.length-1]
      value for key, value of res
    multipleRecipients = engagementFeedState.select('multipleRecipients')
    debugger
    if index == 0
      currentWidth = 0
      widthRemaining = 410
    else
      currentWidth = multipleRecipients.get('currentWidth')
      widthRemaining = multipleRecipients.get('widthRemaining')
    if width < widthRemaining
      countShown = index + 2 #add 2 so that we can try next
      currentWidth = currentWidth + width
      widthRemaining = widthRemaining - width
    else
      countShown = index
    recipients = engagementFeedState.get('recipients')
    recipientNames = (recipient.email for recipient in recipients)
    totalRecipients = removeDuplicates(recipientNames).length
    notShown = totalRecipients - countShown
    if notShown < 0 then notShown = 0
    multipleRecipients.select('currentWidth').set(currentWidth)
    multipleRecipients.select('widthRemaining').set(widthRemaining)
    multipleRecipients.select('countShown').set(countShown)
    multipleRecipients.select('notShown').set(notShown)
  removeRecipient: (payload) ->
    recipient = engagementFeedState.get(
      'sessions', {feedback_session_id: payload}
    )
    if not recipient.email
      return
    recipients = engagementFeedState.get('recipients')
    newRecipients = recipients.filter (r) ->
      r.feedback_session_id isnt payload
    if newRecipients.length < 1
      engagementFeedState.select('selected').set(false)
    engagementFeedState.select('recipients').set(newRecipients)
    tree.commit()
  setResponseValue: (payload, replyMultiple, type, sid) ->
    if replyMultiple
      engagementFeedState.select('multiResponse', type).set(payload)
      tree.commit()
      sub = engagementFeedState.get('multiResponse', 'subject')
      body = engagementFeedState.get('multiResponse', 'body')
      enabled = engagementFeedState.select('multiResponse', 'enabled')
    else
      engagementFeedState.select(
        'sessions',
        {feedback_session_id: sid},
        'responsePending',
        type
      ).set(payload)
      tree.commit()
      sub = engagementFeedState.get(
        'sessions',
        {feedback_session_id: sid},
        'responsePending',
        'subject'
      )
      body = engagementFeedState.get(
        'sessions',
        {feedback_session_id: sid},
        'responsePending',
        'body'
      )
      enabled = engagementFeedState.select(
        'sessions',
        {feedback_session_id: sid},
        'responsePending',
        'enabled'
      )
    if sub != '' and body != ''
      enabled.set(true)
    else
      enabled.set(false)
  sendResponse: (payload, single) ->
    if single
      subject = engagementFeedState.get(
        'sessions',
        {feedback_session_id: payload}
        'responsePending',
        'subject'
      )
      body = engagementFeedState.get(
        'sessions',
        {feedback_session_id: payload}
        'responsePending',
        'body'
      )
    else
      subject = engagementFeedState.get(
        'multiResponse',
        'subject'
      )
      body = engagementFeedState.get(
        'multiResponse',
        'body'
      )
    save = engagementFeedState.get('responseSent', 'save')
    successHandler = (data) ->
      if payload == 'multiple'
        engagementFeedState.select('replyMultiple').set(false)
        for session, index in engagementFeedState.get('sessions')
          for recipient in engagementFeedState.get('recipients')
            if session.feedback_session_id == recipient.feedback_session_id
              session.has_responses = true
              created_at = moment().format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]')
              response =
                subject: subject
                body: body
                user: Django.user.username
                created_at: created_at
              session.responses.push(response)
              engagementFeedState.select('sessions', index).set(session)
      else
        for session, index in engagementFeedState.get('sessions')
          if session.feedback_session_id == payload
            session.has_responses = true
            created_at = moment().format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]')
            response =
              subject: subject
              body: body
              user: Django.user.username
              created_at: created_at
            session.responses.push(response)
            engagementFeedState.select('sessions', index).set(session)
            engagementFeedState.select('sessions', index, 'responseStatus')
              .set('responded')
      if data
        engagementFeedState
          .select('responseSent', 'responseID')
          .set(data.response_id)
      engagementFeedState.select('responseSent', 'response').set
        subject: subject
        body: body
      engagementFeedState.select('responseSent', 'active').set(true)
    failHandler = ->
      debugger
    feedback_sessions = []
    if payload == 'multiple'
      for recipient in engagementFeedState.get('recipients')
        feedback_sessions.push(recipient.feedback_session_id)
      reqwest
        method: 'POST'
        url: '/engagement/send-response/'
        data:
          feedback_session_ids: feedback_sessions
          subject: subject
          body: body
          save_as_template: save
          csrfmiddlewaretoken: Django.csrf_token()
      .then (data) ->
        successHandler(data)
      .fail ->
        successHandler()
    else
      reqwest
        method: 'POST'
        url: '/engagement/send-response/',
        data:
          feedback_session_id: payload
          subject: subject
          body: body
          save_as_template: save
          csrfmiddlewaretoken: Django.csrf_token()
      .then (data) ->
        successHandler(data)
      .fail ->
        successHandler()
      #failHandler
  saveResponse: ->
    name = engagementFeedState.get('responseSent', 'responseName')
    responseID = engagementFeedState.get('responseSent', 'responseID')
    reqwest
      method: 'POST'
      url: '/engagement/new-response-template/'
      data:
        name: name
        response_id: responseID
        csrfmiddlewaretoken: Django.csrf_token()
    .then (data) ->
      engagementFeedState.select('responseTemplates').push(
        data.response_template
      )
      engagementFeedState.select('responseSent', 'save').set(false)
      engagementFeedState.select('responseSent', 'responseName').set('')
      engagementFeedState.select('responseSent', 'active').set(false)
    .fail ->
      engagementFeedState.select('responseSent', 'save').set(false)
      engagementFeedState.select('responseSent', 'responseName').set('')
  closeModals: ->
    engagementFeedState.select('replyMultiple').set(false)
    engagementFeedState.select('responseSent').set(false)
    FB.select('active').set(false)
    FB.select('prompt').set(false)

module.exports = actions