$(function () {
    'use strict';
    BemsWebApplication.Popup.RegularCheckSchedule = {

        create: function (viewInfo, viewModel, legalCheckOptions, anyCheckOptions) {
            var facilities = ko.observableArray(),
                facilitiesInView = ko.observableArray(),
                businessFields = ko.observableArray(),
                viewModeInPopup = ko.observable(true),
                isEditModeInPopup = ko.observable(false);
            var facilitySearchPopup = null,
                facilityFactory = BWA.Factory.Facility,
                purchaseProgressCode = BWA.Code.PurchaseProgress,
                facilityGridView = ko.observable(),
                facilityDataGridOptions,
                modifiableFacilityDataGridOptions = undefined;

            var facilityDataSource = facilityFactory.getBasicDataSourceRef({

                dbModeIId: 'FmsWorkScheduleToFacility',
                primaryKeyDataField: 'WorkScheduleId'
            });

            function isValidateWithFunction(errorMessage) {
                if (_.isEmpty(facilities())) {
                    errorMessage.message = '점검 계획을 위한 시설이 없습니다.';
                    return false;
                }
                return true;
            }

            function handlePopupShowing(isNewInPopup, dataModel) {
                
                $("#gridContainer2").dxDataGrid({
                    paging: {
                        pageSize: 8,
                        enabled: true
                    }
                });

                $("#gridContainer3").dxDataGrid({
                    paging: {
                        pageSize: 8,
                        enabled: true
                    }
                });
                var userInfo = BWA.UserInfo;
                if (isNewInPopup()) {
                    //if (userInfo.isDependBusinessField(viewInfo.viewName)) {
                    //    BWA.db.CmBusinessField.byKey({
                    //        SiteId: userInfo.SiteId(),
                    //        BusinessFieldId: userInfo.BusinessFieldId()
                    //    }).done(function(businessField) {
                    //        dataModel.BusinessFieldName(businessField.Name);
                    //    });
                    //}

                    dataModel.UpdateUserId(userInfo.UserId());
                    dataModel.UpdateUserName(userInfo.Name());
                    dataModel.BusinessFieldId(userInfo.BusinessFieldId());
                    dataModel.BusinessFieldName(userInfo.BusinessFieldName());
                    //dataModel.WorkDueDate(BWA.DataUtil.getDateFromDateTime(moment().add(1,'d')));
                    dataModel.WorkDueDate(BWA.DataUtil.getDateFromDateTime(moment()));
                }
            }

            // 점검계획 정보가 저장된 후에 호출 된다. 
            // 등록이면 responseKey가 있고, 수정이면 없다.
            function handleAfterSave(responseKey) {
                var array = facilities();
                // JD : Facility 가 없는 경우도 있음 
                //if (_.isEmpty(array)) {
                //    return;
                //}

                var siteId, workScheduleId;//, businessFieldId;
                if (_.isUndefined(responseKey)) {
                    var dataModel = viewModel.dataModel;
                    siteId = dataModel.SiteId();
                    //businessFieldId = dataModel.BusinessFieldId();
                    workScheduleId = dataModel.WorkScheduleId();
                }
                else {
                    siteId = responseKey.SiteId;
                    //businessFieldId = responseKey.BusinessFieldId;
                    workScheduleId = responseKey.WorkScheduleId;
                }

                var postData;
                var parameters = {
                    SiteId: siteId,
                    //BusinessFieldId: businessFieldId,
                    WorkScheduleId: workScheduleId
                };

                postData = _.map(array, function (f) {
                    return {
                        SiteId: siteId,
                        //BusinessFieldId: businessFieldId,
                        WorkScheduleId: workScheduleId,
                        FacilityCode: f.FacilityCode()
                    };
                });
                BWA.api.post('FmsWorkScheduleToFacility/Insert', postData, parameters);
            }

            function handleAfterLoadingModelByKey(data, dataViewModel) {
                var eq = BWA.DataUtil.constructEqualFilter;
                var and = BWA.DataUtil.andFilter;

                facilityDataSource.filter([
                    eq('SiteId', dataViewModel.SiteId()),
                    and,
                    //eq('BusinessFieldId', dataViewModel.BusinessFieldId()),
                    //and,
                    eq('WorkScheduleId', dataViewModel.WorkScheduleId())
                ]);

                facilityDataSource.load().done(function (dbFacilities) {
                    facilitiesInView(dbFacilities);
                });
            }

            function handleBeforeShowingPopupForEdit(rowData, dataViewModel) {

                dataViewModel.CycleUnitName(rowData['FmsWorkCodeCycleUnit/Name']());
                dataViewModel.HolidayWorkTypeName(rowData['FmsWorkCodeHolidayWorkType/Name']());
                dataViewModel.BusinessFieldName(rowData['CmBusinessField/Name']());
                dataViewModel.UpdateUserName(rowData['CmUser/Name']());

                if (!_.isUndefined(legalCheckOptions)) {

                    if (_.isUndefined(rowData['CmPartner/Name']))
                        //viewModel.dataModel.InspectionAgencyName("");
                        viewModel.dataModel.InspectionAgencyName(null);
                    else
                        viewModel.dataModel.InspectionAgencyName(rowData['CmPartner/Name']());
                }
                if (!_.isUndefined(anyCheckOptions)) {

                    if (_.isUndefined(rowData['CmPartner/Name']))
                        //viewModel.dataModel.InspectionAgencyName("");
                        viewModel.dataModel.InspectionAgencyName(null);
                    else
                        viewModel.dataModel.InspectionAgencyName(rowData['CmPartner/Name']());
                }
            }

            //viewModel.popupVisible.subscribe(function(visible) {
            //    if (!visible) {
            //        facilitiesInView([]);
            //    }
            //});

            viewModel.isEditModeInPopup.subscribe(function (isEditMode) { //추가
                if (isEditMode) {
                    facilities(facilitiesInView.slice(0));
                }
            });

            if (!_.isUndefined(legalCheckOptions)) {
                viewModel.dataModel.InspectionAgencyName = ko.observable();
            }
            if (!_.isUndefined(anyCheckOptions)) {
                viewModel.dataModel.InspectionAgencyName = ko.observable();
            }

            viewModel.dataModel.CycleUnitName = ko.observable();
            viewModel.dataModel.HolidayWorkTypeName = ko.observable();
            viewModel.dataModel.BusinessFieldName = ko.observable();
            viewModel.dataModel.UpdateUserName = ko.observable();
            facilityDataGridOptions = BWA.Popup.Facility.getReadOnlyDataGridOptions(facilitiesInView, viewModel.viewModeInPopup);
            modifiableFacilityDataGridOptions = BWA.Popup.Facility.getModifiableDataGridOptions(facilities, viewModel.isEditModeInPopup, facilityGridView);

            viewModel.facilitySearchPopup = facilitySearchPopup = BWA.Popup.Facility.create(viewModel, undefined, {

                isMultipleSelect: true,
                onSelectedFacilities: function (selectedFacilities) {

                    var workScheduleId = viewModel.dataModel.WorkScheduleId();

                    _.each(selectedFacilities, function (sf) {

                        // 어차피 SiteId와 BusinessField는 동일 할 수 밖에 없으므로 비교하지 않는다.
                        // JD : 팝업에서 전체선택시 추가로 하면 오류 발생함. 이에 대한 회피 코드로 try-catch
                        // JD : 근본적인 원인은 시간 관계상 차후로 넘김
                        var found = _.some(facilities(), function (f) {
                            try {
                                return f.FacilityCode() === sf.FacilityCode();
                            } catch (e) {
                                return f.FacilityCode() === sf.FacilityCode;
                            }
                        });
                        if (found) return;

                        //facilities.push({
                        //    SiteId: sf.SiteId,
                        //    WorkScheduleId: ko.observable(workScheduleId),
                        //    FacilityCode: sf.FacilityCode,
                        //    Name: sf.Name,
                        //    FirstClassId: sf.FirstClassId,
                        //    SecondClassId: sf.SecondClassId,
                        //    ThirdClassId: sf.ThirdClassId,
                        //});

                        //2019.08.08 수정
                        try {
                            facilities.push({
                                SiteId: ko.observable(sf.SiteId()),
                                WorkScheduleId: ko.observable(workScheduleId),
                                FacilityCode: ko.observable(sf.FacilityCode()),
                                Name: ko.observable(sf.Name()),
                                FirstClassId: ko.observable(sf.FirstClassId()),
                                SecondClassId: ko.observable(sf.SecondClassId()),
                                ThirdClassId: ko.observable(sf.ThirdClassId()),
                            });
                        } catch (e) {
                            facilities.push({
                                SiteId: ko.observable(sf.SiteId),
                                WorkScheduleId: ko.observable(workScheduleId),
                                FacilityCode: ko.observable(sf.FacilityCode),
                                Name: ko.observable(sf.Name),
                                FirstClassId: ko.observable(sf.FirstClassId),
                                SecondClassId: ko.observable(sf.SecondClassId),
                                ThirdClassId: ko.observable(sf.ThirdClassId),
                            });
                        }
                    });
                    facilityGridView().refresh();
                }
            });

            return {
                facilities: facilities,
                facilitiesInView: facilitiesInView,
                facilitySearchPopup: facilitySearchPopup,
                businessFields: businessFields,
                isValidateWithFunction: isValidateWithFunction,

                facilityDataGridOptions: facilityDataGridOptions,
                modifiableFacilityDataGridOptions: modifiableFacilityDataGridOptions,

                handleAfterLoadingModelByKey: handleAfterLoadingModelByKey,
                handleAfterSave: handleAfterSave,
                handlePopupShowing: handlePopupShowing,
                handleBeforeShowingPopupForEdit: handleBeforeShowingPopupForEdit,
                handleDeleteSelectedFacilities: BWA.Popup.Facility.getDeleteSelectedFacilitiesFunc(facilityGridView, facilities),
                viewModeInPopup: viewModeInPopup,
                isEditModeInPopup: isEditModeInPopup
            };
        }
    }
});