$(function () {
    'use strict';
    window.utils = window.utils || {};
    $.extend(window.utils, {
        holiday: {
            createHolidayManager: function () {
                var holidayDataSource = BemsWebApplication.db.createDataSource('CmHoliday', true, true);
                var holidayCustomDataSource = BemsWebApplication.db.createDataSource('CmHolidayCustom', true);
                var holidayWeekendDataSource = BemsWebApplication.db.createDataSource('CmHolidayWeekend', true);
                var holidaySources, holidayCustomSources, weekend;
                var isSaturday = false,
                    isSunday = false;

                var cc = new CalendarConverter;
                var holidays = [];
                var isLoaded = false;
                var currentYear = 0;

                return {
                    loadHolidays: function () {

                        var deferred = new $.Deferred();
                        $.when(holidayDataSource.load(), holidayCustomDataSource.load(), holidayWeekendDataSource.load())
                            .done(function (result1, result2, result3) {

                                holidaySources = result1[0];
                                holidayCustomSources = result2[0];
                                weekend = result3[0];
                                if (weekend.length > 0) {
                                    isSaturday = weekend[0].Saturday();
                                    isSunday = weekend[0].Sunday();
                                }
                                isLoaded = true;
                                deferred.resolve();
                            })
                            .fail(function () {
                                deferred.reject();
                            });
                        return deferred.promise();
                    },
                    isLoaded: function () { return isLoaded; },
                    generateHolidays: function (momentDate) {
                        var year, month, day, solar;

                        var self = this;
                        if (currentYear !== momentDate.year()) {
                            holidays = [];
                            $.each(holidaySources, function (i, item) {
                                year = momentDate.year();
                                month = item.HolidayMonth() - 1;
                                day = item.HolidayDay();
                                if (item.IsLunar()) {
                                    solar = cc.lunar2solar(new Date(year - 1, month, day));
                                    if (solar.sYear !== year) {
                                        solar = cc.lunar2solar(new Date(year, month, day));
                                    }
                                    year = solar.sYear;
                                    month = solar.sMonth - 1;
                                    day = solar.sDay;
                                }
                                holidays.push($G.date(moment([year, month, day])));
                            });
                            $.each(holidayCustomSources, function (i, item) {
                                var itemDate = item.HolidayDate();
                                holidays.push($G.date(moment([itemDate.getFullYear(), itemDate.getMonth(), itemDate.getDate()])));
                            });
                            currentYear = momentDate.year();
                        }

                        var weekends = self.getWeekendHolidayArray(momentDate, isSaturday, isSunday);
                        return holidays.concat(weekends);
                    },
                    getWeekendHolidayArray: function (momentDate, isSaturday, isSunday) {
                        var month = momentDate.clone().startOf('month');
                        var sunday = month.clone(),
                            saturday = month.clone();

                        var weekends = [];
                        if (month.day() !== 0) {
                            sunday.day(-7);
                        }
                        if (month.day() !== 6) {
                            saturday.day(-1);
                        }
                        for (var i = 0 ; i < 7 ; i++) {
                            if (isSunday) {
                                weekends.push($G.date(moment([sunday.year(), sunday.month(), sunday.date()])));
                                sunday.day(7);
                            }
                            if (isSaturday) {
                                weekends.push($G.date(moment([saturday.year(), saturday.month(), saturday.date()])));
                                saturday.day(13);
                            }
                        }
                        return weekends;
                    },

                };
            },
            getWeekendHolidays: function (momentDate, isSaturday, isSunday) {
                var month = momentDate.clone().startOf('month');
                var sunday = month.clone(),
                    saturday = month.clone();

                var weekends = [];
                if (month.day() !== 0) {
                    sunday.day(-7);
                }
                if (month.day() !== 6) {
                    saturday.day(-1);
                }
                for (var i = 0 ; i < 7 ; i++) {
                    if (isSunday) {
                        this.pushHolidayEventInArray(weekends, '주말 휴일', moment([sunday.year(), sunday.month(), sunday.date()]), null, true, 2, false); // 마지막 false 추가 hcLee 2016 01 22
                        sunday.day(7);
                    }
                    if (isSaturday) {
                        this.pushHolidayEventInArray(weekends, '주말 휴일', moment([saturday.year(), saturday.month(), saturday.date()]), null, true, 2, false); // 마지막 false 추가 hcLee 2016 01 22
                        saturday.day(13);
                    }
                }
                return weekends;
            },
            // holidayType : 0: 정기휴일, 1: 특정휴일, 2: 주말휴일
            // hcLee 2016 01 22
            //pushHolidayEventInArray: function( destArray, title, day, isYearlyHoliday, isWeekend, holidayType ) {
            pushHolidayEventInArray: function (destArray, title, day, isYearlyHoliday, isWeekend, holidayType, isLunar) {
                var o = {
                    title: title,
                    holiday: true,
                    start: day,
                    allDay: true,
                    backgroundColor: holidayType === 0 ? 'rgb(0,162,232)' : (holidayType === 1 ? 'rgb(255,201,14)' : 'rgb(237,28,36)'),
                    // hcLee 2016 01 22
                    isLunar: isLunar,
                };
                if (isWeekend) {
                    o.isWeekend = isWeekend;
                }
                else if (isYearlyHoliday) {
                    o.isYearlyHoliday = isYearlyHoliday;
                }
                destArray.push(o);
            },

            pushWorkScheduleEventInArray: function (destArray, item, day, isYearlyHoliday, isWeekend, holidayType) {
                var o = {
                    title: item.Name(),
                    holiday: false,
                    //content: item.Content(),
                    item: item,
                    start: day,
                    allDay: true,
                    backgroundColor: holidayType === 1 ? 'rgb(160,0,255)' : (holidayType === 2 ? 'rgb(34,177,76)' : (holidayType === 5 ? 'rgb(255,183,0)' : 'rgb(204,255,0)'))
                    //backgroundColor: 'rgb(34,177,76)'
                };

                if (isWeekend) {
                    o.isWeekend = isWeekend;
                }
                else if (isYearlyHoliday) {
                    o.isYearlyHoliday = isYearlyHoliday;
                }
                destArray.push(o);
            },

        }
    });
});