'use strict'

##
# Controller used in notifications page
# inherits $scope.$parent.notifications (unread notifications) from ApplicationController
##
Application.Controllers.controller "NotificationsController", ["$scope", 'Notification', ($scope, Notification) ->



  ### PRIVATE STATIC CONSTANTS ###

  # Number of notifications added to the page when the user clicks on 'load next notifications'
  NOTIFICATIONS_PER_PAGE = 15



  ### PUBLIC SCOPE ###

  ## Array containg the archived notifications (already read)
  $scope.notificationsRead = []

  ## By default, the pagination mode is activated to limit the page size
  $scope.paginateActive = true

  ## The currently displayed page number
  $scope.page = 1



  ##
  # Mark the provided notification as read, updating its status on the server and moving it
  # to the already read notifications list.
  # @param notification {{id:number}} the notification to mark as read
  # @param e {Object} see https://docs.angularjs.org/guide/expression#-event-
  ##
  $scope.markAsRead = (notification, e) ->
    e.preventDefault()
    Notification.update {id: notification.id},
      id: notification.id
      is_read: true
    , ->
      index = $scope.$parent.notifications.indexOf(notification)
      $scope.$parent.notifications.splice(index,1)
      $scope.notificationsRead.push notification



  ##
  # Mark every unread notifications as read and move them for the unread list to to read array.
  ##
  $scope.markAllAsRead = ->
    Notification.update {}
    , -> # success
      angular.forEach $scope.$parent.notifications, (n)->
        $scope.notificationsRead.push n

      $scope.$parent.notifications.splice(0, $scope.$parent.notifications.length)



  ##
  # Request the server to retrieve the next undisplayed notifications and add them
  # to the archived notifications list.
  ##
  $scope.addMoreNotificationsReaded = ->
    Notification.query {is_read: true, page: $scope.page}, (notifications) ->
      $scope.notificationsRead = $scope.notificationsRead.concat notifications
      $scope.paginateActive = false if notifications.length < NOTIFICATIONS_PER_PAGE

    $scope.page += 1



  ### PRIVATE SCOPE ###

  ##
  # Kind of constructor: these actions will be realized first when the controller is loaded
  ##
  initialize = ->
    $scope.addMoreNotificationsReaded()



  ## !!! MUST BE CALLED AT THE END of the controller
  initialize()
]