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

        create: function (viewInfo, viewModel, executionPlanOptions) {

            var isInnerCheckWorkType = ko.observable(false);

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

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

            var workResultCheckItems = ko.observableArray();
            var workResultCheckItemDataSource = BemsWebApplication.db.createDataSource('FmsWorkResultCheckItem', true, true, false, true);

            if (executionPlanOptions == null) {
                isVisibleEditWorkOrderButton = ko.observable();
                isVisibleButtons = ko.observable();
            }
            else {
                isVisibleEditWorkOrderButton = executionPlanOptions ? executionPlanOptions.isVisibleEditWorkOrderButton : undefined;
                isVisibleButtons = executionPlanOptions ? executionPlanOptions.isVisibleButtons : undefined;
            }

            var facilitySearchPopup = null,
                facilityFactory = BWA.Factory.Facility,

                facilityGridView = ko.observable(undefined),
                facilityDataGridOptions,
                modifiableFacilityDataGridOptions = undefined,
                isWorkOrder = ko.observable(false),
                isReject = ko.observable(false);

            var workTypeId = null; //= $Code.WorkType.CIVIL_COMPLAINT;
            var facilityDataSource = facilityFactory.getBasicDataSourceRef({
                dbModeIId: 'FmsWorkRequestToFacility',
                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.WorkProgressId();
                }

                isVisibleEditWorkOrderButton(workProgressId === $Code.WorkProgress.WORK_STANDBY);

                if (isNewInPopup()) {
                    isVisibleButtons(false);
                }
                else {
                    isVisibleButtons(workProgressId === $Code.WorkProgress.WORK_PLAN);
                }

                isWorkOrder(workProgressId >= $Code.WorkProgress.WORK_STANDBY);
                isReject(workProgressId === $Code.WorkProgress.WORK_POSTPONE);
            }

            function handlePopupShowing(isNewInPopup, dataModel, selectedData) {

                viewModel.visibleEditButton(false);
                viewModel.visibleDeleteButton(false);

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

                $("#gridContainer3").dxDataGrid({
                    paging: {
                        pageSize: 8,
                        enabled: true
                    }
                });

                var userInfo = BWA.UserInfo;

                if (isNewInPopup()) {
                    workTypeId = $Code.WorkType.INNER_CHECK;
                    //if (isInnerCheckWorkType()) {
                    //    workTypeId = $Code.WorkType.INNER_CHECK;
                    //}
                    //else {
                    //    //workTypeId = $Code.WorkType.CIVIL_COMPLAINT;
                    //    workTypeId = $Code.WorkType.any
                    //}
                    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, '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, '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('FmsWorkRequestToFacility/Insert', postData, parameters);
            }

            function handleAfterLoadingModelByKey(data, dataViewModel, isNewInPopup) {

                if (dataViewModel.WorkProgressId() >= $Code.WorkProgress.WORK_PLAN) {

                    if (dataViewModel.WorkTypeId() == $Code.WorkType.INNER_CHECK) {
                        // WorkType 이 내부점검인 경우 수정/삭제할 수 있어야 함
                        viewModel.visibleEditButton(true);
                        viewModel.visibleDeleteButton(true);
                    }
                    else {
                        viewModel.visibleEditButton(false);
                        viewModel.visibleDeleteButton(false);
                    }
                }



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

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

                    facilitiesInView(dbFacilities);
                });

                if (!isNewInPopup()) {
                    workResultCheckItemDataSource.filter([
                        eq('SiteId', dataViewModel.SiteId()),
                        and,
                        eq('WorkRequestId', dataViewModel.WorkRequestId())
                    ]);

                    workResultCheckItemDataSource.load().done(function (dbWorkCheckItems) {
                        workResultCheckItems(dbWorkCheckItems);
                    });

                    viewModel.dataModel.selectedItemCheckDate("");
                    viewModel.dataModel.selectedItemTextResult("");
                    viewModel.dataModel.selectedItemCheckItemId(0);
                }
            }

            function handleBeforeShowingPopupForEdit(rowData, dataViewModel) {

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

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

            }


            viewModel.popupVisible.subscribe(function (visible) {

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

            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();

            viewModel.dataModel.selectedItemCheckDate = ko.observable();
            viewModel.dataModel.selectedItemTextResult = ko.observable();
            viewModel.dataModel.selectedItemCheckItemId = ko.observable();
            viewModel.workResultCheckItems = workResultCheckItems;
            viewModel.refreshListData = refreshListData;
            viewModel.onItemClick = onItemClick;
            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();
                            try {
                                return f.FacilityCode() === sf.FacilityCode();
                            } catch (e) {
                                return f.FacilityCode() === sf.FacilityCode;
                            }
                        });
                        if (found) return;

                        //facilities.push({
                        //    SiteId: sf.SiteId,
                        //    WorkRequestId: ko.observable(workRequestId),
                        //    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()),
                                WorkRequestId: ko.observable(workRequestId),
                                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),
                                WorkRequestId: ko.observable(workRequestId),
                                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();
                }
            });


            function refreshListData() {
                //workResultCheckItemDataSource.filter([
                //   eq('SiteId', dataViewModel.SiteId()),
                //   and,
                //   eq('WorkRequestId', dataViewModel.WorkRequestId())
                //]);

                //workResultCheckItemDataSource.load().done(function (dbWorkCheckItems) {
                //    workResultCheckItems(dbWorkCheckItems);
                //});

                //viewModel.dataModel.selectedItemCheckDate("");
                //viewModel.dataModel.selectedItemTextResult("");
                //viewModel.dataModel.selectedItemCheckItemId(0);
            }

            function onItemClick(e) {
                viewModel.dataModel.selectedItemCheckDate(e.itemData.CheckDate());
                viewModel.dataModel.selectedItemTextResult(e.itemData.TextResult());
                viewModel.dataModel.selectedItemCheckItemId(e.itemData.CheckItemId());

                if (viewModel.workResultCheckItemMaterialPopup === undefined) {
                    return;
                }

                viewModel.workResultCheckItemMaterialPopup.materials2([]);

                viewModel.workResultCheckItemMaterialPopup.materials2DataSource.filter([
                    eq('SiteId', viewModel.dataModel.SiteId()),
                    and,
                    eq('WorkRequestId', viewModel.dataModel.WorkRequestId()),
                    and,
                    eq('CheckItemId', e.itemData.CheckItemId())
                ]);

                viewModel.workResultCheckItemMaterialPopup.materials2DataSource.load().done(function (dbMaterials) {

                    _.each(dbMaterials, function (sm) {

                        viewModel.workResultCheckItemMaterialPopup.materials2.push({
                            SiteId: sm.SiteId,
                            //PurchaseRequestId: ko.observable(purchaseRequestId),
                            MaterialId: sm.MaterialId,
                            Name: sm.Name,
                            MaterialCode: sm.MaterialCode,
                            MaterialCount: sm.MaterialCount
                            //FinalPrice: sm.FinalPrice,
                        });
                    });
                });

            }

            return {
                workResultCheckItems: workResultCheckItems,
                refreshListData: refreshListData,
                isInnerCheckWorkType: isInnerCheckWorkType,
                facilitySearchPopup: facilitySearchPopup,

                facilities: facilitiesInView,
                businessFields: businessFields,
                isReject: isReject,
                isWorkOrder: isWorkOrder,
                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
            };
        }
    }
});