'use strict'

###*
 @ngdoc overview
 @name payrollhero.api.TimeHelper
###
angular.module('payrollhero.api')
.factory 'TimeHelper', ->
  ###*
    @ngdoc service
    @name payrollhero.api.TimeHelper
  ###

  ###*
    @ngdoc method
    @name daysOfTheWeek
    @methodOf payrollhero.api.TimeHelper
    @param {moment} dayOfWeek
    @returns {Array<Moment>} all days of that week.
  ###
  daysOfTheWeek: (dayOfWeek) ->
    weekStart = dayOfWeek.startOf('week').add(days: -1)

    for i in [0 .. 6]
      moment(weekStart.add(days: 1))

  ###*
    @ngdoc method
    @name daysOfThisWeek
    @methodOf payrollhero.api.TimeHelper
    @returns {Array<Moment>} all days of this week.
  ###
  daysOfThisWeek: ->
    @daysOfTheWeek @now()

  ###
    @ngdoc method
    @name isToday
    @methodOf payrollhero.api.TimeHelper
    @param {moment} day
    @returns {true|false}
  ###
  isToday: (day) ->
    day.isSame(moment(),'day')

  ###
    @ngdoc method
    @name payrollhero.api.TimeHelper#timeZone
    @methodOf payrollhero.api.TimeHelper
    @returns {string} the current timezone
  ###
  timeZone: ->
    Intl.DateTimeFormat().resolved.timeZone

  ###
    @ngdoc method
    @name adjustToDay
    @methodOf payrollhero.api.TimeHelper
    @param {moment} day
    @param {moment} time
    @param {string} tz timezone to use for adjustment
    @description moves the time components of 'time' onto 'day' and gives the new moment
    @returns {moment} day combined with time in the given zone.
  ###
  adjustToDay: (day, time, tz) ->
    diff = time.diff(moment(time).startOf('day'))
    newTime = moment(day).tz(tz).startOf('day').add(diff, 'milliseconds')
    newTime

  moveAndPutInTz: (days, time, tz) ->
    diff = time.diff(moment(time).startOf('day'))
    theDayString = moment(time).startOf('day').add(days,'days').toISODateString()
    moment.tz(theDayString, tz).add(diff, 'milliseconds')

  differenceInWholeDays: (time1, time2) ->
    moment(time1).endOf('day').diff(moment(time2).endOf('day'), 'days')

  ###
    @ngdoc method
    @name TimeHelper.now
    @methodOf payrollhero.api.TimeHelper
    @returns {moment}
  ###
  now: ->
    moment()

  ###*
    @ngdoc function
    @name todayAt
    @methodOf payrollhero.api.TimeHelper
    @function
    @param {String} timeString
    @return {moment} theMoment
  ###
  todayAt: (timeString) ->
    moment(timeString, 'hh:mm')
