React = require('react')
moment = require('moment')
customFilter = (sessions, selectedFilter) ->
  getSessionScore = (session, type) ->
    if type == 'LENGTH(COMMENTS)'
      if not session.comments
        return false
      else
        return session.comments.length
    else if (type != 'SATISFACTION') and (type != 'SENTIMENT')
      type = type.toLowerCase()
      if not session.ratings
        return false
      else
        if session.ratings[type] == 0
          return false
        else
          return session.ratings[type]
    else if type == 'SATISFACTION'
      if not session.net_promoter_score
        return false
      else
        return session.net_promoter_score.score
    else
      if not session.review
        return false
      else
        return session.review.review
  checkScore = (score, op, value) ->
    switch op
      when '<='
        return score <= value
      when '<'
        return score < value
      when '='
        return score == value
      when '>'
        return score > value
      when '>='
        return score >= value
  query = selectedFilter.query
  displayedIds = []
  orGroups = []
  andGroups = []
  orGroups = query.split('OR;')
  for session in sessions
    orPassed = false
    for orGroup in orGroups
      andGroups = orGroup.split('AND;')
      for andGroup in andGroups
        split = andGroup.split(';')
        score = getSessionScore(session, split[0])
        if score
          if not checkScore(score, split[1], split[2])
            andPassed = false
            break
          else
            andPassed = true
        else
          andPassed = false
          break
      if andPassed then orPassed = true
    if orPassed then displayedIds.push(session.feedback_session_id)
  return displayedIds
replyFilter = (sessions, replyFilter) ->
  displayedIds = []
  switch replyFilter
    when 'replied'
      for session in sessions
        if session.has_responses
          displayedIds.push(session.feedback_session_id)
    when 'notReplied'
      for session in sessions
        if not session.has_responses and session.email
          displayedIds.push(session.feedback_session_id)
  return displayedIds
sortByKey = (sessions, key, sortState) ->
  if sortState == "none"
    return false
  return sessions.sort (a, b) ->
    if sortState == "asc"
      x = a[key]
      y = b[key]
      if x == null then x = "zzzzzzzzz"
      if y == null then y = "zzzzzzzzz"
    else
      y = a[key]
      x = b[key]
      if x == null then x = "aaaaaaaaa"
      if y == null then y = "aaaaaaaaa"
    if key == "sxi"
      x = 100 - x
      y = 100 - y
    return (
      if (x < y) then -1 else if (x > y) then 1 else 0
    )
sortByDate = (sessions, sortState) ->
  if sortState == "none"
    return false
  return sessions.sort (a, b) ->
    if sortState == "asc"
      x = moment(b.created_at)
      y = moment(a.created_at)
    else
      x = moment(a.created_at)
      y = moment(b.created_at)
    return (
      if (x.isBefore(y)) then -1 else if (y.isBefore(x)) then 1 else 0
    )
sortSessions = (sessions, type, sortState) ->
  if type == 'date'
    sortedSessions = sortByDate(
      sessions
      sortState
    )
  else
    sortedSessions = sortByKey(
      sessions
      type
      sortState
    )
  return sortedSessions
existsInArray = (value, array) ->
  for posValue in array
    return true if posValue == value
  false
module.exports = {
  cursors:
    selectedFilter: ['engagementFeed', 'filterState', 'selectedFilter']
    selectedReplyFilter: ['engagementFeed', 'replyFilter']
    sortState: ['engagementFeed', 'sortState']
    sessions: ['engagementFeed', 'sessions']
    sessionIds: ['engagementFeed', 'sessionIds']
    lastUpdate: ['engagementFeed', 'lastUpdate']
  get: (state) ->
    displayedIds = state.sessionIds
    displayedSessions = state.sessions
    if state.selectedFilter
      displayedIds = customFilter(state.sessions, state.selectedFilter)
      displayedSessions = []
      for session in state.sessions
        if existsInArray(session.feedback_session_id, displayedIds)
          displayedSessions.push(session)
    if state.selectedReplyFilter != 'all'
      displayedIds = replyFilter(displayedSessions, state.selectedReplyFilter)
      displayedSessions = []
      for session in state.sessions
        if existsInArray(session.feedback_session_id, displayedIds)
          displayedSessions.push(session)
    if (state.lastUpdate == 'sort') or (state.lastUpdate == 'add')
      sortedSessions = sortSessions(
        displayedSessions
        state.sortState.type
        state.sortState.state
      )
    else
      sortedSessions = displayedSessions
    return sortedSessions
}
