$(function () {
    'use strict';
    var materialClassForSearch = ko.observableArray();
    var materialClass = ko.observableArray();
    var MaterialCodeClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass');
    BemsWebApplication.Popup.PurchaseRequest = {

        create: function (viewInfo, viewModel, forApprovalOptions) {

            var materials = ko.observableArray(),
                materialsInView = ko.observableArray(),
                businessFields = ko.observableArray();

            var materialFactory = BWA.Factory.Material,
                purchaseProgressCode = BWA.Code.PurchaseProgress,
                materialGridView,
                materialDataGridOptions,
                modifiableMaterialDataGridOptions = undefined;

            var materialsDataSource = materialFactory.getBasicDataSourceRef({
                dbModeIId: 'FmsMaterialPurchaseRequestMaterial',
                primaryKeyDataField: 'PurchaseRequestId'
            });

            function isValidateWithFunction(errorMessage) {

                if (_.isEmpty(materials())) {

                    errorMessage.message = '구매요청한 자재가 없습니다.';
                    return false;
                }
                return true;
            }

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

                $("#gridContainer3").dxDataGrid({
                    paging: {
                        pageSize: 10,
                        enabled: true
                    }
                });
                MaterialCodeClassDataSource.filter([
                    ['SiteId', '=', BWA.UserInfo.SiteId()]
                ]);

                $.when(
                    MaterialCodeClassDataSource.load()
                ).done(function (Result) {
                    materialClass = ko.observableArray();
                    var cnt = 0;
                    for (var i = 0; i < Result.length; i++) {
                        materialClass.push(Result[i]);
                    }
                    materialClassForSearch($SearchView.createArrayOfSelectBox('MaterialClassId', materialClass()));
                });
                var userInfo = BWA.UserInfo;
                if (isNewInPopup()) {

                    var progressId = $Code.PurchaseProgress.PURCHASE_REQUEST;

                    if (userInfo.isDependBusinessField(viewInfo.viewName)) {

                        BWA.db.CmBusinessField.byKey({

                            SiteId: userInfo.SiteId(),
                            BusinessFieldId: userInfo.BusinessFieldId()

                        }).done(function (businessField) {

                            dataModel.BusinessFieldName(businessField.Name);
                        });
                    }

                    dataModel.ProgressId(progressId);

                    dataModel.ProgressName(purchaseProgressCode.getName(progressId));

                    dataModel.BusinessFieldId(userInfo.BusinessFieldId());
                    dataModel.RequestUserId(userInfo.UserId());
                    dataModel.RequesterName(userInfo.Name());
                    dataModel.RequestDate(new Date());
                    dataModel.PurchaseHopeDate(moment().add(1, 'd').toDate());
                    dataModel.bSameOrder(false);
                }
            }

            function handleDeleteSelectedMaterials() {

                var rows = materialGridView.getSelectedRowsData();
                if (_.isEmpty(rows)) {

                    utils.toast.show('선택된 자재가 없습니다.', 'error');
                    return;
                }

                _.each(rows, function (row) {

                    var array = materials();
                    var length = array.length;
                    var id = row.MaterialId();
                    for (var i = 0 ; i < length ; i++) {

                        if (id === array[i].MaterialId()) {

                            materials().splice(i, 1);
                            break;
                        }
                    }
                });

                materialGridView.refresh();
            }

            function handlePopupShown(editMode, isNew, dataViewModel) {


            }

            // 구매신청 정보가 저장된 후에 호출 된다. 
            // 등록이면 responseKey가 있고, 수정이면 없다.
            function handleAfterSave(responseKey) {

                var array = materials();
                if (_.isEmpty(array)) {
                    return;
                }
                var siteId, purchaseRequestId, businessFieldId;

                if (_.isUndefined(responseKey)) {

                    var dataModel = viewModel.dataModel;
                    siteId = dataModel.SiteId();
                    businessFieldId = dataModel.BusinessFieldId();
                    purchaseRequestId = dataModel.PurchaseRequestId();
                }
                else {

                    siteId = responseKey.SiteId;
                    // JD Comment : BusinessField 가 키에서 제거되면서 발생된 사항 
                    // businessFieldId = responseKey.BusinessFieldId;
                    businessFieldId = viewModel.dataModel.BusinessFieldId();
                    purchaseRequestId = responseKey.PurchaseRequestId;
                }

                var postData;
                var parameters = {
                    SiteId: siteId,
                    BusinessFieldId: businessFieldId,
                    PurchaseRequestId: purchaseRequestId
                };

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

                    return {
                        SiteId: siteId,
                        BusinessFieldId: businessFieldId,
                        PurchaseRequestId: purchaseRequestId,
                        MaterialId: m.MaterialId(),
                        MaterialCount: m.MaterialCount()
                    };
                });

                BWA.api.post('FmsMaterialPurchaseRequestMaterial', postData, parameters).done(function () {
                    utils.toast.show($G('successDatabaseInsertionMsg'));
                    viewModel.popupVisible(false);
                    viewModel.gridView().refresh();
                });
            }

            function handleAfterLoadingModelByKey(data, dataViewModel) {

                if (dataViewModel.ProgressId() !== $Code.PurchaseProgress.PURCHASE_REQUEST) {

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

                dataViewModel.ProgressName(purchaseProgressCode.getName(dataViewModel.ProgressId()));

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

                var useBusinessFiltering = BWA.UserInfo.isDependBusinessField(viewInfo.viewName)
                if (useBusinessFiltering) {
                    materialsDataSource.filter([
                        eq('SiteId', dataViewModel.SiteId()),
                        and,
                        [
                            eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()),
                            'or',
                            eq('BusinessFieldId', 1)
                        ],
                        and,
                        eq('PurchaseRequestId', dataViewModel.PurchaseRequestId())
                    ]);
                }
                else {
                    materialsDataSource.filter([
                        eq('SiteId', dataViewModel.SiteId()),
                        and,
                        eq('PurchaseRequestId', dataViewModel.PurchaseRequestId())
                    ]);
                }

                materialsDataSource.load().done(function (dbMaterials) {
                    materialsInView(dbMaterials);
                });
            }

            function handleBeforeShowingPopupForEdit(rowData, dataViewModel) {

                dataViewModel.BusinessFieldName(rowData['CmBusinessField/Name']());
                dataViewModel.RequesterName(rowData['CmUser/Name']());
                dataViewModel.PurchaseTypeName(rowData['FmsMaterialCodePurchaseType/Name']());

                dataViewModel.ApprovalUserName = $KoSet(dataViewModel.ApprovalUserName, rowData['CmUser1/Name']);
            }


            viewModel.popupVisible.subscribe(function (visible) {
                if (!visible) {
                    materialsInView([]);
                    // TODO : Sitde-Effects ???
                    materials([]);
                }
            });

            viewModel.isEditModeInPopup.subscribe(function (isEditMode) {
                if (isEditMode) {
                    materials(materialsInView.slice(0));
                }
            });

            viewModel.dataModel.BusinessFieldName = ko.observable();
            viewModel.dataModel.ProgressName = ko.observable();
            viewModel.dataModel.RequesterName = ko.observable();
            viewModel.dataModel.ApprovalUserName = ko.observable();

            viewModel.dataModel.PurchaseTypeName = ko.observable();

            var materialColumns = materialFactory.getColumns([
                {
                    dataField: 'FirstClassId', width: '15%', caption: '자재(대)', alignment: 'center',
                    customizeText: function (cellInfo) {
                        for (var i = 1; i < materialClassForSearch().length; i++) {
                            if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
                                return materialClassForSearch()[i].Name();
                            }
                        }
                    }
                },
                {
                    dataField: 'SecondClassId', width: '15%', caption: '자재(중)', alignment: 'center',
                    customizeText: function (cellInfo) {
                        for (var i = 1; i < materialClassForSearch().length; i++) {
                            if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
                                return materialClassForSearch()[i].Name();
                            }
                        }
                    }
                },
                {
                    dataField: 'ThirdClassId', width: '15%', caption: '자재(소)', alignment: 'center',
                    customizeText: function (cellInfo) {
                        for (var i = 1; i < materialClassForSearch().length; i++) {
                            if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
                                return materialClassForSearch()[i].Name();
                            }
                        }
                    }
                },
                { dataField: 'MaterialCode', width: '30%', visible: false },
                { dataField: 'Name', width: '25%' },
                { dataField: 'Standard', width: '25%', caption: '규격', alignment: 'center' },
                { dataField: 'Unit', width: '15%', caption: '단위', alignment: 'center' },
                //{ dataField: 'UnitCost', width: '25%', caption: '단가', alignment: 'center' }
            ]);

            materialDataGridOptions = utils.datagrid.defaultOptions({

                width: 820,
                visible: viewModel.viewModeInPopup,
                pager: {
                    showPageSizeSelector: false,
                    allowedPageSizes: []
                },
                dataSource: materialsInView,
                columns: materialColumns.concat([{ dataField: 'MaterialCount', width: '15%', alignment: 'center', caption: $G('materialCount'), format: 'currency' }])
            });

            if (_.isObject(forApprovalOptions) === false) {

                modifiableMaterialDataGridOptions = utils.datagrid.defaultOptions({

                    width: 820,
                    pager: {
                        showPageSizeSelector: false,
                        allowedPageSizes: []
                    },

                    visible: viewModel.isEditModeInPopup,
                    dataSource: materials,
                    selection: { mode: 'multiple', allowSelectAll: true },
                    columns: materialColumns.concat([{

                        dataField: 'MaterialCount', width: '20%', type: 'number',
                        caption: $G('materialCount'), alignment: 'center',

                        cellTemplate: utils.datagrid.getNumberBoxDataGridTemplateFunc({
                            min: 1,
                            max: 1000000,
                            dataField: 'MaterialCount',
                            convertValueWhenValueChanged: function (value) {
                                return Math.max(1, value);
                            }
                        })
                    }]),

                    cellClick: function (e) {

                        utils.datagrid.cellClickEventForDataGridTemplate(e, 'MaterialCount');
                    },

                    contentReadyAction: function (e) {
                        materialGridView = e.component;
                    },

                });

                viewModel.materialSearchPopup = BWA.Popup.Material.create(viewModel, {

                    isMultipleSelect: true,
                    onSelectedMaterials: function (selectedMaterials) {

                        var purchaseRequestId = viewModel.dataModel.PurchaseRequestId();

                        _.each(selectedMaterials, function (sm) {

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

                            try {
                                materials.push({
                                    SiteId: ko.observable(sm.SiteId()),
                                    PurchaseRequestId: ko.observable(purchaseRequestId),
                                    MaterialId: ko.observable(sm.MaterialId()),
                                    Name: ko.observable(sm.Name()),
                                    MaterialCode: ko.observable(sm.MaterialCode()),
                                    MaterialCount: ko.observable(1),
                                    FirstClassId: ko.observable(sm.FirstClassId()),
                                    SecondClassId: ko.observable(sm.SecondClassId()),
                                    ThirdClassId: ko.observable(sm.ThirdClassId()),
                                    Standard: ko.observable(sm.Standard()),
                                    Unit: ko.observable(sm.Unit()),
                                });
                            } catch (e) {
                                materials.push({
                                    SiteId: ko.observable(sm.SiteId),
                                    PurchaseRequestId: ko.observable(purchaseRequestId),
                                    MaterialId: ko.observable(sm.MaterialId),
                                    Name: ko.observable(sm.Name),
                                    MaterialCode: ko.observable(sm.MaterialCode),
                                    MaterialCount: ko.observable(1),
                                    FirstClassId: ko.observable(sm.FirstClassId),
                                    SecondClassId: ko.observable(sm.SecondClassId),
                                    ThirdClassId: ko.observable(sm.ThirdClassId),
                                    Standard: ko.observable(sm.Standard),
                                    Unit: ko.observable(sm.Unit),
                                });
                            }

                        });

                        materialGridView.refresh();
                    }

                });
            }
            return {
                materials: materials,
                businessFields: businessFields,

                isValidateWithFunction: isValidateWithFunction,

                materialDataGridOptions: materialDataGridOptions,
                modifiableMaterialDataGridOptions: modifiableMaterialDataGridOptions,

                handleAfterLoadingModelByKey: handleAfterLoadingModelByKey,
                handleAfterSave: handleAfterSave,

                handlePopupShowing: handlePopupShowing,
                handlePopupShown: handlePopupShown,

                handleBeforeShowingPopupForEdit: handleBeforeShowingPopupForEdit,
                handleDeleteSelectedMaterials: handleDeleteSelectedMaterials
            };
        }
    }
});