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

    var VIRTUAL_FACILITY_ID = 1,
        FACILITY_ID = 2,
        //FACILITY_DEPTH = 2,
        FACILITY_DEPTH = 3, // hcLee
        BID_INSERT_VIRTUAL_FACILITY = 0,
        BID_EDIT_VIRTUAL_FACILITY = 1,
        BID_GENERATE_POINT = 2,
        BID_DELETE_POINT = 3;

    //권한설정
    var hasnotModificationPermission = ko.observable(true);

    var disabledButtons = [ko.observable(), ko.observable(), ko.observable(), ko.observable()];

    // 2016 06 03 hcLee 추가
    var facilityTypeDataSource = BemsWebApplication.db.createDataSource('BemsFacilityType');

    var BemsMonitoringPointInfo = ko.observableArray();
    var BemsMonitoringPointDataSource = BemsWebApplication.db.createDataSource('BemsMonitoringPoint');
    var RowName;

    var facilityDataSource = BWA.DataUtil.createDataSource({
        dataSourceOptions: {
            select: [
                'SiteId', 'FacilityCode', 'Name', 'FacilityTypeId', 'BemsFacilityType/Name', 'IsVirtualFacility'
            ],
            expand: ['BemsFacilityType'],
            extendOptions: {
                forceOriginalField: true
            },
            paginate: false, // 페이징을 하지 않음
        }
    }, 'CmFacility'),

        factory = BemsWebApplication.Factory.PointLocationMapping,

        viewModel,
        popup = null,
        virtualFacilityPopup = null,
        popupVisible = ko.observable(false),

        eq = BWA.DataUtil.constructEqualFilter,

        selectedTreeData = ko.observable(null),
        selectedTreeItem = ko.observable(null);

    var commandButtonOptions = [{
        icon: 'add',
        id: 'create1',
        title: '가상시설등록',
        disabled: disabledButtons[BID_INSERT_VIRTUAL_FACILITY],
        action: handlePopupInsertVirtualFacility
    }, {
        icon: 'edit',
        id: 'create2',
        title: '가상시설수정',
        disabled: disabledButtons[BID_EDIT_VIRTUAL_FACILITY],
        action: handlePopupUpdateVirtualFacility

    }, {
        icon: 'add',
        id: 'create3',
        title: '관제점초기생성',
        disabled: disabledButtons[BID_GENERATE_POINT],
        action: generatePoints

    }, {
        icon: 'remove',
        id: 'delete',
        title: '관제점삭제',
        disabled: disabledButtons[BID_DELETE_POINT],
        action: handleRemoveSelectedPoints
    }];

    function handleClickTreeItem(element, data) {

        var eq = BWA.DataUtil.constructEqualFilter;

        selectedTreeItem(data);

        var filter;
        var depth = data.depth;
        var parentData = data.parentData;

        data = data.data;

        selectedTreeData(data);

        //if (depth !== FACILITY_DEPTH) {
        if (depth == 1) {
            if (data.Id === FACILITY_ID) {

                filter = getFacilityFilter();
            }
            else {

                filter = getVirtualFacilityFilter();
            }
        }
        else if (depth == 2) {
            filter = [
                eq('SiteId', BWA.UserInfo.SiteId()),
                'and',
                //eq('FacilityTypeId', data.FacilityCode()),
                eq('FacilityTypeId', data.FacilityTypeId()),
            ];
        }
        else {
            filter = [
                eq('SiteId', BWA.UserInfo.SiteId()),
                'and',
                eq('FacilityCode', data.FacilityCode()),
            ];
        }
        viewModel.setGridViewFilter(filter);
    }

    function getVirtualFacilityFilter() {
        // FacilityTypeId 99 은 가상설비의 타입 아이디 임 
        return [
            ['SiteId', '=', BWA.UserInfo.SiteId()],
            'and',
            ['FacilityTypeId', '=', 99],
        ];
    }

    function getFacilityFilter() {
        return [
            ['SiteId', '=', BWA.UserInfo.SiteId()],
            'and',
            ['FacilityTypeId', '<', 99]
        ];
    }

    function handleViewShown() {
        hasnotModificationPermission(!BWA.UserInfo.hasPermissionOfModification(viewInfo.viewName));
        if (hasnotModificationPermission()) {
            for (var i = 0; i < 4; i++) {
                commandButtonOptions[i].disabled(true);
            }
        } else {
            for (var i = 0; i < 4; i++) {
                commandButtonOptions[i].disabled(false);
            }
        }

        // start warning : 아래 코드는 화면이 열릴때 마다 확인 함. 성능상 이슈 발생 가능성이 있음
        if (facilityDataSource._items.length != 0) {
            var data = selectedTreeItem();
            if (data != null) $('#facilityTreeView').cwTreeView('reload', selectedTreeItem().parentData);
        }
        // end warning

        var eq = BWA.DataUtil.constructEqualFilter;
        $('#facilityTreeView').cwTreeView({
            width: '30%',
            height: 'auto',
            //maxDepth: 2,
            //height: '480px',
            onClickTreeItem: handleClickTreeItem,
            delegateDataSource: function (data, alterObj) {
                var id = data.id;
                var depth = data.depth;

                var promise = null;
                switch (depth) {
                    case 0:
                        var typeDeferred = new $.Deferred();
                        promise = typeDeferred.promise();

                        alterObj.IsFunction = false;

                        typeDeferred.resolve([{
                            Id: VIRTUAL_FACILITY_ID,
                            Name: '가상시설'
                        }, {
                            Id: FACILITY_ID,
                            Name: '일반시설'
                        }
                        ])
                        break;

                    case 1:

                        var filter;

                        switch (data.data.Id) {
                            /*
                            case VIRTUAL_FACILITY_ID:
                                filter = getVirtualFacilityFilter();
                                break;

                            case FACILITY_ID:
                                filter = getFacilityFilter();
                                break;
                                */
                            case FACILITY_ID: filter = [['FacilityTypeId', '<', 99]]; break;
                            case VIRTUAL_FACILITY_ID: filter = [['FacilityTypeId', '=', 99]]; break;
                        }
                        facilityTypeDataSource.filter(filter);
                        promise = facilityTypeDataSource.load();
                        //facilityDataSource.filter(filter);
                        //promise = facilityDataSource.load();
                        break;

                    case 2:
                        facilityDataSource.filter([
                            eq('SiteId', BWA.UserInfo.SiteId()),
                            'and',
                            eq('FacilityTypeId', data.data.FacilityTypeId())
                        ]);
                        promise = facilityDataSource.load();
                        break;
                }
                return promise;
            }
        });
        popup.handleViewShown();
        virtualFacilityPopup.handleViewShown();
    }


    function handleAddPoints(points) {
        if (points.length === 0) return;
        if (selectedTreeData() === null) {
            utils.toast.show('선택된 빌딩/층/존이 없습니다.', 'warning');
            return null;
        }

        var rows = window.utils.datagrid.getItems(gridView);

        points = _.map(points, function (item) {

            var facilityCode = item.FacilityCode;
            var propertyId = item.PropertyId;

            if (_.some(rows, function (x) {
                return (x.FacilityCode() === facilityCode && x.PropertyId === propertyId);
            })) {
                return null;
            }
            return item;
        });

        var data = selectedTreeData();
        var parameters = {
            BuildingId: data.BuildingId()
        };
        if (_.isUndefined(data.FloorId) === false) {
            parameters.FloorId = data.FloorId();
            if (_.isUndefined(data.ZoneId) === false) {
                parameters.ZoneId = data.ZoneId();
            }
            else {
                parameters.ZoneId = null;
            }
        }
        else {
            parameters.FloorId = null;
            parameters.ZoneId = null;
        }

        var postData = [];
        var itemKeys = ['SiteId', 'FacilityCode', 'PropertyId'];
        var toJS = BWA.DataUtil.convertHybridViewModelToJS;
        //        $.each(points.concat(rows), function(i, item) {
        $.each(points, function (i, item) {
            item = toJS(_.pick(item, itemKeys));
            item = $.extend(item, parameters);
            postData.push(item);
        });

        parameters.SiteId = data.SiteId();
        var promise = BemsWebApplication.api.post(
            'BemsMonitoringPoint/AddLocation', postData, parameters
        );

        promise.done(function () {

            utils.toast.show($G('successDatabaseProcessMsg'));
            gridView.refresh();
        });
        return promise;
    }

    function handlePopupInsertVirtualFacility() {

        virtualFacilityPopup.show();
    }

    function handlePopupUpdateVirtualFacility() {

        var item = selectedTreeItem();

        var isExist = ko.observable(false);


        if (_.isNull(item)) {

            utils.toast.show('가상시설을 선택해 주십시오.', 'warning');
            return;
        }
        if (item.depth !== FACILITY_DEPTH || item.parentData.data.Id === FACILITY_ID) {

            utils.toast.show('가상시설만 수정이 가능합니다.', 'warning');
            return;
        }
        
        if (item != null && item.depth === FACILITY_DEPTH) {
            facilityDataSource.filter([
                eq('SiteId', BWA.UserInfo.SiteId()),
                'and',
                eq('FacilityTypeId', item.data.FacilityTypeId())
            ]);
            facilityDataSource.load().done(function (result) {
                for (var i = 0; i < result.length; i++) {
                    if (item.data.Name() == result[i].Name()) {
                        isExist(true);
                    }
                }

                if (_.isNull(item) || item.depth !== FACILITY_DEPTH || isExist() === false) {
                    utils.toast.show('관제점을 등록할 시설을 선택하여 주십시오.', 'warning');
                }
                else {
                    virtualFacilityPopup.show(BWA.DataUtil.convertViewModelToJS(selectedTreeData()), item.data.Name());
                }
            });
        }
        else {
            utils.toast.show('관제점을 등록할 시설을 선택하여 주십시오.', 'warning');
        }
    }

    function generatePoints() {

        var item = selectedTreeItem();
        if (_.isNull(item) ||
            (item.depth === 1 && item.data.Id !== FACILITY_ID) ||
            //(item.depth === 2 && item.parentData.data.Id !== FACILITY_ID) ||
            (item.depth === 2) ||
            (item.depth === 3 && item.parentData.parentData.data.Id !== FACILITY_ID)
            ) {
            utils.toast.show('모든 시설의 관제점을 재생성하려면 "일반시설"을 선택하시고, 아니면 특정 시설을 선택해 주십시오.', 'warning');
            return;
        }

        DevExpress.ui.dialog.confirm(
            '전체 혹은 선택된 시설의 관제점이 생성됩니다. 기존에 설정된 관제점 정보가 삭제됩니다. \n계속 진행하시겠습니까?',
            '관제점 생성'

        ).then(function (result) {

            if (result) {

                var data = item.data;
                var postData = {};
                switch (item.depth) {

                    case 1: // 전체
                        postData.SiteId = BWA.UserInfo.SiteId();
                        postData.FacilityTypeId = null;
                        postData.FacilityCode = null;
                        break;

                    case 2: // 2016 06 03 hcLee 추가
                        postData.SiteId = BWA.UserInfo.SiteId();
                        postData.FacilityTypeId = data.FacilityTypeId();
                        postData.FacilityCode = null;
                        break;

                    case 3: // 특정 시설 // 2016 06 03 hcLee 수정 기존 2 -> 3으로 변경
                        postData.SiteId = BWA.UserInfo.SiteId();
                        postData.FacilityTypeId = data.FacilityTypeId();
                        postData.FacilityCode = data.FacilityCode();
                        break;
                }

                disabledButtons[BID_GENERATE_POINT](true);
                BWA.api.post('BemsMonitoringPoint/Generation', postData)
                .always(function () {

                    disabledButtons[BID_GENERATE_POINT](false);
                }).done(function () {

                    viewModel.refreshList();
                    utils.toast.show('관제점 생성을 성공하였습니다.');
                });
            }
        });
    }

    function handleRemoveSelectedPoints() {

        var gridView = viewModel.gridView();
        var rows = gridView.getSelectedRowsData();

        if (_.isEmpty(rows)) {

            utils.toast.show('선택된 관제점이 없습니다.', 'warning');
            return;
        }

        // 삭제확인 메세지 박스 추가 hcLee 2016 06 03
        DevExpress.ui.dialog.confirm($G('deleteConfirmMsg'), "삭제").then(function (result) {
            if (result) {
                //handleConfirmDelete();
                var postData = [];
                var itemKeys = BWA.db.BemsMonitoringPoint.key();
                var toJS = BWA.DataUtil.convertHybridViewModelToJS;

                $.each(rows, function (i, item) {
                    item = toJS(_.pick(item, itemKeys));
                    postData.push(item);
                });

                var promise = BemsWebApplication.api.del(
                    'BemsMonitoringPoint', postData
                );

                promise.done(function () {

                    utils.toast.show($G('successDatabaseProcessMsg'));
                    gridView.clearSelection();
                    gridView.refresh();
                });
                return promise;
            }
        });
    }

    viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'BemsMonitoringPoint', {

        dataSourceOptions: factory.getDataSourceOptions(),
        selection: {
            mode: 'multiple'
        },

        columns: factory.getColumns([
            { dataField: 'CmFacility/Name', width: '40%' },
            { dataField: 'Name', width: '40%' },
            //{ dataField: 'ValueType', width: '20%' },
            { dataField: 'BemsFuelType/Name', caption: '에너지원', width: '30%', alignment: 'center' },
            { dataField: 'BemsServiceType/Name', caption: '용도', width: '30%', alignment: 'center' },
        ]),

        searchViewItems: [
            { id: 'CmFacility/Name' },
            { id: 'Name' }
        ],

        popupWidth: 520,
        insertButtonText: $G('pointInsert'),

        useNumberColumn: false,

        hasnotModificationPermission: hasnotModificationPermission, //권한설정

        handleViewShown: handleViewShown,
        handleInitializeDataModelValue: function (dataModel) {
            popup.handleInitializeDataModelValue(dataModel);
        },
        handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
            popup.handleDataGridRowClick.apply(this, arguments);
            var data = clickRow.data;
            RowName = data.Name;
        },
        // 이름 중복 방지
        handlePopupShowing: function () {

            var item = selectedTreeItem();
            BemsMonitoringPointDataSource.filter([
                eq('SiteId', BWA.UserInfo.SiteId()),
                'and',
                eq('FacilityTypeId', item.data.FacilityTypeId())
            ]);
            BemsMonitoringPointDataSource.load().done(function (result) {
                BemsMonitoringPointInfo(result);
            });
        },

        beforeInsertingDataViewModel: function (dataModel, dbModelId) {
            var dfd = $.Deferred();
            var param = {
                SiteId: dataModel.SiteId(),
                FacilityCode: dataModel.FacilityCode()
            };
            var isDuplicated = false;

            for (var i = 0; i < BemsMonitoringPointInfo().length; i++) {
                if (dataModel.Name() == BemsMonitoringPointInfo()[i].Name()) {
                    isDuplicated = true;
                    break;
                }
            }
            if (!BWA.DataUtil.isValidInputValue(dataModel.Name()))
                return dfd.resolve(false, '저장 혹은 수정 반드시 필수 입력 정보를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)');
            else {
                if (isDuplicated)
                    return dfd.resolve(false, '이미 동일 이름이 존재합니다.');
                else {
                    $.when(BWA.api.post('BemsMonitoringPoint/GetMaxPropertyId', param))
                    .done(function (newPid) {
                        if (newPid > 0) {
                            dataModel.PropertyId(newPid);
                            dfd.resolve(true); // hcLee OK good, (true, false 또는 객체로 리턴가능함) 2015 11 19
                        }
                        else dfd.resolve(false, 'ProprttyId 자동 생성에 실패하였습니다!'); // hcLee OK good, (true, false 또는 객체로 리턴가능함) 2015 11 19
                    });
                    return dfd.promise();
                }
            }
        },

        beforeUpdateDataViewModel: function () {
            var isDuplicated = false;
            for (var i = 0; i < BemsMonitoringPointInfo().length; i++) {
                if (viewModel.dataModel.Name() == BemsMonitoringPointInfo()[i].Name() && RowName() != BemsMonitoringPointInfo()[i].Name()) {
                    isDuplicated = true;
                    break;
                }
            }
            if (!BWA.DataUtil.isValidInputValue(viewModel.dataModel.Name())) {
                utils.toast.show('저장 혹은 수정 반드시 필수 입력 정보를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)', 'error');
                return 0;
            }
            else {
                if (isDuplicated) {
                    utils.toast.show('이미 동일 이름이 존재합니다.', 'error');
                    return 0;
                }
                else
                    return 2;
            }
        }

            //if (!isNewInPopup()) return true;
    });

    function InsertButtonClickAction() {
        
        var isExist = ko.observable(false);
        var item = selectedTreeItem();

        if (item != null && item.depth === FACILITY_DEPTH) {
            facilityDataSource.filter([
                eq('SiteId', BWA.UserInfo.SiteId()),
                'and',
                eq('FacilityTypeId', item.data.FacilityTypeId())
            ]);
            facilityDataSource.load().done(function (result) {
                for (var i = 0; i < result.length; i++) {
                    if (item.data.Name() == result[i].Name()) {
                        isExist(true);
                    }
                }

                if (_.isNull(item) || item.depth !== FACILITY_DEPTH || isExist() === false) {
                    utils.toast.show('관제점을 등록할 시설을 선택하여 주십시오.', 'warning');
                }
                else {
                    viewModel.popupInsertView();
                }
            });
        }
        else {
                utils.toast.show('관제점을 등록할 시설을 선택하여 주십시오.', 'warning');
        }
    }

    viewModel.commandButtonOptions = commandButtonOptions;
    viewModel.handleRemoveSelectedPoints = handleRemoveSelectedPoints;

    popup = viewModel.popup = BWA.Popup.Point.create(viewModel, selectedTreeItem);
    virtualFacilityPopup = viewModel.virtualFacilityPopup = BWA.Popup.VirtualFacility.create(viewModel, selectedTreeItem);

    viewModel.popupInsertButtonOptions = {
        icon: 'add',
        id: 'create',
        title: '관제점등록',
        action: InsertButtonClickAction
    };

    return viewModel;
};