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

        create: function (viewInfo, viewModel) {

            var facilities = ko.observableArray(),
                facilitiesInView = ko.observableArray(),
                businessFields = ko.observableArray();

            var facilitySearchPopup = null,
                facilityFactory = BWA.Factory.Facility,
                facilityGridView = ko.observable(undefined),
                facilityDataGridOptions,
                modifiableFacilityDataGridOptions = undefined;

            var facilityDataSource = facilityFactory.getBasicDataSourceRef({
                dbModeIId: 'FmsWorkOrderToFacility',
                primaryKeyDataField: 'WorkRequestId'
            })
            ;

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

            function handleBeforePopupShowingPromise(isNewInPopup, dataViewModel, clickRowData) {

                var workProgressId;
                if (isNewInPopup()) {
                    workProgressId = $Code.WorkProgress.WORK_PLAN;
                }
                else {
                    workProgressId = clickRowData['FmsWorkRequest/WorkProgressId'](); // clickRowData.WorkProgressId();
                    dataViewModel.WorkProgressId = ko.observable();
                    dataViewModel.WorkProgressId(workProgressId);
                }
            }

            function handlePopupShowing(isNewInPopup, dataModel, selectedData) {

                

                //var userInfo = BWA.UserInfo;

                //if (isNewInPopup()) {

                //    dataModel.BusinessFieldName(userInfo.BusinessFieldName());
                //    dataModel.BusinessFieldId(userInfo.BusinessFieldId());

                //    dataModel.RequestUserName(userInfo.Name());
                //    dataModel.RequestUserId(userInfo.UserId());

                //    dataModel.WorkTypeId(workTypeId);

                //    BWA.db.FmsWorkCodeType.byKey(BWA.DataUtil.pickKeys(dataModel, 'FmsWorkRequest/FmsWorkCodeType')).done(function (workType) {

                //        dataModel.WorkTypeName(workType.Name);
                //    });
                //    var now = moment();
                //    dataModel.RequestDate(now.toDate());
                //    dataModel.StartWorkDate(BWA.DataUtil.getDateFromDateTime(now));

                //    dataModel.WorkProgressId($Code.WorkProgress.WORK_PLAN);
                //    BWA.db.FmsWorkCodeProgress.byKey(BWA.DataUtil.pickKeys(dataModel, 'FmsWorkRequest/FmsWorkCodeProgress')).done(function (workProgress) {

                //        dataModel.WorkProgressName(workProgress.Name);
                //    });
                //}
            }

            function handlePopupShown(isEditMode, isNew, dataViewModel) {

            }

            // 점검계획 정보가 저장된 후에 호출 된다. 
            // 등록이면 responseKey가 있고, 수정이면 없다.
            function handleAfterSave(responseKey) {

                var array = facilities();
                if (_.isEmpty(array)) {
                    return;
                }
                var siteId,
                    workRequestId;//, businessFieldId;

                if (_.isUndefined(responseKey)) {

                    var dataModel = viewModel.dataModel;
                    siteId = dataModel.SiteId();
                    //businessFieldId = dataModel.BusinessFieldId();
                    workRequestId = dataModel.WorkRequestId();
                }
                else {

                    siteId = responseKey.SiteId;
                    //businessFieldId = responseKey.BusinessFieldId;
                    workRequestId = responseKey.WorkRequestId;
                }

                var postData;
                var parameters = {
                    SiteId: siteId,
                    //BusinessFieldId: businessFieldId,
                    WorkRequestId: workRequestId
                };

                postData = _.map(array, function (f) {

                    return {
                        SiteId: siteId,
                        //BusinessFieldId: businessFieldId,
                        WorkRequestId: workRequestId,
                        FacilityCode: f.FacilityCode()
                    };
                });

                BWA.api.post('FmsWorkOrderToFacility', postData, parameters);
            }

            function handleAfterLoadingModelByKey(data, dataViewModel, isNewInPopup) {

                // 작업목록은 삭제 할 수 없음 
                viewModel.visibleDeleteButton(false);

                // 작업계획에서 사용하는 코드 임
                //if (dataViewModel.WorkProgressId() >= $Code.WorkProgress.WORK_PLAN) {
                //    viewModel.visibleEditButton(false);
                //    viewModel.visibleDeleteButton(false);
                //}

                var eq = BWA.DataUtil.constructEqualFilter;
                var and = BWA.DataUtil.andFilter;

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

                facilityDataSource.load().done(function (dbFacilities) {

                    facilitiesInView(dbFacilities);
                });
            }

            function handleBeforeShowingPopupForEdit(rowData, dataViewModel) {

                dataViewModel.BusinessFieldName(rowData['CmBusinessField/Name']());
                dataViewModel.WorkTypeName(rowData['FmsWorkRequest/FmsWorkCodeType/Name']());
                dataViewModel.RequestUserName(rowData['CmUser/Name']());
                dataViewModel.WorkProgressName(rowData['FmsWorkRequest/FmsWorkCodeProgress/Name']());

                dataViewModel.RejectUserName($KoValue(rowData['CmUser1/Name']));

            }


            viewModel.popupVisible.subscribe(function (visible) {

                if (!visible) {
                    facilitiesInView([]);
                }
            });

            viewModel.isEditModeInPopup.subscribe(function (isEditMode) {

                if (isEditMode) {
                    facilities(facilitiesInView.slice(0));
                }
            });

            viewModel.dataModel.WorkTypeName = ko.observable();
            viewModel.dataModel.BusinessFieldName = ko.observable();
            viewModel.dataModel.RequestUserName = ko.observable();
            viewModel.dataModel.RejectUserName = ko.observable();
            viewModel.dataModel.WorkProgressName = 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 workRequestId = viewModel.dataModel.WorkRequestId();

                    _.each(selectedFacilities, function (sf) {

                        // 어차피 SiteId와 BusinessField는 동일 할 수 밖에 없으므로 비교하지 않는다.
                        var found = _.some(facilities(), function (f) {
                            return f.FacilityCode() === sf.FacilityCode();
                        });
                        if (found) return;

                        facilities.push({

                            SiteId: sf.SiteId,
                            WorkRequestId: ko.observable(workRequestId),
                            FacilityCode: sf.FacilityCode,
                            Name: sf.Name,
                        });
                    });

                    facilityGridView().refresh();
                }
            });

            return {
                facilitySearchPopup: facilitySearchPopup,

                facilities: facilitiesInView,
                businessFields: businessFields,
                isValidateWithFunction: isValidateWithFunction,

                facilityDataGridOptions: facilityDataGridOptions,
                modifiableFacilityDataGridOptions: modifiableFacilityDataGridOptions,

                handleAfterLoadingModelByKey: handleAfterLoadingModelByKey,
                handleAfterSave: handleAfterSave,

                handlePopupShowing: handlePopupShowing,
                handlePopupShown: handlePopupShown,

                handleBeforeShowingPopupForEdit: handleBeforeShowingPopupForEdit,
                handleDeleteSelectedFacilities: BWA.Popup.Facility.getDeleteSelectedFacilitiesFunc(facilityGridView, facilities),
                handleBeforePopupShowingPromise: handleBeforePopupShowingPromise
            };
        }
    }
});