'use strict'

angular.module('payrollhero.api').factory 'Employee', (EmployeeScheduleDayList, EmployeeScheduleInfo) ->
  anyHolidaysOn = (sharedEvents, day) ->
    _(sharedEvents).chain().where(kind: "holiday", day_event_date: day.toISODateString()).some().value()

  class Employee
    fullname: ->
      _([@firstname, @lastname]).compact().join(' ')

    picUrl: ->
      @avatar.profile if @avatar && @avatar.profile

    scheduleInfoOn: (sharedEvents, day) ->
      scheduleInfo = new EmployeeScheduleInfo(this, day)
      scheduleInfo.onHoliday = anyHolidaysOn(sharedEvents, day) && !@worksHolidayOn(day)
      scheduleInfo.shifts = @shiftsOn(day)
      scheduleInfo.overrides = @overriddenShiftsOn(day)
      scheduleInfo.wholeDayEvents = @wholeDayEventsOn(day)
      scheduleInfo.allEvents = @allEventsOn(day)
      scheduleInfo

    worksHolidayOn: (day) ->
      @works_on_holidays || _(@scheduleEvents()).any (schedule) ->
        schedule.occursOn(day) && schedule.overridesHoliday()

    hasSecondaryDayTypeOn: (day) ->
      _(@scheduleEvents()).any (schedule) ->
        schedule.occursOn(day) && schedule.isRestDay()

    shiftsOn: (day) ->
      schedules = _(@scheduleEvents()).filter (schedule) ->
        schedule.occursOn(day) && schedule.isShift()
      new EmployeeScheduleDayList(day, this, schedules)

    overriddenShiftsOn: (day) ->
      schedules = _(@scheduleEvents()).filter (schedule) ->
        schedule.isRecurringSchedule() && schedule.isShift() && schedule.isOverriddenOn(day)
      new EmployeeScheduleDayList(day, this, schedules)

    wholeDayEventsOn: (day) ->
      schedules = _(@scheduleEvents()).filter (schedule) ->
        schedule.occursOn(day) && schedule.isWholeDay()
      new EmployeeScheduleDayList(day, this, schedules)

    allEventsOn: (day) ->
      schedules = _(@scheduleEvents()).filter (schedule) ->
        schedule.occursOn(day) ||
          (schedule.isRecurringSchedule() && schedule.isShift() && schedule.isOverriddenOn(day))
      new EmployeeScheduleDayList(day, this, schedules)
