(function () {
    'use strict';

    BWA.View = BWA.View || {};
    BWA.View.Facility = BWA.View.Facility || {};

    BWA.View.Facility.createCodeClassView = function (params, viewInfo, options) {
        var dbModelId = options.dbModelId,
            selectedClassNameTitle = options.selectedClassNameTitle,
            classIdFieldName = [options.classId, 'ClassId'].join(''),
            parentClassIdFieldName = ['Parent', options.classId, 'ClassId'].join(''),
            viewModelName = ['Fms', options.classId, 'CodeClassViewModel'].join('');
        var initialized = false,
            shouldReload = false,
            dataViewModel = new BemsWebApplication[viewModelName](),

            isNewInPopup = ko.observable(false),
            isEditModeInPopup = ko.observable(false),
            viewModeInPopup = ko.observable(true),

            selectedClassName = ko.observable(selectedClassNameTitle),

            visibleCancelButton = ko.observable(false),
            selectedIds = [{}, {}, {}],
            selectedId = null,

            viewModel,
            hasnotModificationPermission,

            gridViews = [],
            popupVisible = ko.observable(false),

            disabledUpdateButton = ko.observable(true),
            disabledInsertButtons = [ko.observable(false), ko.observable(true), ko.observable(true)],
            dataSources = [];

        var selectedClassDepth = 0,
            backupSelectedClassDepth = 0;

        var isClass3 = ko.observable(false);

        var commandInsertButtonOptions = [{
            id: 'create1',
            title: '대분류 등록',
            disabled: disabledInsertButtons[0],
            action: function () {
                setInsertPopupInfo(0, null);
            }
        }, {
            id: 'create2',
            title: '중분류 등록',
            disabled: disabledInsertButtons[1],
            action: function () {
                setInsertPopupInfo(1, selectedIds[0][classIdFieldName]);
            }
        }, {
            id: 'create3',
            title: '소분류 등록',
            disabled: disabledInsertButtons[2],
            action: function () {
                setInsertPopupInfo(2, selectedIds[1][classIdFieldName]);
            }
        }];

        var commandUpdateButtonOption = {
            id: 'edit',
            title: '수정',
            disabled: disabledUpdateButton,
            action: function () {
                isNewInPopup(false);
                isClass3(selectedClassDepth === 2);
                popupVisible(true);
            }
        };

        var FmsFacilityCodeClassDataSource = BemsWebApplication.db.createDataSource('FmsFacilityCodeClass');
        var FmsMaterialCodeClassDataSource = BemsWebApplication.db.createDataSource('FmsMaterialCodeClass');
        var FmsFacilityCodeClassInfo = ko.observableArray();
        var FmsMaterialCodeClassInfo = ko.observableArray();
        var RowName;

        function handleModification() {
            shouldReload = true;
        }

        function handleSelectionChanged(selectedRowsInfo) {

            //var id = $(selectedRowsInfo.element).attr('id');
            //console.log(selectedRowsInfo.selectedRowKeys.length);

            //var isNotExistSelectedRow = (selectedRowsInfo.selectedRowKeys.length === 0);

            //var classDepth = Number(id.replace('gridContainer', '')) - 1;

            //if (classDepth < 2) {
            //    disabledInsertButtons[classDepth + 1](isNotExistSelectedRow);
            //}
            refreshAllStatus();
        }

        function refreshAllStatus() {
            var isSelected = false;
            var names = [];

            selectedClassDepth = 0;
            for (var i = 0 ; i < gridViews.length ; i++) {

                var rows = gridViews[i].getSelectedRowsData();
                if (_.isEmpty(rows) === false) {

                    var row = rows[0];
                    selectedClassDepth = i;
                    isSelected = true;
                    selectedIds[i].SiteId = row.SiteId();
                    selectedIds[i][classIdFieldName] = row[classIdFieldName]();

                    if (i < 2) {

                        disabledInsertButtons[i + 1](false);
                    }
                    names.push(row.Name());
                }
                else {
                    delete selectedIds[i].SiteId;
                    delete selectedIds[i][classIdFieldName];

                    if (i < 2) {
                        disabledInsertButtons[i + 1](true);
                    }
                }
            }

            if (hasnotModificationPermission()) {
                for (var i = 0 ; i < 3 ; i++) {
                    disabledInsertButtons[i](true);
                }
                disabledUpdateButton(true);
            }
            else {
                disabledUpdateButton(isSelected === false);
            }
            selectedClassName([selectedClassNameTitle, names.join(' /')].join(' '));
        }

        function handleViewShown() {
            if (hasnotModificationPermission()) {
                for (var i = 0 ; i < 3 ; i++) {
                    disabledInsertButtons[i](true);
                }
                disabledUpdateButton(true);
            }

            if (shouldReload) {
                shouldReload = false;
                refreshList();
                //for (var i = 0 ; i < 3 ; i++) {
                //    dataSources[i].pageIndex(0);
                //    dataSources[i].load();
                //}
            }
            if (initialized === false) {

                for (var j = 0 ; j < 3 ; j++) {
                    var dataGridOptions = j == 2 ? {
                        columns: [
                            { dataField: 'Abbreviation', caption: $G('abbreviation'), width: '20%', alignment: 'center' },
                            { dataField: 'Name', caption: $G('className'), width: '50%', alignment: 'center' },
                            utils.datagrid.columnIsUse('30%')
                        ]
                    } : {
                        columns: [
                            { dataField: 'Abbreviation', caption: $G('abbreviation'), width: '30%', alignment: 'center' },
                            { dataField: 'Name', caption: $G('className'), width: '70%', alignment: 'center' }
                        ]
                    };
                    dataGridOptions.selectedSourceItem = dataViewModel;
                    dataGridOptions.dbId = dbModelId;
                    dataGridOptions.selectedId = selectedIds[j];
                    dataGridOptions.datagridId = 'gridContainer' + (j + 1);
                    dataGridOptions.selectionChanged = handleSelectionChanged;
                    dataGridOptions.handleDataGridRowClick = handleDataGridRowClick;
                    var id = ['#', 'gridContainer', (j + 1)].join('');
                    dataGridOptions = utils.datagrid.defaultOptions(dataGridOptions);
                    $(id).dxDataGrid(dataGridOptions);
                    gridViews[j] = $(id).dxDataGrid('instance');
                }

                $("#gridContainer1").dxDataGrid({
                    paging: {
                        pageSize: 19
                    }
                });
                $("#gridContainer2").dxDataGrid({
                    paging: {
                        pageSize: 19
                    }
                });
                $("#gridContainer3").dxDataGrid({
                    paging: {
                        pageSize: 19
                    }
                });
                refreshDataSource(0, null);
                initialized = true;
            }
        }

        function refreshDataSource(depth, parentId) {
            dataSources[depth].filter([parentClassIdFieldName, '=', parentId], 'and', ['SiteId', '=', BWA.UserInfo.SiteId()]);       //**kgpark
            dataSources[depth].load().done(function (array) {
                gridViews[depth].option('dataSource', array);
                gridViews[depth].refresh();
            });
        }

        function handleDataGridRowClick(id, dataGrid, clickRow) {
            switch (id) {
                case 'gridContainer1':
                    refreshDataSource(1, clickRow.data[classIdFieldName]());
                    refreshDataSource(2, -1);
                    break;
                case 'gridContainer2':
                    refreshDataSource(2, clickRow.data[classIdFieldName]());
                    break;

                case 'gridContainer3':
                    break;
            }

            if (dbModelId == 'FmsFacilityCodeClass') {
                FmsFacilityCodeClassDataSource.filter([
                    ["SiteId", "=", BWA.UserInfo.SiteId()],
                    "and",
                    ["Depth", "=", clickRow.data.Depth()],
                    "and",
                    ["ParentFacilityClassId", "=", clickRow.data.ParentFacilityClassId()]
                ]);

                FmsFacilityCodeClassDataSource.load().done(function (result) {
                    FmsFacilityCodeClassInfo(result);
                });
            }
            else if (dbModelId == 'FmsMaterialCodeClass') {
                FmsMaterialCodeClassDataSource.filter([
                    ["SiteId", "=", BWA.UserInfo.SiteId()],
                    "and",
                    ["Depth", "=", clickRow.data.Depth()],
                    "and",
                    ["ParentMaterialClassId", "=", clickRow.data.ParentFacilityClassId()]
                ]);
                FmsMaterialCodeClassDataSource.load().done(function (result) {
                    FmsMaterialCodeClassInfo(result);
                });
            }

            RowName = clickRow.data.Name;
        }

        function handleViewDisposing() {
            BemsWebApplication.db[dbModelId].modified.remove(handleModification);
        }

        viewModel = BWA.CommonView.create(params, viewInfo, null, null, handleViewShown);

        hasnotModificationPermission = viewModel.hasnotModificationPermission;

        var dataSourceOptions = {
            store: BemsWebApplication.db[dbModelId],
            map: function (item) {
                return new BemsWebApplication[viewModelName](item);
            }
        };

        for (var k = 0 ; k < 3 ; k++) {
            dataSources[k] = new DevExpress.data.DataSource(dataSourceOptions);
            dataSources[k].pageSize(30);
        }
        dataSources[0].filter([
            ['SiteId', '=', BWA.UserInfo.SiteId()],
            'and',
            [parentClassIdFieldName, '=', null]
        ]);
        dataSources[1].filter(parentClassIdFieldName, '=', -1);
        dataSources[2].filter(parentClassIdFieldName, '=', -1);

        function refreshList() {

            if (selectedClassDepth === 0) {
                refreshDataSource(0, null);
            }
            for (var i = Math.max(1, selectedClassDepth) ; i < 3 ; i++) {

                var classId = selectedIds[i - 1][classIdFieldName];

                if (_.isUndefined(classId)) continue;

                refreshDataSource(i, selectedIds[i - 1][classIdFieldName]);
            }
        }

        function handlePopupShowing(e) {

            if (isNewInPopup() == false) {

                activePopupViewMode();
                BemsWebApplication.db[dbModelId].byKey(selectedIds[selectedClassDepth]).done(function (data) {
                    dataViewModel.fromJS(data);
                });
            }
            else {
                //activePopupInsertMode();
                clearDataModelValue(dataViewModel);
            }
            visibleCancelButton(false);
        }

        function clearDataModelValue(v) {
            $.each(v, function (name, value) {
                if (name !== parentClassIdFieldName && name !== 'Depth') {
                    v[name](null);
                }
            });
            v.SiteId(BWA.UserInfo.SiteId());
            v.IsUse(true); // hcLee 2016 03 10
        }

        BemsWebApplication.db[dbModelId].modified.add(handleModification);

        // TODO: 아래 breakpoint 에 대해 FmsBudgetCodeClass 의 분기가 필요 함
        function handleConfirmDelete() {

            //alert(classIdFieldName);
            //alert(classIdFieldName.FacilityClassId);

            if (dbModelId == 'FmsBudgetCodeClass') {

                BWA.api.post('FmsBudgetCodeClass2/Delete', dataViewModel.toJS()).done(function () {
                    refreshList();
                    utils.toast.show($G('successDatabaseDeleteMsg'));
                    popupVisible(false);
                });
            }
            else {
                var parameters = {
                    SiteId: dataViewModel.SiteId(),
                    Depth: dataViewModel.Depth()
                };

                parameters[classIdFieldName] = dataViewModel[classIdFieldName]();

                // alert(classIdFieldName + parameters[classIdFieldName]);

                BemsWebApplication.api.delete(dbModelId, parameters).done(function () {
                    refreshList();
                    utils.toast.show($G('successDatabaseDeleteMsg'));
                    popupVisible(false);
                });
            }
        }

        function update() {

            if (dbModelId == 'FmsBudgetCodeClass') {
                BWA.api.post('FmsBudgetCodeClass2/Update', dataViewModel.toJS()).done(function () {
                    refreshList();
                    utils.toast.show($G('successDatabaseUpdateMsg'));
                    popupVisible(false);
                });
            }
            else
                if (dbModelId == 'FmsFacilityCodeClass') {
                    BWA.api.post('FmsFacilityCodeClass/Update', dataViewModel.toJS()).done(function () {
                        refreshList();
                        utils.toast.show($G('successDatabaseUpdateMsg'));
                        popupVisible(false);
                    });
                }
                else {
                    BemsWebApplication.db[dbModelId].update(selectedIds[selectedClassDepth], dataViewModel.toJS()).done(function () {
                        refreshList();
                        utils.toast.show($G('successDatabaseUpdateMsg'));
                        popupVisible(false);
                    });
                }
        }

        function insert() {
            if (dbModelId == 'FmsBudgetCodeClass') {
                BWA.api.post('FmsBudgetCodeClass2/Insert', dataViewModel.toJS()).done(function () {
                    refreshList();
                    refreshAllStatus();
                    utils.toast.show($G('successDatabaseInsertionMsg'));
                    popupVisible(false);
                });
            }
            else {
                //if (dbModelId == 'FmsFacilityCodeClass') {
                //    BWA.api.post('FmsFacilityCodeClass/Insert', dataViewModel.toJS()).done(function () {
                //        refreshList();
                //        refreshAllStatus();
                //        utils.toast.show($G('successDatabaseInsertionMsg'));
                //        popupVisible(false);
                //    });
                //}
                //else {
                BemsWebApplication.db[dbModelId].insert(dataViewModel.toJS()).done(function (values, newId) {

                    refreshList();
                    refreshAllStatus();
                    utils.toast.show($G('successDatabaseInsertionMsg'));
                    popupVisible(false);
                });
                //}
            }

        }

        function activePopupEditMode() {
            viewModeInPopup(false);
            isEditModeInPopup(true);
        }

        function activePopupViewMode() {
            viewModeInPopup(true);
            isEditModeInPopup(false);
        }

        var tmpName, tmpAbbreviation;
        function handlePopupButtonEdit() {
            tmpName = dataViewModel.Name();
            tmpAbbreviation = dataViewModel.Abbreviation();
            activePopupEditMode();
            visibleCancelButton(true);
        }

        function handlePopupButtonCancel() {
            dataViewModel.Name(tmpName);
            dataViewModel.Abbreviation(tmpAbbreviation);
            activePopupViewMode();
            visibleCancelButton(false);
        }

        function popupInsertView() {
            activePopupEditMode();
            popupVisible(true);
        }

        function handlePopupButtonSave() {
            // 필수 입력 조건 체크                  
            // cyim 2015.12.28 : 설정-시설관리-시설등록-시설분류목록에 추가되는 항목에 입력 조건 추가 (약어,분류 명칭)
            //if (dbModelId == 'FmsFacilityCodeClass') {
            //    if (BWA.DataUtil.isValidInputValue(dataViewModel.Abbreviation()) == false || BWA.DataUtil.isValidInputValue(dataViewModel.Name()) == false) {
            //        utils.toast.show($G('Error_FmsFacilityCodeClass_NotInputData'), 'error');
            //        return;
            //    }

            //    // hcLee 2016 01 15
            //    // cyim 2015.12.30 : 설정-시설관리-시설등록-시설분류목록에 중복 입력 체크    
            //    BWA.api.post('FmsFacilityCodeClass/Check', dataViewModel.toJS()).done(function (result) {
            //        if (result == false) {
            //            utils.toast.show($G('Error_SameInputData'), 'error');
            //            return;
            //        }

            //        if (isNewInPopup())
            //            insert();
            //        else
            //            update();
            //    });
            //}

            var isDuplicated = false;
            
            if (dbModelId == 'FmsFacilityCodeClass') {
                
                if (isNewInPopup()) {
                    for (var i = 0; i < FmsFacilityCodeClassInfo().length; i++) {
                        if (dataViewModel.Name() == FmsFacilityCodeClassInfo()[i].Name() || dataViewModel.Abbreviation() == FmsFacilityCodeClassInfo()[i].Abbreviation()) {
                            isDuplicated = true;
                            break;
                        }
                    }
                }
                else {
                    for (var i = 0; i < FmsFacilityCodeClassInfo().length; i++) {
                        if (RowName() != FmsFacilityCodeClassInfo()[i].Name() && (dataViewModel.Name() == FmsFacilityCodeClassInfo()[i].Name() || dataViewModel.Abbreviation() == FmsFacilityCodeClassInfo()[i].Abbreviation())) {
                            isDuplicated = true;
                            break;
                        }
                    }
                }
                if (!BWA.DataUtil.isValidInputValue(dataViewModel.Name()) || !BWA.DataUtil.isValidInputValue(dataViewModel.Abbreviation())) {
                    utils.toast.show('저장 혹은 수정 반드시 필수 입력 정보를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)', 'error');
                }
                else {
                    if (isDuplicated) {
                        utils.toast.show('이미 동일 정보가 존재합니다.', 'error');
                    }
                    else {
                        if (isNewInPopup())
                            insert();
                        else
                            update();
                    }
                }
            }

            else if (dbModelId == 'FmsMaterialCodeClass') {

                if (isNewInPopup()) {
                    for (var i = 0; i < FmsMaterialCodeClassInfo().length; i++) {
                        if (dataViewModel.Name() == FmsMaterialCodeClassInfo()[i].Name() || dataViewModel.Abbreviation() == FmsMaterialCodeClassInfo()[i].Abbreviation()) {
                            isDuplicated = true;
                            break;
                        }
                    }
                }
                else {
                    for (var i = 0; i < FmsMaterialCodeClassInfo().length; i++) {
                        if (RowName() != FmsMaterialCodeClassInfo()[i].Name() && (dataViewModel.Name() == FmsMaterialCodeClassInfo()[i].Name() || dataViewModel.Abbreviation() == FmsMaterialCodeClassInfo()[i].Abbreviation())) {
                            isDuplicated = true;
                            break;
                        }
                    }
                }
                if (!BWA.DataUtil.isValidInputValue(dataViewModel.Name()) || !BWA.DataUtil.isValidInputValue(dataViewModel.Abbreviation())) {
                    utils.toast.show('저장 혹은 수정 반드시 필수 입력 정보를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)', 'error');
                }
                else {
                    if (isDuplicated) {
                        utils.toast.show('이미 동일 정보가 존재합니다.', 'error');
                    }
                    else {
                        if (isNewInPopup())
                            insert();
                        else
                            update();
                    }
                }
            }

            else {
                // hcLee 2016 01 15
                if (isNewInPopup())
                    insert();
                else
                    update();
            }
        }

        function handlePopupButtonDelete() {
            DevExpress.ui.dialog.confirm($G('deleteConfirmMsg'), "삭제").then(function (result) {
                if (result) {
                    handleConfirmDelete();
                }
                else {
                    // toast
                }
            });
        }

        function handlePopupButtonClose() {
            popupVisible(false);
        }

        function setInsertPopupInfo(depth, parentClassId) {
            
            if (dbModelId == 'FmsFacilityCodeClass') {
                FmsFacilityCodeClassDataSource.filter([
                    ["SiteId", "=", BWA.UserInfo.SiteId()],
                    "and",
                    ["Depth", "=", depth],
                    "and",
                    ["ParentFacilityClassId", "=", parentClassId]
                ]);

                FmsFacilityCodeClassDataSource.load().done(function (result) {
                    FmsFacilityCodeClassInfo(result);
                });
            }
            else if (dbModelId == 'FmsMaterialCodeClass') {
                FmsMaterialCodeClassDataSource.filter([
                    ["SiteId", "=", BWA.UserInfo.SiteId()],
                    "and",
                    ["Depth", "=", depth],
                    "and",
                    ["ParentMaterialClassId", "=", parentClassId]
                ]);
                FmsMaterialCodeClassDataSource.load().done(function (result) {
                    FmsMaterialCodeClassInfo(result);
                });
            }

            isNewInPopup(true);
            activePopupEditMode();
            dataViewModel[parentClassIdFieldName](parentClassId);
            dataViewModel.Depth(depth);

            selectedClassDepth = depth;
            isClass3(depth === 2);
            popupVisible(true);
        }

        var toolbarItems = [
            { location: 'before', text: $G('detailInfo') },
            { location: 'after', widget: 'button', options: { text: $G('edit'), icon: 'edit', visible: viewModeInPopup, clickAction: handlePopupButtonEdit } },
            { location: 'after', widget: 'button', options: { text: $G('delete'), type: 'danger', icon: 'remove', visible: viewModeInPopup, clickAction: handlePopupButtonDelete } },

            { location: 'after', widget: 'button', options: { text: $G('cancel'), icon: 'arrowleft', type: 'default', visible: visibleCancelButton, clickAction: handlePopupButtonCancel } },
            { location: 'after', widget: 'button', options: { text: $G('save'), icon: 'save', visible: isEditModeInPopup, clickAction: handlePopupButtonSave } },

            { location: 'after', widget: 'button', options: { text: $G('close'), icon: 'close', clickAction: handlePopupButtonClose } }
        ];

        var popupOptions = {

            width: '480px',
            height: 'auto',
            visible: popupVisible,
            closeOnOutsideClick: true,
            showingAction: handlePopupShowing,
            animation: {
                show: { type: "pop", duration: 200, from: { opacity: 1, scale: 0.4 }, to: { scale: 1 } },
                hide: { type: "fade", duration: 200, from: 1, to: 0 }
            }
        };

        return $.extend(viewModel, {

            dataModel: dataViewModel,

            refreshList: refreshList,

            //viewShowing: handleViewShowing ,
            //viewShown: handleViewShown,
            viewDisposing: handleViewDisposing,

            popupInsertView: popupInsertView,

            viewModeInPopup: viewModeInPopup,
            isEditModeInPopup: isEditModeInPopup,
            isNewInPopup: isNewInPopup,

            popupOptions: popupOptions,
            commandInsertButtonOptions: commandInsertButtonOptions,
            commandUpdateButtonOption: commandUpdateButtonOption,

            selectedClassName: selectedClassName,

            toolbarItems: toolbarItems,
            isClass3: isClass3,
        });
    };
})();