BemsWebApplication.EquipHistory = function (params, viewInfo) {
    "use strict";

    var codeTypeDataSource = BemsWebApplication.db.createDataSource('FmsEquipmentCodeType', true, false, true),
        codeStateTypeDataSource = BemsWebApplication.db.createDataSource('FmsEquipmentCodeStateType', false, false, true),
        warehouseDataSource = BemsWebApplication.db.createDataSource('FmsMaterialWarehouse', true, false, true);

    var eq = BWA.DataUtil.constructEqualFilter, and = BWA.DataUtil.andFilter;
    var equipmentExDataSource = BWA.DataUtil.createDataSource({
        dataSourceOptions: {
            store: BemsWebApplication.odata.FmsEquipmentEx,
            map: function (item) {
                return new BemsWebApplication.FmsEquipmentExViewModel(item);
            }
        },
        filter: ([
            eq('SiteId', BWA.UserInfo.SiteId())
        ]),
    });

    var codeTypes = ko.observableArray(),
        codeStateTypes = ko.observableArray(),
        warehouses = ko.observableArray(),
        equipmentExs = ko.observableArray();
    var IsAdditionalEquipment = ko.observable(false);

    var codeTypesForSearch = ko.observableArray(),
        codeStateTypesForSearch = ko.observableArray(),
        warehousesForSearch = ko.observableArray();

    var deferredForSearch = new $.Deferred();

    var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'FmsEquipmentHistory', {
        dataSourceOptions: {
            select: [
                'SiteId',
                'EquipmentHistoryId',
                'EquipmentId',
                'TotalStockCount',
                'CurrentStockCount',
                'RentCount',
                'CurrentRentCount',
                'ReturnCount',
                'LossCount',
                'StoredCount',
                'EquipmentRentId',
                'EquipmentStateTypeId',
                'AddDate',
                'UpdateDate',
                'IsReturned',
                'FmsEquipment/FmsEquipmentCodeType/Name',
                'FmsEquipment/FmsEquipmentCodeType/EquipmentTypeId',
                'FmsEquipment/Name',
                'FmsEquipment/CmUser/Name',
                'FmsEquipmentCodeStateType/Name',
                'FmsEquipment/Standard',
                'FmsEquipment/Unit',
                'FmsEquipmentRentInfo/RentUser',
                'FmsEquipmentRentInfo/RentDate',
                'FmsEquipmentRentInfo/ReturnDueDate',
                'FmsEquipmentRentInfo/ReturnFixDate',
                'FmsEquipment/FmsMaterialWarehouse/Name'
            ],
            expand: [
                'FmsEquipmentRentInfo/CmUser1',
                'FmsEquipment/FmsEquipmentCodeType',
                'FmsEquipmentCodeStateType',
                'FmsEquipment/CmUser',
                'FmsEquipmentRentInfo',
                'FmsEquipmentRentInfo/CmUser1',
                'FmsEquipment/FmsMaterialWarehouse',
            ],
            extendOptions: {
                forceOriginalField: true
            }
        },
        columns: [
            { dataField: 'EquipmentHistoryId', caption: $G('number'), width: '10%', alignment: 'center', sortOrder: 'desc' },
            { dataField: 'FmsEquipmentCodeStateType/Name', caption: '구분', width: '8%', alignment: 'center' },
            { dataField: 'FmsEquipment/FmsEquipmentCodeType/Name', caption: '분류', width: '8%', alignment: 'center' },
            { dataField: 'FmsEquipment/Name', caption: '공기구명', width: '22%', alignment: 'center' },
            { dataField: 'FmsEquipment/Standard', caption: '규격', width: '22%', alignment: 'center' },
            { dataField: 'TotalStockCount', caption: '전체수량', width: '10%', alignment: 'center', format: 'fixedPoint' },
            { dataField: 'StoredCount', caption: '입고수량', width: '10%', alignment: 'center', format: 'fixedPoint' },
            { dataField: 'CurrentRentCount', caption: '대여수량', width: '10%', alignment: 'center', format: 'fixedPoint' },
            { dataField: 'ReturnCount', caption: '반납수량', width: '10%', alignment: 'center', format: 'fixedPoint' },
            { dataField: 'LossCount', caption: '손실수량', width: '10%', alignment: 'center', format: 'fixedPoint' },
            { dataField: 'CurrentStockCount', caption: '보유수량', width: '10%', alignment: 'center', format: 'fixedPoint' },
            {
                dataField: 'AddDate', caption: '등록일', width: '15%', alignment: 'center', dataType: "shortDate", format: "yyyy-MM-dd",
                customizeText: function (cellInfo) {
                    return cellInfo.valueText;
                }
            },
            {
                dataField: 'FmsEquipmentRentInfo/RentUser', caption: '대여자', width: '10%', alignment: 'center', dataType: "shortDate", format: "yyyy-MM-dd",
                customizeText: function (cellInfo) {
                    return cellInfo.valueText;
                }
            },
            {
                dataField: 'FmsEquipmentRentInfo/RentDate', caption: '대여일', width: '14%', alignment: 'center', dataType: "shortDate", format: "yyyy-MM-dd",
                customizeText: function (cellInfo) {
                    return cellInfo.valueText;
                }
            },
            {
                dataField: 'FmsEquipmentRentInfo/ReturnDueDate', caption: '반납예정일', width: '14%', alignment: 'center', dataType: "shortDate", format: "yyyy-MM-dd",
                customizeText: function (cellInfo) {
                    return cellInfo.valueText;
                }
            },
            {
                dataField: 'FmsEquipmentRentInfo/ReturnFixDate', caption: '반납일', width: '14%', alignment: 'center', dataType: "shortDate", format: "yyyy-MM-dd",
                customizeText: function (cellInfo) {
                    return cellInfo.valueText;
                }
            }
        ],
        paging: {
            pageSize: 18,
            enabled: true
        },
        pager: {},
        "export": {
            enabled: true,
            fileName: '공기구 이력 목록',
        },
        onExporting: function (e) {
            e.component.columnOption("EquipmentHistoryId", "visible", false);
        },
        onExported: function (e) {
            e.component.columnOption("EquipmentHistoryId", "visible", true);
        },
        cellPrepared: function (cellElement, cellInfo) {
            // 2 보다 큰 경우 대여수 0
            if (cellInfo.rowType == 'data') {
                if (cellInfo.data.EquipmentStateTypeId() > 2) {
                    if (cellInfo.columnIndex == 7) {
                        $(cellElement).text('0');
                    }
                }
            }
        },
        sort: { field: "EquipmentHistoryId", desc: true },
        searchViewItems: [
            { id: 'FmsEquipment/Name' },
            { id: 'FmsEquipment/Standard' },
            { id: 'FmsEquipmentRentInfo/RentUser' },
            { id: 'EquipmentStateTypeId', ignoreValue: 0, defaultValue: 0, dataSource: codeStateTypesForSearch }, // 구분
            { id: 'FmsEquipment/FmsEquipmentCodeType/EquipmentTypeId', ignoreValue: 0, defaultValue: 0, dataSource: codeTypesForSearch }, // 분류 
            { id: 'AddDate', type: 'dateRange', isOnlyDate: true },
        ],
        popupWidth: 400,

        handleViewShowing: function (dataModel) {
            $.when(
                codeStateTypeDataSource.load(),
                codeTypeDataSource.load(),
                warehouseDataSource.load()
            ).done(function (codeStateTypeResult, codeTypeResult, warehouseResult) {

                codeStateTypes(codeStateTypeResult[0]);
                codeTypes(codeTypeResult[0]);
                warehouses(warehouseResult[0]);

                codeStateTypesForSearch($SearchView.createArrayOfSelectBox('EquipmentStateTypeId', codeStateTypes()));
                codeTypesForSearch($SearchView.createArrayOfSelectBox('EquipmentTypeId', codeTypes()));
                warehousesForSearch($SearchView.createArrayOfSelectBox('WarehouseId', warehouses()));

                deferredForSearch.resolve();
            });
        },

        handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {

        },

        handlePopupShowing: function (isNewInPopup, dataViewModel) {
            // 저장 버튼 
            viewModel.toolbarItems[4].options.clickAction = this.handlePopupButtonSave;
            dataViewModel.RegisterUserId = $KoSet(dataViewModel.RegisterUserId, BWA.UserInfo.UserId());
            dataViewModel.EquipmentTypeId = ko.observable();
            dataViewModel.WarehouseId = ko.observable();
            dataViewModel.Unit = ko.observable();
            dataViewModel.Standard = ko.observable();
            dataViewModel.SupplierName = ko.observable();
            dataViewModel.SupplierPhoneNo = ko.observable();
        },

        handlePopupShown: function (isEditMode, isNew, dataViewModel) {

            $.when(
                equipmentExDataSource.load()
             ).done(function (equipmentExResult) {
                 equipmentExs(equipmentExResult);
             });

            if (isNew) { // 신규등록인 경우 
                dataViewModel.AddDate($G.date(new Date()));
                dataViewModel.UpdateDate($G.date(new Date()));
                dataViewModel.RegisterUserId(BWA.UserInfo.UserId());
                dataViewModel.StoredCount(1);
            }
        },

        handlePopupButtonSave: function () {

            var dataViewModel = viewModel.dataModel;

            if (IsAdditionalEquipment()) {
                if (dataViewModel.EquipmentId() == null) {
                    utils.toast.show('추가입고할 공기구를 선택하세요.', 'error');
                    return;
                }
            }
            else {
                if (dataViewModel.EquipmentTypeId() == null) {
                    utils.toast.show('입고할 공기구 분류를 선택하세요.', 'error');
                    return;
                }
                else if (dataViewModel.Name() == null) {
                    utils.toast.show('입고할 공기구 이름을 입력하세요.', 'error');
                    return;
                }
            }

            if (dataViewModel.WarehouseId() == null) {
                utils.toast.show('입고될 창고위치를 선택하세요.', 'error');
                return;
            }

            var parameters = {
                SiteId: dataViewModel.SiteId(),
                IsAdditionalEquipment: IsAdditionalEquipment()
            };

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

    function processValueChange(e) {
        var foundModel = _.find(equipmentExs(), function (x) {
            return x.EquipmentId() === e.value;
        });

        if (foundModel !== undefined) {
            var dataViewModel = viewModel.dataModel;

            dataViewModel.EquipmentId(foundModel.EquipmentId());
            dataViewModel.EquipmentTypeId(foundModel.EquipmentTypeId());
            dataViewModel.WarehouseId(foundModel.WarehouseId());
            dataViewModel.Unit(foundModel.Unit());
            dataViewModel.Standard(foundModel.Standard());
            dataViewModel.UpdateDate(new Date());
            dataViewModel.SupplierName(foundModel.SupplierName());
            dataViewModel.SupplierPhoneNo(foundModel.SupplierPhoneNo());
            dataViewModel.TotalStockCount(foundModel.TotalStockCount());
            dataViewModel.CurrentStockCount(foundModel.CurrentStockCount());
        }
    }

    viewModel.processValueChange = processValueChange;
    viewModel.IsAdditionalEquipment = IsAdditionalEquipment;
    viewModel.equipmentExs = equipmentExs;
    viewModel.codeTypes = codeTypes;
    viewModel.codeStateTypes = codeStateTypes;
    viewModel.warehouses = warehouses;

    return viewModel;
};