$(function () {
    'use strict';
    var materialClassForSearch = ko.observableArray();
    var MaterialCodeClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass');
    var UserGroupDataSource = BemsWebApplication.db.createDataSource('CmUserGroupPermission');
    var first = true;
    var defaultSearchClassArray = $SearchView.createDefaultArray('MaterialClassId');
    var searchFacilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()];
    var searchFacilityClassValues = [ko.observable(), ko.observable(), ko.observable()];
    var facilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()];

    BWA.Popup.Material = BWA.Popup.Material || {};
    BWA.Popup.Material.create = function (viewModel, options) {

        options = options || {};
        options.datagridId = options.datagridId || 'materialDataGridForSearch';
        var onSelectedMaterials = options.onSelectedMaterials, isMultipleSelect = options.isMultipleSelect;

        //var dataViewModel = new BemsWebApplication.FmsMaterialViewModel(),
        var dataViewModel = new BemsWebApplication.FmsMaterialExViewModel(),
            initialized = false,
            gridView,
            popupVisible = ko.observable(false),
            materialFactory = BemsWebApplication.Factory.Material;
        //var dataSource = BWA.DataUtil.createDataSource({ dataSourceOptions: materialFactory.getDataSourceForDataGrid() }, 'FmsMaterial');
        var MenuPermission;
        var dataSource = BWA.DataUtil.createDataSource({
            dataSourceOptions: {
                store: BemsWebApplication.odata.FmsMaterialEx,
                select: [
                    'SiteId',
                    'BusinessFieldId',
                    'MaterialId',
                    'MaterialCode',
                    'Name',
                    'FirstClassId',
                    'SecondClassId',
                    'ThirdClassId',
                    'LocationId',
                    'MaterialTypeId',
                    'TradeCompanyId',
                    'WarehouseId',
                    'Rfid',
                    'Unit',
                    'DurableYears',
                    'ReasonableStockCount',
                    'Manufacturer',
                    'Standard',
                    'FinalPrice',
                    'ImageFileId',
                    'Note',
                    'IsDiscontinued',
                    'IsUse',
                    'FinalStockCount',
                    'FinalTotalStockAmount',
                    'StockCount',
                    'StockAmount',
                ],
            },
        });
        var materialClass = ko.observableArray();
        var eq = BWA.DataUtil.constructEqualFilter, and = BWA.DataUtil.andFilter;
        var userInfo = BWA.UserInfo;

        //자재 검색시 나타나는 팝업은 공통 및 자신이 포함된 비즈니스 영역만 해당됨      
        for (var i = 0; i < BWA.UserInfo.MenuPermissions().length; i++) {
            if (BWA.UserInfo.MenuPermissions()[i].MenuId == 'PurchaseRequest') {
                MenuPermission = BWA.UserInfo.MenuPermissions()[i].MenuPermission;
                break;
            }
        }
        if (MenuPermission >= 4) {
            dataSource.filter([
                eq('SiteId', userInfo.SiteId()),
                and,
                [
                    eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()),
                    'or',
                    eq('BusinessFieldId', 1)
                ]
            ]);
        }
        else {
            dataSource.filter([
                eq('SiteId', userInfo.SiteId())
            ]);
        }

        var dataGridOptions = utils.datagrid.defaultOptions({

            dxDataSource: dataSource,
            selectedSourceItem: dataViewModel,
            //datagridId: options.datagridId,
            //dbId: 'FmsMaterialEx',
            handleDataGridRowClick: function () {

            },
            //columns: materialFactory.getColumns([
            //    //{ dataField: 'ClassName', width: '25%' },
            //    { dataField: 'MaterialCode', width: '30%' },
            //    { dataField: 'Name', width: '55%' },
            //    //{ dataField: 'StockCount', width: '15%' , caption: '재고수량', alignment: 'center'}
            //]),
            columns: [
               //{ dataField: 'ClassName', width: '25%' },
               { dataField: 'MaterialCode', width: '30%', caption: '자재코드', alignment: 'center', visible: false },
               {
                   dataField: 'FirstClassId', width: '19%', 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: '19%', 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: '19%', caption: '자재(소)', alignment: 'center',
                   customizeText: function (cellInfo) {
                       if (cellInfo.value == null) {
                           return;
                       }
                       else {
                           for (var i = 1; i < materialClassForSearch().length; i++) {
                               if (materialClassForSearch()[i].MaterialClassId() == cellInfo.value) {
                                   return materialClassForSearch()[i].Name();
                               }
                           }
                       }
                   }
               },
               { dataField: 'Name', width: '35%', caption: '자재명', alignment: 'center' },
               { dataField: 'Standard', width: '35%', caption: '규격', alignment: 'center' },
               { dataField: 'Unit', width: '15%', caption: '단위', alignment: 'center' },
               { dataField: 'StockCount', width: '15%', caption: '재고수량', alignment: 'center', format: 'currency' }
            ],
            paging: {
                pageSize: 15,
                enabled: false
            },
            wordWrapEnabled: true,
            cellPrepared: BemsWebApplication.Factory.Material.cellPrepared
        });

        if (isMultipleSelect) {

            dataGridOptions.selection = { mode: 'multiple', allowSelectAll: true };
            dataGridOptions.handleDataGridRowClick = function () { };
        }
        else {

            dataGridOptions.handleDataGridRowClick = function (id, dataGrid, clickRow) {

                var data = clickRow.data;

                if (!_.isUndefined(onSelectedMaterials)) {

                    onSelectedMaterials([BWA.DataUtil.convertViewModelToJS(data)]);
                    //{
                    //    SiteId: data.SiteId(),
                    //    BusinessFieldId: data.BusinessFieldId(),
                    //    MaterialId: data.MaterialId(),
                    //    MaterialCode: data.MaterialCode(),
                    //    FinalPrice: data.FinalPrice(),
                    //    TradeCompanyId: _.isUndefined(data.TradeCompanyId) ? undefined : data.TradeCompanyId(),
                    //    'FmsMaterialTradeCompany/Name': data['FmsMaterialTradeCompany/Name'],
                    //    Name: data.Name()
                    //}]);
                }

                // TODO : 어기서 데이터가 전체선택시와 단일선택시 어찌 바뀌는가...
                popupVisible(false);
            }
        }
        function handlePopupShowing() {
            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]);
                    if (Result[i].Depth() == 0) {
                        if (cnt == 0) {
                            searchFacilityClasses[0](defaultSearchClassArray.slice(0).concat(Result[i]));
                            cnt++;
                        }
                        else {
                            searchFacilityClasses[0].push(Result[i]);
                        }
                    }
                }
                facilityClasses[0](Result[0]);
                materialClassForSearch($SearchView.createArrayOfSelectBox('MaterialClassId', materialClass()));
            });
        }

        function handlePopupShown() {
            if (initialized === false) {
                gridView = $('#materialDataGridForSearch').dxDataGrid('instance');
                $("#materialDataGridForSearch").dxDataGrid({
                    paging: {
                        pageSize: 14,
                        enabled: false
                    }
                });
                initialized = true;
            }

            gridView.clearSelection();
            gridView.refresh();
            searchView.show();
        }

        function handlePopupButtonSelect() {

            var array = utils.datagrid.getSelectedRowsData(options.datagridId);

            if (!_.isUndefined(onSelectedMaterials)) {
                onSelectedMaterials(array);
            }
            popupVisible(false);
        }
        viewModel.handleSelectBoxChangeFirstClass = function (e) {
            BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', e.value, facilityClasses[1]);
            viewModel.dataModel.SecondClassId(null);
            viewModel.dataModel.ThirdClassId(null);
        };

        viewModel.handleSelectBoxChangeSecondClass = function (e) {

            BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', e.value, facilityClasses[2]);
            viewModel.dataModel.ThirdClassId(null);
        };
        var handleFirstClassChangedValueInSearchView = function (e) {
            if (first == true && e.value == null) {
                e.value = 0;
                first = false;
                searchFacilityClassValues[0](0);
            }
            if (e.value === 0) {
                initializeSearchClasses();
                return;
            }
            BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', e.value, searchFacilityClasses[1], defaultSearchClassArray);
        };
        var handleSecondClassChangedValueInSearchView = function (e) {
            if (e.value === 0) {
                initializeSearchClasses(true);
                return;
            }
            BWA.DataUtil.setArrayDataSourceFilter(MaterialCodeClassDataSource, 'ParentMaterialClassId', e.value, searchFacilityClasses[2], defaultSearchClassArray);
        };

        function initializeSearchClasses(onlyThird) {
            if (onlyThird === undefined || onlyThird === false) {
                searchFacilityClasses[1](defaultSearchClassArray.slice(0));
                searchFacilityClassValues[1](0);
            }
            searchFacilityClasses[2](defaultSearchClassArray.slice(0));
            searchFacilityClassValues[2](0);
        }
        function handlePopupButtonClose() {

            popupVisible(false);
        }

        var toolbarItems = [
            { location: 'before', text: '자재 선택' },
            { location: 'after', widget: 'button', options: { text: $G('select'), icon: 'save', visible: isMultipleSelect, clickAction: handlePopupButtonSelect } },
            { location: 'after', widget: 'button', options: { text: $G('close'), icon: 'close', clickAction: handlePopupButtonClose } }
        ];

        var popupOptions = {
            width: '850px',
            height: '600px',
            visible: popupVisible,
            closeOnOutsideClick: true,
            showingAction: handlePopupShowing,
            shownAction: handlePopupShown,
            animation: window.utils.popup.createAnimation()
        };

        var searchView = BWA.Popup.SearchView.create({

            parentPopupId: 'popupSearchMaterial',
            parentPopupVisible: popupVisible,
            searchItems: [
                { id: 'MaterialCode' },
                { id: 'Name' },//
                { id: 'Standard' },
                { id: 'FirstClassId', ignoreValue: 0, defaultValue: 0, value: searchFacilityClassValues[0], dataSource: searchFacilityClasses[0], handleChangedValue: handleFirstClassChangedValueInSearchView },
                { id: 'SecondClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: searchFacilityClassValues[1], dataSource: searchFacilityClasses[1], handleChangedValue: handleSecondClassChangedValueInSearchView },
                { id: 'ThirdClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: searchFacilityClassValues[2], dataSource: searchFacilityClasses[2] },
            ],

            handleInitializeUpdate: function () {
            },

            handleSearch: function (filter, searchItems) {
                if (MenuPermission >= 4) {
                    filter = [
                        eq('SiteId', userInfo.SiteId()),
                        and,
                        [
                            eq('BusinessFieldId', BWA.UserInfo.BusinessFieldId()),
                            'or',
                            eq('BusinessFieldId', 1)
                        ]
                    ].concat(filter)
                }
                else {
                    filter = [
                        eq('SiteId', userInfo.SiteId())
                    ].concat(filter)
                }
                gridView.filter(filter);
            }
        });
        viewModel.handleSecondClassChangedValueInSearchView = handleSecondClassChangedValueInSearchView;
        viewModel.handleFirstClassChangedValueInSearchView = handleFirstClassChangedValueInSearchView;
        viewModel.facilityClasses = facilityClasses;
        viewModel.searchItems = searchView.searchItems;
        return {
            dataModel: dataViewModel,
            dataSource: dataSource,
            popupOptions: popupOptions,
            toolbarItems: toolbarItems,
            dataGridOptions: dataGridOptions,

            searchView: searchView,

            show: function () {

                popupVisible(true);
            }
        };
    };
});