webservices.factory('vatReportService', ['$q', '$log', '$http', '$translate', 'apiConfig', 'enums', 'SweetAlert', 'vatOperationLogService',
    'vatSessionService', 'FileSaver',
    function ($q, $log, $http, $translate, apiConfig, enums, SweetAlert, vatOperationLogService, vatSessionService, FileSaver) {
        'use strict';
        $log.debug('vatReportService.ctor()...');
        return {

            // 修改保存机制后,需要添加缓存机制的方法:
            // addCellManualData,并添加了一个日志参数
            // deleteCellVoucher
            // deleteCellInvoice
            // deleteCellDatasource
            // addDataSource
            // addDataSourceItems
            // updateDataSourceAmount
            // 移除了CalculateSingleCellFormula
            // 新增了updateReportCellValue


            // For CIT:
            // 新增了citGenerateByType


            //CIT Remove(可以直接使用vat已有的):
            //    citGetStdAccountByIndustryID: function (industryID)
            //    citGenerate: function (projectId, templateId, param?, generator)
            //    citGetReportData: function (reportId)
            //    citGetCellVoucher: function (cellDataID)
            //    citGetCellInvoice: function (cellDataID, invoiceType)
            //    citAddCellManualData: function (mauanlData)
            //    citAddDataSource: function (dataSource)
            //    citAddDataSourceItems: function (dataSource)
            //    citDeleteCellVoucher: function (voucherId, datasourceId)
            //    citDeleteCellInvoice: function (invoiceId, datasourceId)
            //    citDeleteCellDatasource: function(datasourceID,cellID)
            //    citGetAllDataItems: function (dataSourceType)
            //    citGetCellAccountRange: function (reportTemplateId, period, rowIndex, columnIndex)
            //    citGetCellTemplateConfig: function (reportTemplateId, period, rowIndex, columnIndex)
            //    citUpdateCellAccountRangeAndSummary: function (cellTemplateId, period?, value, operation)
            //    citUpdateDataSourceAmount: function (datasourceId, amount)
            //CIT Update(带问号参数为修改的参数,目前对于申报表可以直接传null,对于BSPL如果调用到这些API需要传period):
            //    citUpdateConfig: function (projectId, period?)
            //    citGetTemplate: function (projectId, period?)

            updateConfig: function (projectId, ifDeleteManualDataSource, period, generator, isMergeManualDataSource) {
                return $http.post('/Report/updateConfig/' + projectId + '/' + ifDeleteManualDataSource + '/' + period + '?generator=' + generator + '&mergeManual=' + isMergeManualDataSource, {}, apiConfig.createVat({ignoreLoadingBar: true}));
            },
            generate: function (projectId, templateId, ifDeleteManualDataSource, period, generator) {
                return $http.post('/Report/generate/' + projectId + '/' + templateId + '/' + ifDeleteManualDataSource + '/' + period + '?generator=' + generator, {}, apiConfig.createVat({ignoreLoadingBar: true}));
            },
            generateAll: function (projectId, isMergeManualDataSource, period, generator) {
                return $http.post('/Report/generateByTotal/' + projectId + '/' + isMergeManualDataSource + '/' + period + '?generator=' + generator, {}, apiConfig.createVat({ignoreLoadingBar: true}));
            },
            getRunningJob: function (projectId, period) {
                return $http.get('/Report/getRunningJob/' + projectId + '/' + period, apiConfig.createVat());
            },
            getJobStatus: function (projectId, period, jobId) {
                return $http.get('/Report/getJobStatus/' + projectId + '/' + period + '/' + jobId, apiConfig.createVat({ignoreLoadingBar: true}));
            },
            getReportData: function (reportId) {
                return $http.get('/Report/reportData/' + reportId, apiConfig.createVat());
            },
            getReportEbitData: function (orgId, period) {
                var param = {
                    period: period,
                    orgId: orgId
                };
                param = JSON.stringify(param);
                return $http.post('/Report/reportEbitData', param, apiConfig.createVat({contentType: "application/json"}));
            },
            manyExport: function (param) {
                var toParam = JSON.stringify(param);
                return $http.post('/Report/manyExport', toParam, apiConfig.createVat({responseType: 'arraybuffer'})).then(function (response) {
                    if(!response.result){
                        SweetAlert.error(response.resultMsg);
                    }
                    PWC.downloadCallBack(new Blob([response.data], {type: response.headers('Content-Type')}),null, null,param.period + "-汇总利润表.xlsx" );
                });
            }
            ,
            saveAndRefresh: function (orgId, period, specialConsiderations, ebitRate) {
                var paramObj = {
                    orgId: orgId,
                    period: period,
                    specialConsiderations: specialConsiderations,
                    ebitRate: ebitRate
                };
                return $http.post('/Report/saveAndRefresh', paramObj, apiConfig.createVat());
            },
            calculateKeyValue: function (projectId, period) {
                return $http.post('/Report/calculateKeyValue/' + projectId + '/' + period, {}, apiConfig.createVat({ignoreLoadingBar: true}));
            },
            //CalculateSingleCellFormula: function (cellId) {
            //    return $http.get('/Report/formulaDataSource/byCell/' + cellId, apiConfig.createVat());
            //},
            updateReportCellValue: function (cellDataList, reportId, generator) {
                return $http.post('/Report/updateReportCellValue/' + reportId + '?generator=' + generator, cellDataList, apiConfig.createVat());
            },
            getTemplate: function (projectId, serviceType, period) {
                if (!_.isNumber(period)) {
                    period = 0;
                }

                return $http.get('/Report/template/' + projectId + '/' + serviceType + '/' + period, apiConfig.createVat());
            },
            getFilterTemplate: function (projectId, serviceType, period) {
                if (!_.isNumber(period)) {
                    period = 0;
                }

                return $http.get('/Report/filterTemplate/' + projectId + '/' + serviceType + '/' + period, apiConfig.createVat());
            },
            getCellVoucher: function (cellDataID) {
                return $http.get('/Report/cellVoucher/' + cellDataID, apiConfig.createVat());
            },
            getCellInvoice: function (cellDataID, invoiceType) {
                return $http.get('/Report/cellInvoice/' + cellDataID + '/' + invoiceType, apiConfig.createVat());
            },
            addCellManualData: function (manualData, logInfo) {
                return $http.post('/Report/addCellManualData', manualData, apiConfig.createVat()).then(function (data) {
                    logInfo.UpdateState = $translate.instant('ManualInputSuccess');
                    vatOperationLogService.addOperationLog(logInfo);
                    data.dataSourceType = enums.cellDataSourceType.KeyIn;
                    return $q.when(data);
                }, function (data) {
                    logInfo.UpdateState = $translate.instant('ManualInputFail');
                    SweetAlert.error($translate.instant('PleaseContactAdministrator'));
                    return vatOperationLogService.addOperationLog(logInfo);
                });
            },
            deleteCellVoucher: function (voucherId, datasourceId) {
                return $http.post('/Report/deleteCellVoucher/' + voucherId + '/' + datasourceId, {}, apiConfig.createVat());
            },
            deleteCellInvoice: function (invoiceId, datasourceId) {
                return $http.post('/Report/deleteCellInvoice/' + invoiceId + '/' + datasourceId, {}, apiConfig.createVat());
            },
            deleteCellDatasource: function (datasourceID, cellID) {
                return $http.post('/Report/deleteCellDatasource/' + datasourceID + '/' + cellID, {}, apiConfig.createVat());
            },
            getAllDataItems: function (dataSourceType) {
                return $http.get('/Report/getAllDataItems/' + dataSourceType, apiConfig.createVat())
            },
            addDataSource: function (dataSource) {
                return $http.post('/Report/addDataSource', dataSource, apiConfig.createVat());
            },
            addDataSourceItems: function (dataSource) {
                return $http.post('/Report/addDataSourceItems', dataSource, apiConfig.createVat());
            },
            getCellAccountRange: function (reportTemplateId, period, rowIndex, columnIndex) {
                if (!_.isNumber(period)) {
                    period = 0;
                }

                return $http.get('/Report/getCellAccountRange/' + reportTemplateId + '/' + period + '/' + rowIndex + '/' + columnIndex, apiConfig.createVat());
            },
            getCellTemplateConfig: function (reportTemplateId, period, rowIndex, columnIndex) {
                if (!_.isNumber(period)) {
                    period = 0;
                }

                return $http.get('/Report/getCellTemplateConfig/' + reportTemplateId + '/' + period + '/' + rowIndex + '/' + columnIndex, apiConfig.createVat());
            },
            updateCellAccountRangeAndSummary: function (cellTemplateId, period, value, operation) {
                if (!_.isNumber(period)) {
                    period = 0;
                }

                return $http.post('/Report/updateCellAccountRangeAndSummary/' + cellTemplateId + '/' + period + '/' + value + '/' + operation, {}, apiConfig.createVat());
            },
            updateDataSourceAmount: function (datasourceId, amount) {
                return $http.post('/Report/updateDataSourceAmount/' + datasourceId + '/' + amount, {}, apiConfig.createVat());
            },
            getStdAccountByIndustryID: function (industryID) {
                return $http.get('/Report/getStdAccountByIndustry/' + industryID, apiConfig.createVat());
            },
            getTemplateReferences: function (period) {
                return $http.get('/Report/templateReferences/' + period, apiConfig.createVat());
            },
            citTryGenerateDocList: function (projectId, serviceType, generator) {
                return $http.post('/Report/citTryGenerateDocList/' + projectId + '/' + serviceType + '?generator=' + generator, {}, apiConfig.createVat());
            },
            citUpdateConfig: function (projectId, ifDeleteManualDataSource, period, generator) {
                if (!_.isNumber(period)) {
                    period = 0;
                }

                return $http.post('/Report/citUpdateConfig/' + projectId + '/' + ifDeleteManualDataSource + '/' + period + '?generator=' + generator, {}, apiConfig.createVat({ignoreLoadingBar: true}));
            },
            citGeneratePrepay: function (projectId, ifDeleteManualDataSource, period, generator) {
                return $http.post('/Report/citGenerate/byTotal/' + projectId + '/' + ifDeleteManualDataSource + '/' + 0
                    // 暂时将生成预缴表的period设置为0,等待完成新的预缴表生成逻辑 + period
                    + '/' + enums.reportType.prepay
                    + '?generator=' + generator, {}, apiConfig.createVat({ignoreLoadingBar: true}));
            },
            citGenerateByType: function (projectId, ifDeleteManualDataSource, reportType, generator) {
                var paramStr = '';
                if (_.isNumber(reportType)) {
                    paramStr = '/' + reportType;
                }

                return $http.post('/Report/citGenerate/byTotal/' + projectId + '/' + ifDeleteManualDataSource + '/0' + paramStr + '?generator=' + generator, {}, apiConfig.createVat({ignoreLoadingBar: true}));
            },
            citGetTemplate: function (projectId, period) {
                if (!_.isNumber(period)) {
                    period = 0;
                }

                return $http.get('/Report/citTemplate/' + projectId + '/' + period, apiConfig.createVat());
            },
            citGetTemplateTree: function (projectId) {
                return $http.get('/Report/citTemplateTree/' + projectId, apiConfig.createVat());
            },
            vatGetTemplateTree: function (projectId, period, serviceType) {
                return $http.get('/Report/vatTemplateTree/' + projectId + '/' + period + '/' + serviceType, apiConfig.createVat());
            },
            citCalculateKeyValue: function (projectId, reportType) {
                var reportTypeParam = '';
                if (_.isNumber(reportType)) {
                    reportTypeParam = '/' + reportType;
                }

                return $http.post('/Report/citCalculateKeyValue/' + projectId + '/0' + reportTypeParam, {}, apiConfig.createVat({ignoreLoadingBar: true}));
            },
            getReportByTemplateId: function (templateId, period) {
                if (!_.isNumber(period)) {
                    period = 0;
                }
                return $http.get('/Report/report/' + templateId + '/' + period, apiConfig.createVat());

            },
            getReportByTemplateIdEbit: function (templateId, period, orgId) {
                if (!_.isNumber(period)) {
                    period = 0;
                }
                var param = {
                    templateId: templateId,
                    period: period,
                    orgId: orgId
                };
                return $http.post("/Report/getReportByTemplateEbit", JSON.stringify(param), apiConfig.createVat());
            },
            getDataSourceDetailList: function (dataSourceId) {
                return $http.get('/Report/getDataSourceDetailList/' + dataSourceId, apiConfig.createVat());
            },
            hasManualDataSource: function (projectId, period) {
                return $http.get('/Report/hasManualDataSource/' + projectId + '/' + period, apiConfig.createVat());
            },
            loadAttachList: function (activeSheet) {
                return $http.post('/Report/loadAttachList', activeSheet, apiConfig.createVat());
            },
            deleteAttach: function (id) {
                var config = {isBusyRequest: true};
                return $http.get('/Report/deleteAttach?id=' + id, apiConfig.create(config));
            },
            getOrgLists: function () {
                return $http.get('/Report/getOrgLists', apiConfig.createVat());
            },
            saveEbitModule: function () {

            },
            downLoadAttach: function (id) {
                return $http.get('/Report/downLoadAttach?id=' + id, apiConfig.createVat());
            }
        };

    }]);