frameworkModule.controller('appApproveController', ['$rootScope', '$scope', '$timeout', '$q', '$log', '$translate', '$state', '$interval',
    'uiGridConstants', 'projectService', 'vatSessionService', 'orgService', 'serviceTypeService', 'userService', 'loginContext', 'enums',
    'citSessionService', 'region', 'SweetAlert', 'productService', 'localStorageService', 'assetsManageSessionService','serviceLogService',
    'ackUibModal', 'Upload', 'apiInterceptor','vatApproveService',
    function ($rootScope, $scope, $timeout, $q, $log, $translate, $state, $interval, uiGridConstants, projectService, vatSessionService,
        orgService, serviceTypeService, userService, loginContext, enums, citSessionService, region, SweetAlert, productService,
        localStorageService, assetsManageSessionService, serviceLogService, ackUibModal, Upload, apiInterceptor, vatApproveService) {
        'use strict';
        $log.debug('appApproveController.ctor()...');
        var uploadUrl = apiInterceptor.webApiHostUrl + '/product/NewFile';
        var resumable = true;
        $scope.chunkSize = 100000;
        $scope.conditionChange = false;
        var token = $('input[name="__RequestVerificationToken"]').val();

        //**********************************************************************************************
        $scope.dateFormat = $translate.instant('dateFormat4Year');
        //always select a month before current month: update the year if the current month is Jan.(1)
        var date = new Date();
        var year = date.getFullYear();
        var month = date.getMonth();
        //$scope.selectedDate = new Date(year, month - 1, 1);
        $scope.startDate = new Date(year - 20, 1, 1);
        $scope.endDate = new Date(year + 20, 1, 1);
        $scope.selectedDate = new Date(vatSessionService.year, vatSessionService.month - 1, 1);
        $scope.selectedStartDate = new Date(vatSessionService.year, vatSessionService.month - 1, 1);
        $scope.serviceTypeId = $scope.servicetypeid.toString();
        $scope.ongoingNum = 0;
        $scope.notBeginNum = 0;
        $scope.completedNum = 0;
        //*************************************************************************************************
        $scope.randomCounter = 0;
        $scope.allResults = [];
        $scope.queryResults = [];
        $scope.checkedOrgs = {};
        $scope.orgList = [];
        $scope.orderYear = true;
        $scope.orderName = true;
        $scope.orderStatus = true;
        $scope.orderType = true;
        $scope.isFirst = true;
        $scope.haveVatPermission = false;


        $scope.currentSelectedMonth = vatSessionService.month;
        $scope.currentSelectedYear = vatSessionService.year;

        var thisData = {
            userPermission: {}
        };

        userService.getUserByName(loginContext.userName).success(function (userData) {
            vatSessionService.logUser = userData;
        });


        //设置项目状态Title
        function setLayoutStatusTitle(statusIds) {

            var currentMonth = vatSessionService.month;
            var statusId;

            if (statusIds === null || (statusIds !== null && statusIds[currentMonth] === undefined))
                statusId = 0;
            else {
                statusId = statusIds[currentMonth];
            }
            var status = "../../../app-resources/images/overview/";
            if (region === 'zh-CN') {
                status += 'zh-CN';
            }
            else {
                status += 'en-US';
            }

            switch (statusId) {
                case constant.ProjectStatusEnum.UnStarted:
                    status += "/01.png"; //$translate.instant('ProjectStatusUnStarted');
                    break;
                case constant.ProjectStatusEnum.Imported:
                    status += "/02.png"; // $translate.instant('ProjectStatusImported');
                    break;
                case constant.ProjectStatusEnum.AccountMapSubmitted:
                    status += "/03.png";// $translate.instant('ProjectStatusAcccountMapSubmitted');
                    break;
                case constant.ProjectStatusEnum.Generated:
                    status += "/04.png";// $translate.instant('ProjectStatusGenerated');
                    break;
                case constant.ProjectStatusEnum.ReportSubmitted:
                    status += "/05.png"; //$translate.instant('ProjectStatusReportSubmitted');
                    break;
                case constant.ProjectStatusEnum.ReportApproved:
                    status += "/07.png"; //$translate.instant('ProjectStatusReportApproved');
                    break;
                case constant.ProjectStatusEnum.ReportRejected:
                    status += "/06.png"; //$translate.instant('ProjectStatusReportRejected');
                    break;
                case constant.ProjectStatusEnum.Completed:
                    status += "/08.png";// $translate.instant('ProejctStatusCompleted');
                    break;
                default:
                    status += "/01.png";
            }

            return status;
        }

        // TODO: REAL Translation for Industry and Region

        $scope.smartSearch = function (isReset) {
            if (isReset) {
                $scope.searchKeyword = "";
            }
            vatSessionService.queryDto.searchKeyword = $scope.searchKeyword;
            if ($scope.serviceTypeId !== '12') {
                $scope.query();
            }
        };

        $scope.query = function () {
            if (!$scope.allResults) return;
            var temp = $scope.allResults;

            if ($scope.checkedOrgs && _.keys($scope.checkedOrgs).length > 0) {
                temp = _.filter(temp, function (i) {
                    return _.contains(_.keys($scope.checkedOrgs), i.organizationId);
                });
            }

            if ($scope.checkedRegions && $scope.checkedRegions.length > 0) {
                temp = _.filter(temp, function (i) {
                    return _.contains(_.pluck($scope.checkedRegions, 'name'), i.region);
                });
            }
            if ($scope.checkedStatus && $scope.checkedStatus.length > 0) {
                temp = _.filter(temp, function (i) {
                    return _.contains(_.pluck($scope.checkedStatus, 'name'), i.status);
                });
            }
         

            var counter = 0;
            var setWarningToTrue = false;


            $scope.queryResults = temp;
            $scope.projectMsg = $translate.instant('ProjectResultMsg').formatObj({ "ProjectNum": $scope.queryResults.length });

            var notBeginTemp = _.filter(temp, function (i) {
                if (i.serviceTypeID === enums.serviceType.VAT)
                    return ((i.projectStatusList === null || (i.projectStatusList !== null && i.projectStatusList[vatSessionService.month] === undefined) || (i.projectStatusList !== null && i.projectStatusList[vatSessionService.month] === 10)));

                else
                    return ((i.projectStatusList === null || (i.projectStatusList !== null && Object.keys(i.projectStatusList).length === 0) || i.projectStatusList[Object.keys(i.projectStatusList)[Object.keys(i.projectStatusList).length - 1]] === 10));
            });

            if (notBeginTemp) {
                $scope.notBeginNum = notBeginTemp.length;
            }
            var completedTemp = _.filter(temp, function (i) {
                if (i.serviceTypeID === enums.serviceType.VAT) {
                    if (i.projectStatusList && i.projectStatusList[vatSessionService.month] != null) {
                        return i.projectStatusList[vatSessionService.month] === 100;
                    }
                }
                else {
                    if (i.projectStatusList && i.projectStatusList.length > 0) {
                        return i.projectStatusList[Object.keys(i.projectStatusList)[Object.keys(i.projectStatusList).length - 1]] === 100;
                    }
                }
            });
            if (completedTemp) {
                $scope.completedNum = completedTemp.length;
            }
            $scope.ongoingNum = $scope.queryResults.length - $scope.notBeginNum - $scope.completedNum;
        };


        var thisDataService = {
            isHaveOrganizationPermission: function (orgID) {

                var permission = thisData.userPermission;
                var isShow = false;

                if (permission) {

                    if (permission.isSuperAdmin || permission.isADUser) {
                        isShow = true;
                    } else {

                        // 查找机构
                        var findOrg = _.find(permission.organizationPermissionList, function (num) {

                            return num.id === orgID;
                        });

                        if (findOrg && findOrg.permissionList && findOrg.permissionList.length > 0) {

                            // 查看具体权限
                            isShow = true;
                        }

                    }
                }

                return isShow;
            },
        };

        var initDatePickers = function () {
            if ($scope.serviceTypeId === enums.serviceType.CIT) {
                $scope.systemTitle = $translate.instant('CIT');
                $scope.viewMode = 2;
                $scope.dateFormat = $translate.instant('dateFormat4Year');
            }
            if ($scope.serviceTypeId === enums.serviceType.VAT) {
                $scope.systemTitle = $translate.instant('MenuVAT');
                $scope.viewMode = 1;
                $scope.dateFormat = $translate.instant('dateFormat4YearMonth');
            }


            var ele1 = $("#overviewDatepicker");
            ele1.datepicker({
                startDate: $scope.startDate,
                endDate: $scope.endDate,
                language: region,
                viewMode: $scope.viewMode,
                minViewMode: $scope.viewMode,
                autoclose: true, //选中之后自动隐藏日期选择框
                clearBtn: true, //清除按钮
                todayBtn: false, //今日按钮
                format: $scope.dateFormat //日期格式,详见 http://bootstrap-datepicker.readthedocs.org/en/release/options.html#format
            }).on('changeDate', function (e) {
                $scope.changeDate(e);
            });
            ele1.datepicker("setDate", $scope.selectedDate);


        };


        $scope.toggleItemSub = function (item, parent) {

            // orgDisplay.showBusy();
            if (item.isChecked) {
                if (!item.dimensionId) {
                    $scope.checkedOrgs[item.id] = item.name;
                } else {
                    item.subOrgs.forEach(function (org) {
                        $scope.checkedOrgs[org.id] = org.name;
                        org.isChecked = true;
                    });
                }
            } else {

                if (!item.dimensionId) {
                    delete $scope.checkedOrgs[item.id];
                } else {
                    item.subOrgs.forEach(function (org) {
                        org.isChecked = false;
                        delete $scope.checkedOrgs[org.id];
                    });
                }
            }

            $scope.checkedIds = _.keys($scope.checkedOrgs);
            if ($scope.serviceTypeId !== enums.serviceType.AssetsManage) {
                $scope.query();
            }
            // orgDisplay.hideBusy();
        };


        $scope.changeDate = function (e) {
            if (e && e.date) {
                var isDateUpdated = false;
                var tempYear = e.date.getFullYear();
                var tempMonth = e.date.getMonth() + 1;

                if (tempYear !== vatSessionService.year || tempMonth !== vatSessionService.month) {
                    isDateUpdated = true;
                }

                vatSessionService.year = tempYear;
                vatSessionService.month = tempMonth;
                $scope.currentSelectedMonth = tempMonth;
                $scope.currentSelectedYear = tempYear;

                if (isDateUpdated) {
                    $timeout(function () {
                        $scope.conditionChange = !$scope.conditionChange;
                    });
                }

                 if ($scope.serviceTypeId !== enums.serviceType.AssetsManage) {
                      $scope.query();
                  }

            }
        };

        var orgDisplay = {

            orgList: [],
            grayColorD9: '#d9d9d9',
            currentIdcol: '',
            currentNamecol: 'orgName',
            activeColor: 'black',
            activeBackgroundColor: '#fbf8f5',
            whiteColor: 'white',
            main: function () {

                $scope.dimensionOrgShow = function (idcol, namecol) {

                    orgDisplay.showBusy();

                    vatSessionService.queryDto.fieldId = idcol;
                    vatSessionService.queryDto.filedName = namecol;

                    orgDisplay.currentIdcol = idcol;
                    orgDisplay.currentNamecol = namecol;

                    $('.operate-icon').css('background-color', orgDisplay.whiteColor);
                    $('.operate-icon i').css('color', orgDisplay.grayColorD9);


                    $scope.checkedOrgs = {};
                    //$scope.query();

                    var orgData = [];
                    if (idcol) {
                        orgData = orgDisplay.otherShow(idcol, namecol);
                    } else {
                        orgData = orgDisplay.orgShow();
                    }

                    $('.' + namecol).css('color', orgDisplay.activeColor);

                    $('.' + namecol).parent().css('background-color', orgDisplay.activeBackgroundColor);

                    $timeout(function () {
                        orgDisplay.hideBusy();

                        if ($scope.isFirst) {
                            $scope.setTreeChecked(orgData);
                            $scope.isFirst = false;
                        }

                        $scope.orgData = orgData;
                    }, 50);
                };

                orgDisplay.getOrgData();
            },

            getOrgData: function () {
                orgService.getOrgListLevel().success(function (data) {

                    if (!data) {
                        data = [];
                    }

                    var result = [];


                        for (var i = 0; i < data.length; i++) {
                            var item = data[i];

                            if (thisDataService.isHaveOrganizationPermission(item.id)) {
                                result.push(item);
                            }
                        }

                    orgDisplay.orgList = result;

                    //$scope.dimensionOrgShow('', 'orgName');
                    $scope.dimensionOrgShow(vatSessionService.queryDto.fieldId, vatSessionService.queryDto.filedName);
                });

                // orgDisplay.orgList = testOrgList;
            },

            orgShow: function () {
                var showList = angular.copy(orgDisplay.orgList);

                // 构造父子节点

                for (var i = 0; i < showList.length; i++) {
                    var item = showList[i];
                    if (item.parentID === null) {
                        continue;
                    }

                    var parentNode = _.find(showList, function (num) {
                        return num.id === item.parentID
                    });

                    if (parentNode) {
                        continue;
                    }

                    item.parentID = orgDisplay.getParentID(item, orgDisplay.orgList, showList);
                }

                var idList = _.pluck(showList, 'id');


                var topNodeList = _.filter(showList, function (org) {
                    return idList.indexOf(org.parentID) === -1;
                });

                var orgList = [];
                topNodeList.forEach(function (org) {
                    var item = {
                        id: org.id,
                        name: org.name
                    };

                    var tempList = orgDisplay.getSubOrgDropDownList(org, showList);

                    item.subOrgs = tempList;
                    // 构造子节点
                    orgList.push(item);

                    // orgList = _.union(orgList, tempList);
                });

                return orgList;

            },

            // 获取父节点
            getParentID: function (current, allList, orgDtoList) {
                if (current.parentID === null) {
                    return null;
                }

                var findParent = _.find(allList, function (num) {
                    return num.id === current.parentID;
                });

                if (!findParent) {
                    return null;
                }

                var parent = _.find(orgDtoList, function (num) {
                    return num.id === findParent.id;
                });

                if (parent != null) {
                    return parent.id;
                } else {
                    return orgDisplay.getParentID(findParent, allList, orgDtoList);
                }
            },
            getSubOrgDropDownList: function (current, showList) {
                var sublist = _.filter(showList, function (row) {
                    return row.parentID === current.id;
                });

                var list = [];
                if (!sublist || sublist.length === 0) {
                    return list;
                }

                sublist.forEach(function (row) {
                    var item = {
                        id: row.id,
                        name: row.name,
                        parentID: current.id,
                        expanded: true,
                    };

                    var tempList = orgDisplay.getSubOrgDropDownList(row, showList);
                    item.subOrgs = tempList;

                    list.push(item);

                });

                return list;
            },

            otherShow: function (idcol, namecol) {
                var showList = angular.copy(orgDisplay.orgList);
                var otherList = orgDisplay.getMap(showList, idcol, namecol);

                var list = [];
                otherList.forEach(function (other) {

                    var item = other;

                    item.dimensionId = idcol;

                    item.subOrgs = _.filter(showList, function (t) {

                        return t[idcol] === other.id;
                    });

                    list.push(item);
                });


                return list;
            },
            getMap: function (data, idCol, nameCol) {
                if (data && data.length > 0) {
                    var idList = _.uniq(_.pluck(data, idCol));
                    var list = [];

                    idList.forEach(function (row) {
                        if (row) {
                            var findOne = _.find(data, function (o) {
                                return o[idCol] === row;
                            });

                            if (findOne && findOne[nameCol]) {
                                list.push({
                                    id: row,
                                    name: findOne[nameCol],
                                    selected: true,
                                });
                            }
                        }
                    });

                    return list;
                } else {
                    return [];
                }
            },

            showBusy: function () {
                $('#busy-indicator-container').show();
            },

            hideBusy: function () {
                $('#busy-indicator-container').hide();
            }

        };

        $scope.setTreeChecked = function (dataList) {
            if (dataList && dataList.length > 0 && _.keys(vatSessionService.queryDto.checkedOrgs).length > 0) {
                dataList.forEach(function (v) {
                    if (vatSessionService.queryDto.checkedOrgs[v.id]) {
                        v.isChecked = true;
                    }
                    if (v.subOrgs && v.subOrgs.length > 0) {
                        $scope.setTreeChecked(v.subOrgs);
                    }
                });
            }
        }

        var loadApprovalFromDB = function () {
            vatApproveService.approvalTasks().success(function (data) {
                if (data) {
                     data.forEach(function (p) {
                        if (PWC.isHavePermissionForOrg(p.organizationId, vatSessionService.userPermission))
                         {
                            $scope.allResults.push(p);
                        }
                    });

                    $scope.queryResults = _.clone($scope.allResults);
                    $scope.gridOptions = {
                         bindingOptions: {
                            "dataSource": "queryResults"
                        },
                        keyExpr: "instanceId",
                        showBorders: true,
                         columns:  [
                          { caption: '项目名称', width: '12%', dataField: "projectName"},
                          { caption: '期间', width: '7%', dataField: "period"},
                          { caption: '提审人', width: '10%', dataField: "createBy"},
                          { caption: '审批人', width: '10%', dataField: "approvalBy"},
                          { caption: '审批状态', width: '10%',
                            calculateCellValue: function(data) {
                               if(data.status=='disagreed'){
                                 return '驳回';
                               }else if(data.status == 'agreed'){
                                 return  '通过';
                               }else if(data.status == 'committed'){
                                 return '审核中';
                               }
                            }
                          },
                          { caption: '审批意见', width: '15%',
                                 calculateCellValue: function(data) {
                                 if(data.approvalResult == 'undefined'){
                                   return '';
                                 }else{
                                   return data.approvalResult;
                                 }
                              }
                           },
                          { caption: '提审时间', width: '7.5%', dataField: "createTime"},
                          { caption: '审批时间', width: '7.5%', dataField: "approvalTime"}
                         ],
                          onRowClick: function (e) {
                             $scope.goToService(e.data);
                         }

                    };
                }
            });
        };

         $scope.goToService = function (approvalInfo) {
              projectService.getProjectByID(approvalInfo.projectId).success(
              function(result){
                vatApproveService.getApprovalTemplateInfo(approvalInfo.templateIds.split(",")[0]).success(
                function(template){
                    vatSessionService.project = result;
                    vatSessionService.project.projectName = approvalInfo.projectName;
                    vatSessionService.project.month = approvalInfo.period;
                    vatSessionService.project.templateGroupID = template.templateGroupId;
                    vatSessionService.month = approvalInfo.period;
                    vatSessionService.approvalInfo=approvalInfo;


                    $state.go('vat.generateReport.reportView', {
                            id: approvalInfo.reportIds.split(",")[0],
                            templateid: approvalInfo.templateIds.split(",")[0],
                            name: template.name,
                            templatecode: template.code
                        });
                   });
                });

           };

        (function initialize() {
            initDatePickers();
            $scope.updateStatus = false;

            userService.getUserPermission(loginContext.userName).success(function (userPermission) {
                thisData.userPermission = userPermission;
                userPermission.permissionList.forEach(function (p) {
                    if (p.code.startWith('02')) {
                        $scope.haveVatPermission = true;
                        return;
                    }
                });
                vatSessionService.userPermission = userPermission;
                orgDisplay.main();
                loadApprovalFromDB();
            });
        })();
    }
]);