$(function () {
    'use strict';

    window.utils = window.utils || {};
    $.extend(window.utils, {
        checkSchedule: {
            createScheduleManager: function () {
                var exceptionDateDataSource = BemsWebApplication.db.createDataSource('FmsFacilityScheduleCheckExceptionDate', true),
                    holidayManager = utils.holiday.createHolidayManager(),
                    loadedExceptionDays = [];

                return {
                    holidayManager: holidayManager,

                    load: function (momentDate, dataModel) {

                        var self = this;
                        var deferred = new $.Deferred();
                        loadedExceptionDays = [];
                        $.when(exceptionDateDataSource.load(), holidayManager.loadHolidays(momentDate))
                        .done(function (result) {
                            $.each(result[0], function (i, item) {
                                loadedExceptionDays.push($G.date(moment(item.ExceptionDate())));
                            });
                            if (dataModel === undefined) {
                                deferred.resolve();
                            }
                            else {
                                var events = self.generateScheduleEvents(momentDate, dataModel);
                                deferred.resolve(events);
                            }
                        })
                        .fail(function (error) {
                            deferred.reject(error);
                        });

                        return deferred.promise();
                    },

                    generateScheduleEvents: function (momentDate, dataModel) {
                        var holidays = holidayManager.generateHolidays(momentDate);
                        var events = utils.fullCalendar.generateScheduleEvents(momentDate,
                                                                                dataModel.StartDate(),
                                                                                dataModel.ScheduleId(),
                                                                                dataModel.Name(),
                                                                                dataModel.CycleTypeId(),
                                                                                dataModel.CycleSize(),
                                                                                dataModel.CycleUnitId(),
                                                                                dataModel.HolidayId(),
                                                                                holidays,
                                                                                loadedExceptionDays);

                        return events;
                    },
                };
            }
        }
    });
});