vatDashboardModule.controller('SummaryDashboardConfigController', ['$scope', '$log', '$translate', '$timeout', '$q', '$interval',
    'apiInterceptor', 'Upload', 'vatImportService', 'SweetAlert', 'uiGridConstants', 'vatSessionService', 'enums', 'vatOperationLogService',
    'projectService', 'vatCommonService', 'vatDashboardService', 'indexAnalysisDetailService', '$stateParams', '$state',
function ($scope, $log, $translate, $timeout, $q, $interval, apiInterceptor, Upload, vatImportService, SweetAlert, uiGridConstants,
    vatSessionService, enums, vatOperationLogService, projectService, vatCommonService, vatDashboardService, indexAnalysisDetailService,
    $stateParams, $state) {
    'use strict';

    $scope.config = {
        id: '',
        chartName: '',
        modelItems: [],
        analysisItems: [],
        isShowData: 0,
        isShowGrid: 0
    };

    if (!_.isEmpty(vatSessionService.querySummayDashboardModel)) {
        if (!_.isEmpty(vatSessionService.querySummayDashboardModel.organizationIDList)) {
            $scope.selectedOrganizes = vatSessionService.querySummayDashboardModel.organizationIDList;
            $scope.selectedOrgIds = vatSessionService.querySummayDashboardModel.organizationIDList.join(',');
        }
        else {
            $scope.selectedOrganizes = [];
            $scope.selectedOrgIds = '';
        }

        $scope.filterYear = vatSessionService.querySummayDashboardModel.year;
        $scope.filterPeriod = vatSessionService.querySummayDashboardModel.period;
    }
    else {
        $scope.selectedOrganizes = [];
        $scope.selectedOrgIds = '';
        $scope.filterYear = 0;
        $scope.filterPeriod = 0;
    }

    $scope.chartRenderOption = {
        id: '',
        name: '',
        isShowData: $scope.config.isShowData,
        header: { v1: $translate.instant('OrgName') },
        headerObj: [{ name: $translate.instant('OrgName'), dataType: 1, chartType: 'line' }],
        data: []
    };

    //图表名称text box option
    $scope.chartNameOption = {
        width: 280,
        placeholder: $translate.instant('PleaseInputChartName'),
        bindingOptions: {
            value: 'config.chartName'
        }
    }

    //获取指定指标的二级分析指标
    $scope.subModelDataList = [];
    var getSubModelList = function () {
        vatDashboardService.getSubModelList($scope.filterYear, $scope.filterPeriod).success(function (result) {
            if (result && result.data && result.data.length > 0) {
                $scope.subModelDataList = result.data;
            }
        });
    };

    //添加分析指标下拉树控件
    $scope.selectIdList = [];
    var syncTreeViewSelection = function () {
        if ($scope.treeView) {
            $scope.fromSyncSelection = true;
            if (!$scope.selectIdList || $scope.selectIdList.length === 0) {
                $scope.treeView.unselectAll();
                $scope.fromSyncSelection = false;
                return;
            }

            $scope.selectIdList.forEach(function (key) {
                $scope.treeView.selectItem(key);
            });

            _.each($scope.indexList, function (item) {
                if (!_.contains($scope.selectIdList, item.id) && item.parentId) {
                    $scope.treeView.unselectItem(item.id);
                }
            });

            $scope.fromSyncSelection = false;
        }
    };

    $scope.indexList = [];
    $scope.treeView = null;

    $scope.multiSelectAnalysisOptionHeight = 300;
    $scope.multiSelectAnalysisOption = {
        width: 280,
        valueExpr: "name",
        displayExpr: "name",
        showClearButton: true,
        bindingOptions: {
            value: 'selectNameList',
            dataSource: 'indexList'
        },
        onValueChanged: function (args) {
            if (!args.value) {
                $scope.selectIdList = [];
            }
        },
        treeView: {
            bindingOptions: {
                dataSource: 'indexList',
                searchValue: 'searchText',
                height: 'multiSelectAnalysisOptionHeight'
            },
            dataStructure: "plain",
            keyExpr: "id",
            parentIdExpr: "parentId",
            selectionMode: "multiple",
            displayExpr: "name",
            selectByClick: true,
            selectNodesRecursive: true,
            showCheckBoxesMode: "normal",
            onContentReady: function (e) {
                $scope.treeView = e.component;
            },
            onItemSelectionChanged: function (args) {
                if (!$scope.fromSyncSelection) {
                    var value = args.component.getSelectedNodesKeys();
                    $scope.selectIdList = value;
                    $scope.selectNameList = _.filter($scope.indexList, function (nameItem) {
                        return _.contains($scope.selectIdList, nameItem.id) && nameItem.parentId;
                    });

                    $scope.riskDataSource = [];
                    _.each($scope.selectNameList, function (nameItem) {
                        var parentNode = _.where($scope.indexList, { id: nameItem.parentId })[0];
                        if (_.where($scope.riskDataSource, { id: parentNode.id }).length < 1) {
                            if (_.contains($scope.selectRiskIdList, parentNode.id)) {
                                $scope.riskDataSource.push({ id: parentNode.id, name: parentNode.name, selected: true });
                            } else {
                                $scope.riskDataSource.push({ id: parentNode.id, name: parentNode.name, selected: false });
                            }
                        }
                    });

                    $scope.selectRiskIdList = _.filter($scope.selectRiskIdList, function (riskId) {
                        return _.where($scope.riskDataSource, { id: riskId }).length > 0;
                    });

                    $scope.selectNameList = _.map($scope.selectNameList, function (item) {
                        return item.name;
                    });
                }
            }
        }
    };


    $scope.riskDataSource = [];
    $scope.selectRiskNameList = [];
    $scope.selectRiskIdList = [];
    //风险提示Options
    $scope.riskTipMultiSelectAnalysisOption = {
        width: 280,
        valueExpr: "id",
        displayExpr: "name",
        showClearButton: true,
        contentTemplate: 'riskContent',
        bindingOptions: {
            dataSource: 'riskDataSource',
            value: 'selectRiskIdList'

        },
        onValueChanged: function (args) {
            if (!args.value) {
                $scope.selectRiskIdList = [];
            }
        },
        treeView: {
            bindingOptions: {
                dataSource: 'riskDataSource'
            },
            height: 300,
            dataStructure: "plain",
            keyExpr: "id",
            selectionMode: "multiple",
            displayExpr: "name",
            selectByClick: true,
            selectNodesRecursive: true,
            showCheckBoxesMode: "normal",
            onContentReady: function (e) {
                var riskTree = $('#riskTipTree').dxTreeView('instance');
                _.each($scope.riskDataSource, function (nameItem) {
                    if (_.contains($scope.selectRiskIdList, nameItem.id)) {
                        riskTree.selectItem(nameItem.id);
                    } else {
                        riskTree.unselectItem(nameItem.id);
                    }
                    return nameItem;
                });
            },
            onItemSelectionChanged: function (args) {
                var value = args.component.getSelectedNodesKeys();
                $scope.selectRiskIdList = value;
                $scope.selectRiskNameList = _.filter($scope.riskDataSource, function (nameItem) {
                    return _.contains($scope.selectRiskIdList, nameItem.id);
                });
                $scope.selectRiskNameList = _.map($scope.selectRiskNameList, function (item) {
                    return item.name;
                });
            }
        }
    };

    $scope.$watch('selectRiskIdList', function () {
        var riskTree = $('#riskTipTree').dxTreeView('instance');
        if (riskTree) {
            _.each($scope.riskDataSource, function (nameItem) {
                if (_.contains($scope.selectRiskIdList, nameItem.id)) {
                    riskTree.selectItem(nameItem.id);
                } else {
                    riskTree.unselectItem(nameItem.id);
                }
                return nameItem;
            });
        }
    });

    //删除分析指标
    var removeAnalysisItem = function (item) {
        $scope.config.analysisItems = _.filter($scope.config.analysisItems, function (analysisItem) {
            return analysisItem.id != item.id;
        });
        $scope.selectIdList = _.filter($scope.selectIdList, function (indexItem) {
            return indexItem != item.id;
        });
    };

    //保存指标配置
    var internalSaveConfig = function (data) {
        vatDashboardService.saveSummaryConfig(data).success(function () {
            $state.go('summaryDashboard');
        });
    };

    var saveDashboardConfig = function () {
        if ($scope.config.analysisItems.length < 1) {
            SweetAlert.warning($translate.instant('DeleteMeasureAlert'));
            return;
        }
        if (!$scope.config.chartName) {
            SweetAlert.warning($translate.instant('checkChartName'));
            return;
        }

        var indexIds = '';
        var indexIdArr = [];
        var userSetting = '';
        var userSettingArr = [{ name: $translate.instant('OrgName'), dataType: 1, chartType: 'line' }];

        _.each($scope.config.analysisItems, function (item) {
            indexIdArr.push(item.id);
            userSettingArr.push({ name: item.analysisName, dataType: item.dataType, chartType: item.chartType });
        });
        indexIds = indexIdArr.join(',');
        userSetting = JSON.stringify(userSettingArr);

        var data = {};
        data.ID = $scope.config.id;
        data.name = $scope.config.chartName;
        data.indexIDs = indexIds;
        data.userSetting = userSetting;
        data.isShowData = $scope.config.isShowData;
        data.isShowGrid = $scope.config.isShowGrid;
        data.riskTip = $scope.selectRiskIdList.join(',');
        data.orderIndex = 4;
        $scope.internalSaveConfig(data);
    };

    //取消保存
    var cancelConfig = function () {
        $state.go('summaryDashboard');
    };

    //删除图表
    //var deleteChartConfig = function () {
    //    SweetAlert.swal({
    //        title: $translate.instant('ConfirmDelete'),
    //        text: $translate.instant('deleteChart') + "?",
    //        type: "warning",
    //        showCancelButton: true,
    //        confirmButtonColor: "#DD6B55",
    //        confirmButtonText: $translate.instant('Confirm'),
    //        cancelButtonText: $translate.instant('Cancel'),
    //        closeOnConfirm: true
    //    }, function (isConfirm) {
    //        if (isConfirm) {
    //            vatDashboardService.deleteChartConfig($scope.config.id).success(function () {
    //                SweetAlert.success($translate.instant('DeleteSuccess'));
    //                $state.go('summaryDashboard');
    //            });
    //        }
    //    });
    //};

    $scope.chartChanged = true;
    var setAnalysisItems = function () {

        $scope.config.analysisItems = _.filter($scope.config.analysisItems, function (item) {
            return _.contains($scope.selectIdList, item.id);
        });

        _.each($scope.selectIdList, function (selectIndexItem) {
            _.each($scope.subModelDataList, function (item) {
                if (selectIndexItem === item.id && _.where($scope.config.analysisItems, { id: selectIndexItem }).length === 0) {
                    //添加分析指标
                    var obj = new Object();
                    obj.id = item.id;
                    obj.analysisName = item.indexName;
                    obj.dataType = item.dataType;
                    obj.chartType = 'bar';
                    obj.chartOptions = {
                        items: [
                            { typeName: $translate.instant("barchart"), typeValue: 'bar' },
                            { typeName: $translate.instant("linechart"), typeValue: 'line' },
                            { typeName: $translate.instant("areachart"), typeValue: 'area' },
                            { typeName: $translate.instant("stepchart"), typeValue: 'step' }
                        ],
                        displayExpr: 'typeName',
                        valueExpr: 'typeValue',
                        itemTemplate: 'chartTypeItemTemplate',
                        value: 'bar',
                        onItemClick: function (e) {
                            obj.chartType = e.itemData.typeValue;
                            $scope.chartChanged = !$scope.chartChanged;
                        }
                    };

                    if (!_.isEmpty($scope.indexList)) {
                        var indexItemObj = _.find($scope.indexList, function (indexItem) {
                            return indexItem.id == selectIndexItem;
                        });

                        if (!_.isEmpty(indexItemObj)) {
                            obj.index = indexItemObj.orderIndex;
                        }
                    }

                    $scope.config.analysisItems.push(obj);
                }
            })
        });

        //对分析指标排序,使分析指标顺序与指标列表中一致。
        $scope.config.analysisItems = _.sortBy($scope.config.analysisItems, 'index');
    };

    var getModel = function () {
        //获取指标汇总配置
        var modelPromise;
        if (!_.isEmpty($scope.model)) {
            modelPromise = $q.when($scope.model);
        }
        else if ($stateParams.id) {
            $scope.config.id = $stateParams.id;
            modelPromise = vatDashboardService.getDashboardConfigSummary($scope.config.id).then(function (result) {
                if (result && result.data && result.data.data) {
                    return $q.when(result.data.data);
                }
                else {
                    return $q.reject();
                }
            });
        }
        else {
            modelPromise = $q.reject();
        }

        modelPromise.then(function (result) {
            if (result) {
                if (_.isEmpty($scope.model)) {
                    $scope.model = result;
                }

                var selectedAnalysisItems = JSON.parse(result.userSetting);
                selectedAnalysisItems.splice(0, 1);
                var ids = result.indexIDs.split(',');
                $scope.selectedIndexIds = result.indexIDs;
                $scope.config.analysisItems.length = 0;
                _.each(ids, function (id, index) {
                    //添加分析指标
                    var obj = new Object();
                    obj.id = id;
                    obj.analysisName = selectedAnalysisItems[index].name;
                    obj.dataType = selectedAnalysisItems[index].dataType;
                    obj.chartType = selectedAnalysisItems[index].chartType;
                    obj.chartOptions = {
                        items: [
                            { typeName: $translate.instant("barchart"), typeValue: 'bar' },
                            { typeName: $translate.instant("linechart"), typeValue: 'line' },
                            { typeName: $translate.instant("areachart"), typeValue: 'area' },
                            { typeName: $translate.instant("stepchart"), typeValue: 'step' }
                        ],
                        displayExpr: 'typeName',
                        valueExpr: 'typeValue',
                        itemTemplate: 'chartTypeItemTemplate',
                        value: obj.chartType,
                        onItemClick: function (e) {
                            obj.chartType = e.itemData.typeValue;
                            $scope.chartChanged = {};
                        }
                    };
                    $scope.config.analysisItems.push(obj);
                });

                if (result.indexIDs && ids.length > 0) {
                    $scope.selectIdList = ids;
                }

                var riskTipIds = result.riskTip ? result.riskTip.split(',') : null;
                if (riskTipIds && riskTipIds.length > 0) {
                    $scope.selectRiskIdList = riskTipIds;
                }

                $scope.config.selectedModelId = result.modelID;
                $scope.config.chartName = result.name;
                $scope.config.isShowData = result.isShowData;
                $scope.config.isShowGrid = result.isShowGrid ? result.isShowGrid : 0;
            }
        });
    };

    //设置分析指标下拉框的显示值
    $scope.$watchGroup(['selectIdList', 'indexList', 'treeView'], function (newItems, oldItems) {
        if (newItems[1].length > 0) {
            $scope.selectNameList = _.filter($scope.indexList, function (nameItem) {
                return _.contains($scope.selectIdList, nameItem.id) && nameItem.parentId;
            });

            $scope.riskDataSource = [];
            _.each($scope.selectNameList, function (nameItem) {
                var parentNode = _.where($scope.indexList, { id: nameItem.parentId })[0];
                if (_.where($scope.riskDataSource, { id: parentNode.id }).length < 1) {
                    if (_.contains($scope.selectRiskIdList, parentNode.id)) {
                        $scope.riskDataSource.push({ id: parentNode.id, name: parentNode.name, selected: true });
                    } else {
                        $scope.riskDataSource.push({ id: parentNode.id, name: parentNode.name, selected: false });
                    }
                }
            });

            $scope.selectRiskIdList = _.filter($scope.selectRiskIdList, function (riskId) {
                return _.where($scope.riskDataSource, { id: riskId }).length > 0;
            });

            $scope.selectNameList = _.map($scope.selectNameList, function (item) {
                return item.name;
            });
        }
        syncTreeViewSelection();

    });

    //分析指标根据选中的指标变化
    $scope.$watchGroup(['selectIdList', 'subModelDataList', 'indexList'], function () {
        setAnalysisItems();
    });

    // 如果直接传入model,则在model有值后触发设置操作
    $scope.$watch('model', function (newVal, oldVal) {
        if (!_.isEmpty(newVal)) {
            getModel();
        }
    });

    // 如果直接传入外部数据源,则在有值后更新这些数据源
    $scope.$watch('externalDataSource', function (newVal, oldVal) {
        if (!_.isEmpty(newVal)) {
            if (!_.isEmpty(newVal.orgIds)) {
                $scope.selectedOrganizes = newVal.orgIds;
                $scope.selectedOrgIds = newVal.orgIds.join(',');
            }

            if (_.isFunction(newVal.onSave)) {
                $scope.internalSaveConfig = newVal.onSave;
            }

            if (_.isFunction(newVal.onCancel)) {
                $scope.cancelConfig = newVal.onCancel;
            }
        }
    }, true);

    //分析指标配置变动联动图表
    $scope.$watchGroup(['config.analysisItems.length', 'subModelDataList.length', 'selectedOrganizes.length', 'chartChanged', 'config.isShowData'], function (newItems, oldItems) {
        if (newItems[0] > 0 && newItems[1] > 0) {
            var obj = {
                id: $scope.config.id,
                name: $scope.config.chartName,
                isShowData: $scope.config.isShowData,
                header: { v1: $translate.instant('OrgName') },
                headerObj: [{ name: $translate.instant('OrgName'), dataType: 1, chartType: 'line' }],
                data: [],
                noChartMsg: $translate.instant('PleaseAddMeasuresRight')
            };

            for (var key in obj.header) {
                if (key != "v1") {
                    delete obj.header[key];
                }
            }
            var org = obj.headerObj.pop();
            obj.headerObj = [org];

            _.each($scope.config.analysisItems, function (value, index) {
                obj.header['v' + (index + 2)] = value.analysisName;
                obj.headerObj.push({ name: value.analysisName, dataType: value.dataType, chartType: value.chartType });
            });

            obj.data = [];
            _.each($scope.selectedOrganizes, function (orgItem) {
                var flag = false;
                var orgModelObj = { v0: '', v1: '' };
                if ($scope.config.analysisItems.length > 0 && $scope.subModelDataList.length > 0) {
                    _.each($scope.config.analysisItems, function (value, index) {
                        orgModelObj['v' + (index + 2)] = 0;
                        _.chain($scope.subModelDataList).where({ organizationID: orgItem, flag: true }).each(function (itemData) {
                            if (itemData.id === value.id) {
                                orgModelObj['v' + (index + 2)] = parseFloat(itemData.data ? itemData.data : 0);
                                if (!flag) {
                                    orgModelObj['v0'] = itemData.organizationID;
                                    orgModelObj['v1'] = itemData.organizationName;
                                    flag = true;
                                }
                            }
                        }).value();
                    });
                }
                if (flag) {
                    obj.data.push(orgModelObj);
                }
            });

            $scope.chartRenderOption = obj;
        } else {
            $scope.chartRenderOption = { noChartMsg: $translate.instant('PleaseAddMeasuresRight') };
        }

        //showChartTipInfo();
    });

    (function initialize() {
        //获取所有指标信息
        indexAnalysisDetailService.getIndexAnalysisDropDownList().success(function (data) {
            var dataOrder = 0;
            data = _.map(data, function (item) {
                item.orderIndex = dataOrder;
                dataOrder++;
                return item;
            });
            $scope.indexList = data;

            $scope.multiSelectAnalysisOptionHeight = 300;
            if ($scope.indexList && $scope.indexList.length <= 15) {
                $scope.multiSelectAnalysisOptionHeight = 20 * $scope.indexList.length;
            }
        });

        getSubModelList();

        $scope.removeAnalysisItem = removeAnalysisItem;
        $scope.internalSaveConfig = internalSaveConfig;
        $scope.saveDashboardConfig = saveDashboardConfig;
        $scope.cancelConfig = cancelConfig;
        //$scope.deleteChartConfig = deleteChartConfig;

        getModel();
    })();
}
]);