webservices.factory('vatCommonService', ['$http', '$q', '$log', '$location', 'apiConfig', '$translate',
    'enums', 'SweetAlert', 'vatSessionService', 'projectService', 'vatWorkflowService', '$rootScope',
    function ($http, $q, $log, $location, apiConfig, $translate,
        enums, SweetAlert, vatSessionService, projectService, vatWorkflowService, $rootScope) {
    'use strict';
    return {
        sample: function () {
            return $http.get('url', apiConfig.createVat());
        },

        //设置项目状态 + 更新WorkflowTaskLog数据
        //dbName, periodId, status: 设置项目的状态
        //dicKey,isFinished: 设置Task是否完成
        setProjectStatus: function (projectId, periodId, status,dicKey,isFinished) {
            projectService.setProjectStatus(projectId, periodId, status).success(function (or) {
                if (or.result) {
                    $rootScope.$broadcast('statusChanged', { status: status });
                    //记录操作log
//                    if (!_.isNull(dicKey) && !_.isNull(isFinished)) {
//                        vatWorkflowService.setProcessLog(status,dbName, periodId, dicKey, isFinished);
//                    }
                    vatSessionService.project.projectStatusList[periodId] = status;            
                }
                else {
                    SweetAlert.error($translate.instant('SetProjectStatusError'));
                }
            });
        },


        //只更新设置项目状态
        //setProjectStatusSimple: function(dbName, periodId, status){
        //    projectService.setProjectStatus(dbName, periodId, status).success(function (or) {
        //        if (or.result) {
        //            $rootScope.$broadcast('statusChanged', { status: status });                 
        //            vatSessionService.project.projectStatusList[periodId] = status;
        //        }
        //        else {
        //            SweetAlert.error($translate.instant('SetProjectStatusError'));
        //        }
        //    });
        //},

        //导入操作设置项目状态
        //前提状态为未开始 -->  已导入
        //前提状态为已导入及后续状态 -->原状态 
        importSetProjectStatus: function (dbName, periodId, dicKey, isFinished) {
            $log.debug("vatCommonService importSetProjectStatus start.....");
            $log.debug("current status: " + vatSessionService.project.projectStatusList[periodId]);

            var projectStatus = -1;
            if (!_.isUndefined(vatSessionService.project.projectStatusList[periodId])) {
                if (_.isEqual(vatSessionService.project.projectStatusList[periodId], constant.ProjectStatusEnum.UnStarted)) {
                    projectStatus = constant.ProjectStatusEnum.Imported;
                }
                else {

                    projectStatus = vatSessionService.project.projectStatusList[periodId];
                }              
            }

            $log.debug("status before update db: " + projectStatus);
            projectService.setProjectStatus(project.id, periodId, projectStatus, dicKey, isFinished).success(function (or) {
                if (or.result) {             
                    $rootScope.$broadcast('statusChanged', { status: projectStatus });
                    //记录操作log
                    vatWorkflowService.setProcessLog(projectStatus, dbName, periodId, dicKey, isFinished);
                    vatSessionService.project.projectStatusList[periodId] = projectStatus;
                }
                else {
                    SweetAlert.error($translate.instant('SetProjectStatusError'));
                }
            });
        },
      
        //清空操作设置项目状态
        //有导入过任何数据时: 1): 状态>='已生成', 回退到'已生成'  2): < '已生成',回退到已导入; 
        //没有导入过任何数据时:保持原来的项目状态   
        clearProjectStatus: function (dbName, periodId, dicKey, isFinished) {
            projectService.isImportedAnyData(periodId, vatSessionService.project.id).success(function (or) {
                if (or.result) {
                    var projectStatus = -1;
                    if (or.data) {                        
                        projectStatus = vatSessionService.project.projectStatusList[periodId] >= constant.ProjectStatusEnum.Generated
                        ? vatSessionService.project.projectStatusList[periodId] : constant.ProjectStatusEnum.Imported;
                    }
                    else {
                        
                        projectStatus = vatSessionService.project.projectStatusList[periodId] <= constant.ProjectStatusEnum.AccountMapSubmitted
                        ? constant.ProjectStatusEnum.UnStarted : vatSessionService.project.projectStatusList[periodId];
                    }
                    
                    projectService.setProjectStatus(project.id, periodId, projectStatus,dicKey,isFinished).success(function (or) {
                        if (or.result) {
                            $rootScope.$broadcast('statusChanged', { status: projectStatus });
                            //记录操作log
                            vatWorkflowService.setProcessLog(constant.inValidNum,dbName, periodId, dicKey, isFinished);
                            vatSessionService.project.projectStatusList[periodId] = projectStatus;                        
                        }
                        else {
                            SweetAlert.error($translate.instant('SetProjectStatusError'));
                        }
                    });

                }
                else {
                    SweetAlert.error($translate.instant('SetProjectStatusError'));
                }
            });
        },

        //清空操作设施项目状态
        //清空所有当月导入数据:未开始;
        //否则: 1)前提状态为已导入-->已导入; 2) 前提状态为已对应、已生成--> 已对应
        clearDataSetProjectStatus: function (dbName, periodId, dicKey, isFinished) {
            projectService.isImportedAnyData(periodId, vatSessionService.project.id).success(function (or) {
                if (or.result) {
                    var projectStatus = -1;
                    if (or.data) {
                        if (!_.isUndefined(vatSessionService.project.projectStatusList[periodId])) {
                            if (_.isEqual(vatSessionService.project.projectStatusList[periodId], constant.ProjectStatusEnum.Imported)) {
                                projectStatus = constant.ProjectStatusEnum.Imported;
                            }

                            if (_.isEqual(vatSessionService.project.projectStatusList[periodId], constant.ProjectStatusEnum.AccountMapSubmitted)
                                  || _.isEqual(vatSessionService.project.projectStatusList[periodId], constant.ProjectStatusEnum.Generated)) {

                                projectStatus = constant.ProjectStatusEnum.AccountMapSubmitted;
                            }
                        }
                    }
                    else {
                        if (!_.isUndefined(vatSessionService.project.projectStatusList[periodId])) {
                            projectStatus = constant.ProjectStatusEnum.UnStarted;
                        }
                    }

                    projectService.setProjectStatus(project.id, periodId, projectStatus).success(function (or) {
                        if (or.result) {
                            $rootScope.$broadcast('statusChanged', { status: projectStatus });
                            //记录操作log
                            vatWorkflowService.setProcessLog(dbName, periodId, dicKey, isFinished);
                            vatSessionService.project.projectStatusList[periodId] = projectStatus;
                        }
                        else {
                            SweetAlert.error($translate.instant('SetProjectStatusError'));
                        }
                    });
                }
                else {
                    SweetAlert.error($translate.instant('SetProjectStatusError'));
                }
            });
        },


        //清空操作设施项目状态
        //清空所有当月导入数据时,状态变为:未开始; 否则:状态为已导入     
        clearDataSetProjectStatusSimple: function (dbName, periodId, dicKey, isFinished) {
            projectService.isImportedAnyData(periodId, vatSessionService.project.id).success(function (or) {
                if (or.result) {
                    var projectStatus = -1;
                    if (or.data) {
                        projectStatus = constant.ProjectStatusEnum.Imported;
                    }
                    else {
                        projectStatus = constant.ProjectStatusEnum.UnStarted;
                    }


                    projectService.setProjectStatus(project.id, periodId, projectStatus).success(function (or) {
                        if (or.result) {
                            $rootScope.$broadcast('statusChanged', { status: projectStatus });
                            //记录操作log
                            vatWorkflowService.setProcessLog(projectStatus, dbName, periodId, dicKey, isFinished);
                            vatSessionService.project.projectStatusList[periodId] = projectStatus;
                        }
                        else {
                            SweetAlert.error($translate.instant('SetProjectStatusError'));
                        }
                    });

                }
                else {
                    SweetAlert.error($translate.instant('SetProjectStatusError'));
                }
            });
        },

        //页面中导入、清除数据后,设置vatSessionService.project.importSubStatus子状态
        setImportSubStatus: function (statusId,isImported) {
            if (_.isEqual(enums.VatImportSubStatus.isAdjustImport, statusId)) {
                vatSessionService.project.importSubStatus.isAdjustImport = isImported;
            }
            
            if (_.isEqual(enums.VatImportSubStatus.isCustomInvoiceImport, statusId)) {
                vatSessionService.project.importSubStatus.isCustomInvoiceImport = isImported;
            }

            if (_.isEqual(enums.VatImportSubStatus.isEntryImport, statusId)) {
                vatSessionService.project.importSubStatus.isEntryImport = isImported;
            }

            if (_.isEqual(enums.VatImportSubStatus.isErpImport, statusId)) {
                vatSessionService.project.importSubStatus.isErpImport = isImported;
            }

            if (_.isEqual(enums.VatImportSubStatus.isInputInvoiceImport, statusId)) {
                vatSessionService.project.importSubStatus.isInputInvoiceImport = isImported;
            }

            if (_.isEqual(enums.VatImportSubStatus.isInvoiceMapImport, statusId)) {
                vatSessionService.project.importSubStatus.isInvoiceMapImport = isImported;
            }

            if (_.isEqual(enums.VatImportSubStatus.isOutputInvoiceImport, statusId)) {
                vatSessionService.project.importSubStatus.isOutputInvoiceImport = isImported;
            }

            if (_.isEqual(enums.VatImportSubStatus.isTbImport, statusId)) {
                vatSessionService.project.importSubStatus.isTbImport = isImported;
            }

            if (_.isEqual(enums.VatImportSubStatus.isVoucherMapImport, statusId)) {
                vatSessionService.project.importSubStatus.isVoucherMapImport = isImported;
            }
        },


        getProjectStautsEnumDesc: function (status) {
            switch (status) {
                case constant.ProjectStatusEnum.UnStarted:
                    return $translate.instant('ProjectStatusUnStarted');
                case constant.ProjectStatusEnum.Imported:
                    return $translate.instant('ProjectStatusImported');
                case constant.ProjectStatusEnum.AccountMapSubmitted:
                    return $translate.instant('ProjectStatusAcccountMapSubmitted');
                case constant.ProjectStatusEnum.Generated:
                    return $translate.instant('ProjectStatusGenerated');
                case constant.ProjectStatusEnum.ReportSubmitted:
                    return $translate.instant('ProjectStatusReportSubmitted');
                case constant.ProjectStatusEnum.ReportApproved:
                    return $translate.instant('ProjectStatusReportApproved');
                case constant.ProjectStatusEnum.ReportRejected:
                    return $translate.instant('ProjectStatusReportRejected');
                case constant.ProjectStatusEnum.Completed:
                    return $translate.instant('ProejctStatusCompleted');
                default:
                    return 'todo';
            }       
        },


        //获取当前登录用户在'报表审核'节点中有几级审批
        getLoginUserApproveReportLevels: function () {
            var wf = vatSessionService.project.workflow;        
            var approveLevel = []; //存放登录用户具有的审批层级
            var approveReprotNode = _.where(wf.workflowNodeList, { dictionaryKey: constant.DictionaryDictKey.ApproveReport })[0];
            if (!_.isNull(approveReprotNode) && !_.isUndefined(approveReprotNode)) {
                approveReprotNode.auditReportLevelList.forEach(function (item, index) {
                    var userList = _.where(item.userDetailList, { userId: vatSessionService.logUser.id });
                    if (userList.length > 0) {
                        approveLevel.push(item.orderIndex);
                    }
                });
            }
            return approveLevel;           
        },


        //获取当前登录用户在当前'报表审核'的审批
        getLoginUserCurrentApproveReportLevel: function () {
            var wf = vatSessionService.project.workflow;        
            var approveReprotNode = _.where(wf.workflowNodeList, { dictionaryKey: constant.DictionaryDictKey.ApproveReport })[0];
            if (!_.isNull(approveReprotNode) && !_.isUndefined(approveReprotNode)) {
                return approveReprotNode.currentApproveLevel;
            }                     
        },


        //判断报表审核中上个level是否审核通过
        //ctOrderIndex: 当前审批层级的OrderIndex
        isReportLastLevelApproved: function (ctOrderIndex) {
            var wf = vatSessionService.project.workflow;      
            var approveReprotNode = _.where(wf.workflowNodeList, { dictionaryKey: constant.DictionaryDictKey.ApproveReport })[0];
            if (ctOrderIndex === 0 || ctOrderIndex === 1) { //审批第一级时,总是返回true
                return true;
            }
            else {
                var lastLevel = _.where(approveReprotNode.auditReportLevelList, { orderIndex: ctOrderIndex - 1 })[0];
                if (!_.isNull(lastLevel) && !_.isUndefined(lastLevel)) {
                    return lastLevel.isDone;
                }
            }
                               
        },


        //判断报表审核的上个节点是否完成
        isPreviousNodeFinished: function (dicKey, wf) {
            var result = false;
            var crtNode = _.where(wf.workflowNodeList,{dictionaryKey: dicKey})[0];
            if(!_.isNull(crtNode) && !_.isUndefined(crtNode)){
                var previousNode = _.where(wf.workflowNodeList, { orderIndex: crtNode.orderIndex - 1 })[0];
                result = !_.isNull(previousNode) && !_.isUndefined(previousNode)
                                 ? previousNode.isDone : crtNode.isDone; //previousNode == null说明ViewReport是第一个节点
            }

            return result;
        },

        //数据导入,数据预览,数据整理layout: vat-import-layout.ctl.js
        isLayoutMenuShow: function (dbName, month, nodeDicKeyValue, linkShort, menus) {
            $log.debug("start to isLayoutMenuShow");
            $q.all([vatWorkflowService.getWorkflowDetailByDb(dbName, month)]).then(function (result) {
                var wfData = result[0].data;
                if (wfData.result) {
                    var wf = wfData.data;
                    if (_.isNull(wf) || _.isUndefined(wf)) {//当前项目没有配置workflow,就忽略workflow的配置,全部显示
                        $.each(menus, function (index, m) { m.show = true; });
                    }
                    else {
                        var wfNodesList = wf.workflowNodeList;          
                        var nodeDto = _.where(wfNodesList, { dictionaryKey: constant.DictionaryDictKey[nodeDicKeyValue] })[0];
                        if (!_.isNull(nodeDto) && !_.isUndefined(nodeDto)) {
                            if (nodeDto.isActive === false) { //Node不可用,全部隐藏
                                $.each(menus, function (index, m) { m.show = false; });
                            }
                            else {
                                var taskMenus = [];//存放已经处理过的menu name
                                $.each(nodeDto.workflowTaskList, function (index, item) {
                                    var menu = _.where(menus, { name: enums.dictionaryKeyMenusMap[item.dictionaryKey] })[0];
                                    if (!_.isNull(menu) && !_.isUndefined(menu)) {
                                        menu.show = item.isActive;
                                        taskMenus.push(menu.name);
                                    }
                                });

                                //没有配置过的Task对应的menu需要隐藏
                                $.each(menus, function (index, item) {
                                    var findResult = _.find(taskMenus, function (n) {
                                        return _.isEqual(n, item.name);
                                    });

                                    if (!findResult) {
                                        item.show = false;
                                    }
                                });
                            }

                            //上一个节点未完成的话,弹出提示框
                            var lastNodeDto = _.where(wfNodesList, { orderIndex: nodeDto.orderIndex - 1 })[0];
                            if (!_.isNull(lastNodeDto) && !_.isUndefined(lastNodeDto)) {
                                //debug: only for debug
                                //lastNodeDto.isDone = false;
                                if (!lastNodeDto.isDone) {
                                    SweetAlert.warning($translate.instant('LastNodeIsNotFinished'));
                                }
                            }
                        }
                        else {

                            $log.debug("nodeDto is undefined");
                        }
                    }
                }
            });
                   
            $log.debug("menus before return");
            $log.debug(menus);
            return menus;
        },

    
        isViewReportBtShow: function (wf, buttonStatus) {
            var viewReportNode = _.where(wf.workflowNodeList, { dictionaryKey: constant.DictionaryDictKey.ViewReport })[0];         
            if (!_.isNull(viewReportNode) && !_.isUndefined(viewReportNode)) {
                var reportPreviewNode = _.where(wf.workflowNodeList, { orderIndex: viewReportNode.orderIndex - 1 })[0];
                var isPreveiwNodeDone = !_.isNull(reportPreviewNode) ? reportPreviewNode.isDone : viewReportNode.isDone; //reportPreviewNode == null说明ViewReport是第一个节点         
                var submitTask = _.where(viewReportNode.workflowTaskList, { dictionaryKey: constant.DictionaryDictKey.WFSubmitReport })[0];
                if (!_.isNull(submitTask) && !_.isUndefined(submitTask)) {
                    buttonStatus.viewReportBtShow = isPreveiwNodeDone && submitTask.isActive && !submitTask.isDone;
                }
                else {//没有配置“提交审核”任务
                    buttonStatus.viewReportBtShow = false;
                }                             
            }
            else {//没有配置“查看报表”节点
                buttonStatus.viewReportBtShow = false;
            }

            return buttonStatus;
        },


        isApproveReportBtShow: function (wf, buttonStatus) {
            var viewReportNode = _.where(wf.workflowNodeList, { dictionaryKey: constant.DictionaryDictKey.ViewReport })[0];
            var approveReportNode = _.where(wf.workflowNodeList, { dictionaryKey: constant.DictionaryDictKey.ApproveReport })[0];      
            if (!_.isNull(approveReportNode) && !_.isUndefined(approveReportNode)) {
                var approveTask = _.where(approveReportNode.workflowTaskList, { dictionaryKey: constant.DictionaryDictKey.WFReportApproval })[0];
                var currentApproveLevel = approveReportNode.currentApproveLevel; //项目当前所在的审批层级
                var approveLevelUsers = _.where(approveReportNode.auditReportLevelList, { orderIndex: currentApproveLevel })[0].userDetailList; //当前审批层级的审核人
                var userHasApproveAuth = _.where(approveLevelUsers, { userId: vatSessionService.logUser.id })[0]; //登录用户是否在审核人之中
                var isUserHasApproveAuth = !_.isNull(userHasApproveAuth) && !_.isUndefined(userHasApproveAuth) ? true : false;
           
                if (!_.isNull(approveTask) && !_.isUndefined(approveTask)) {

                    if (!_.isNull(viewReportNode) && !_.isUndefined(viewReportNode)) { //配置了上一节点“查看报表”节点

                        buttonStatus.approveReportBtShow = viewReportNode.isDone && approveTask.isActive && !approveTask.isDone && isUserHasApproveAuth;
                    }
                    else { //没有配置上一节点“提交审核”任务
                        buttonStatus.approveReportBtShow = approveTask.isActive && !approveTask.isDone && isUserHasApproveAuth;
                    }
                }
                else {//没有配置“报表审核”Task
                    buttonStatus.approveReportBtShow = false;
                }

            }
            else { //没有配置“报表审核”节点
                buttonStatus.approveReportBtShow = false;
            }

            return buttonStatus;
        },


        isDeclarationComplete: function (wf, buttonStatus) {
            var approveReportNode = _.where(wf.workflowNodeList, { dictionaryKey: constant.DictionaryDictKey.ApproveReport })[0];
            var decCompleteNode = _.where(wf.workflowNodeList, { dictionaryKey: constant.DictionaryDictKey.DeclarationComplete })[0];

            if (!_.isNull(decCompleteNode) && !_.isUndefined(decCompleteNode)) {
                var decCompleteTask = _.where(decCompleteNode.workflowTaskList, { dictionaryKey: constant.DictionaryDictKey.WFDeclarationComplete })[0];
                var uploadCertifiTask = _.where(decCompleteNode.workflowTaskList, { dictionaryKey: constant.DictionaryDictKey.WFUploadCertificate })[0];

                //“完成申报”Task
                if (!_.isNull(decCompleteTask) && !_.isUndefined(decCompleteTask)) {

                    if (!_.isNull(approveReportNode) && !_.isUndefined(approveReportNode)) { //配置了上一节点“报表审核”

                        buttonStatus.decCompleteBtShow = approveReportNode.isDone && decCompleteTask.isActive && !decCompleteTask.isDone;
                    }
                    else {//没有配置上一节点“报表审核”
                        buttonStatus.decCompleteBtShow = decCompleteTask.isActive && !decCompleteTask.isDone;
                    }
                }
                else {//没有配置“完成申报”Task
                    buttonStatus.decCompleteBtShow = false;
                }


                //“上传凭证”Task
                if (!_.isNull(uploadCertifiTask) && !_.isUndefined(uploadCertifiTask)) {

                    if (!_.isNull(approveReportNode) && !_.isUndefined(approveReportNode)) { //配置了上一节点“报表审核”

                        buttonStatus.uploadCerficateBtShow = approveReportNode.isDone && uploadCertifiTask.isActive && !uploadCertifiTask.isDone;
                    }
                    else {//没有配置上一节点“报表审核”
                        buttonStatus.uploadCerficateBtShow = uploadCertifiTask.isActive && !uploadCertifiTask.isDone;
                    }

                }
                else {
                    buttonStatus.uploadCerficateBtShow = false;
                }


            }
            else { //没有配置“完成申报”节点
                buttonStatus.decCompleteBtShow = false;
                buttonStatus.uploadCerficateBtShow = false;
            }

            return buttonStatus;
        },



    };
}]);