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

        create: function (viewInfo, viewModel, forApprovalOptions) {

            var materials = ko.observableArray();

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

            var materialsDataSource = materialFactory.getBasicDataSourceRef({

                dbModeIId: 'FmsMaterialPurchaseRequestMaterial',
                primaryKeyDataField: 'PurchaseRequestId'
            }),

                materialsForPurchaseOrderDataSource = materialFactory.getBasicDataSourceRef({

                    dbModeIId: 'FmsMaterialPurchaseOrderMaterial',
                    primaryKeyDataField: 'PurchaseOrderId',
                    expand: ['FmsMaterialPurchaseOrder'],
                    moreSelectFields: [
                        'FmsMaterialPurchaseOrder/StoredDueDate',
                        'FmsMaterialPurchaseOrder/OrderDate',
                        'FmsMaterial/TradeCompanyId',
                        'FmsMaterial/FinalPrice'
                    ]
                });

            function handlePopupShowing(isNewInPopup, dataModel) {

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

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

            function handleDeleteSelectedMaterials() {

            }

            function handlePopupShown(editMode, isNew, dataViewModel) {


            }

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

            }

            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;

                materialsDataSource.filter([
                    eq('SiteId', dataViewModel.SiteId()),
                    and,
                    eq('BusinessFieldId', dataViewModel.BusinessFieldId()),
                    and,
                    eq('PurchaseRequestId', dataViewModel.PurchaseRequestId())
                ]);

                materialsForPurchaseOrderDataSource.filter([
                    eq('SiteId', dataViewModel.SiteId()),
                    and,
                    eq('BusinessFieldId', dataViewModel.BusinessFieldId()),
                    and,
                    eq('FmsMaterialPurchaseOrder/PurchaseRequestId', dataViewModel.PurchaseRequestId())
                ]);

                $.when(
                    materialsDataSource.load(),
                    materialsForPurchaseOrderDataSource.load())

                .done(function (dbRequestMaterials, dbOrderMaterials) {

                    dbRequestMaterials = dbRequestMaterials[0];
                    dbOrderMaterials = dbOrderMaterials[0];

                    var materialArray = [];

                    _.each(dbRequestMaterials, function (requestMaterial) {

                        var materialId = requestMaterial.MaterialId();

                        var material = BWA.DataUtil.convertViewModelToJS(requestMaterial);

                        var orderMaterial = BWA.DataUtil.popFromArray(dbOrderMaterials, function (m) {

                            return (m.MaterialId() === materialId);
                        });
                        if (orderMaterial) {

                            material.PurchaseOrderCount = orderMaterial.MaterialCount();
                            material.StoredDueDate = orderMaterial['FmsMaterialPurchaseOrder/StoredDueDate']();
                            material.OrderDate = orderMaterial['FmsMaterialPurchaseOrder/OrderDate']();
                        }

                        materialArray.push(material);
                    });

                    if (_.isEmpty(dbOrderMaterials) === false) {

                        _.each(dbOrderMaterials, function (m) {

                            // 같은 자재에 대해 발주가 여러개라면 더해준다.
                            var dupOrderMaterial = _.find(materialArray, function (mm) {
                                return mm.MaterialId === m.MaterialId();
                            });

                            if (dupOrderMaterial) {

                                dupOrderMaterial.PurchaseOrderCount += m.MaterialCount();
                                return;
                            }
                            var material = BWA.DataUtil.convertViewModelToJS(m);

                            material.PurchaseOrderCount = m.MaterialCount();
                            delete material.MaterialCount;
                            material.StoredDueDate = m['FmsMaterialPurchaseOrder/StoredDueDate']();
                            material.OrderDate = m['FmsMaterialPurchaseOrder/OrderDate']();
                            materialArray.push(material);
                        });
                    }

                    materials(materialArray);
                });
            }

            function handleBeforeShowingPopupForEdit(rowData, dataViewModel) {

                dataViewModel.BusinessFieldName = $KoSet(dataViewModel.BusinessFieldName, rowData['CmBusinessField/Name']);
                dataViewModel.RequesterName = $KoSet(dataViewModel.RequesterName, rowData['CmUser/Name']);
                dataViewModel.ApprovalUserName = $KoSet(dataViewModel.ApprovalUserName, rowData['CmUser1/Name']);
                dataViewModel.PurchaseTypeName = $KoSet(dataViewModel.PurchaseTypeName, rowData['FmsMaterialCodePurchaseType/Name']);
            }

            viewModel.popupVisible.subscribe(function (visible) {

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

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

            var materialColumns = materialFactory.getColumns([
                { dataField: 'MaterialCode', width: '20%' },
                { dataField: 'Name', width: '30%' },
                { dataField: 'Standard', width: '30%', alignment: 'center', caption: '규격' },
                { dataField: 'Unit', width: '15%', alignment: 'center', caption: '단위' }
            ]);

            materialDataGridOptions = utils.datagrid.defaultOptions({

                width: 840,
                visible: viewModel.viewModeInPopup,
                pager: {
                    showPageSizeSelector: false,
                    allowedPageSizes: []
                },
                dataSource: materials,
                columns: materialColumns.concat([
                    { dataField: 'MaterialCount', width: '15%', alignment: 'center', caption: '구매신청수량', format: 'currency' },
                    { dataField: 'PurchaseOrderCount', width: '15%', alignment: 'center', caption: $G('purchaseOrderCount'), format: 'currency' },
                    { dataField: 'StoredDueDate', width: '15%', alignment: 'center', caption: $G('storedDueDate') },
                ]),

                rowPrepared: function (rowElement, rowInfo) {
                    if (rowInfo.rowType == 'data') {
                        var data = rowInfo.data;
                        if (data.MaterialCount !== data.PurchaseOrderCount) {

                            rowElement.css('background-color', 'rgba(255,0,0,0.1)');
                        }
                    }
                }
            });

            return {
                materialDataGridOptions: materialDataGridOptions,
                handleAfterLoadingModelByKey: handleAfterLoadingModelByKey,
                handlePopupShowing: handlePopupShowing,
                handlePopupShown: handlePopupShown,
                handleBeforeShowingPopupForEdit: handleBeforeShowingPopupForEdit,
            };
        }
    }
});