directive_module.directive('releasemodal', releaseModalDirective);

function releaseModalDirective(toastr, AppUtil, EventManager, ReleaseService, NamespaceBranchService) {
    return {
        restrict: 'E',
        templateUrl: '../../views/component/release-modal.html',
        transclude: true,
        replace: true,
        scope: {
            appId: '=',
            env: '=',
            cluster: '='
        },
        link: function (scope) {

            scope.switchReleaseChangeViewType = switchReleaseChangeViewType;
            scope.release = release;

            scope.releaseBtnDisabled = false;
            scope.releaseChangeViewType = 'change';
            scope.releaseComment = '';
            scope.isEmergencyPublish = false;
            
            EventManager.subscribe(EventManager.EventType.PUBLISH_NAMESPACE,
                                   function (context) {

                                       var namespace = context.namespace;
                                       scope.toReleaseNamespace = context.namespace;
                                       scope.isEmergencyPublish = !!context.isEmergencyPublish;

                                       var date = new Date().Format("yyyyMMddhhmmss");
                                       if (namespace.mergeAndPublish) {
                                           namespace.releaseTitle = date + "-gray-release-merge-to-master";
                                       } else if (namespace.isBranch) {
                                           namespace.releaseTitle = date + "-gray";
                                       } else {
                                           namespace.releaseTitle = date + "-release";
                                       }

                                       AppUtil.showModal('#releaseModal');
                                   });

            function release() {
                if (scope.toReleaseNamespace.mergeAndPublish) {
                    mergeAndPublish();
                } else if (scope.toReleaseNamespace.isBranch) {
                    grayPublish();
                } else {
                    publish();
                }

            }

            function publish() {
                scope.releaseBtnDisabled = true;
                ReleaseService.publish(scope.appId, scope.env,
                                       scope.toReleaseNamespace.baseInfo.clusterName,
                                       scope.toReleaseNamespace.baseInfo.namespaceName,
                                       scope.toReleaseNamespace.releaseTitle,
                                       scope.releaseComment,
                                       scope.isEmergencyPublish).then(
                    function (result) {
                        AppUtil.hideModal('#releaseModal');
                        toastr.success("发布成功");

                        scope.releaseBtnDisabled = false;

                        EventManager.emit(EventManager.EventType.REFRESH_NAMESPACE,
                                          {
                                              namespace: scope.toReleaseNamespace
                                          })

                    }, function (result) {
                        scope.releaseBtnDisabled = false;
                        toastr.error(AppUtil.errorMsg(result), "发布失败");

                    }
                );

            }

            function grayPublish() {
                scope.releaseBtnDisabled = true;
                ReleaseService.grayPublish(scope.appId, scope.env,
                                           scope.toReleaseNamespace.parentNamespace.baseInfo.clusterName,
                                           scope.toReleaseNamespace.baseInfo.namespaceName,
                                           scope.toReleaseNamespace.baseInfo.clusterName,
                                           scope.toReleaseNamespace.releaseTitle,
                                           scope.releaseComment,
                                           scope.isEmergencyPublish).then(
                    function (result) {
                        AppUtil.hideModal('#releaseModal');
                        toastr.success("灰度发布成功");

                        scope.releaseBtnDisabled = false;

                        //refresh item status
                        scope.toReleaseNamespace.branchItems.forEach(function (item, index) {
                            if (item.isDeleted) {
                                scope.toReleaseNamespace.branchItems.splice(index, 1);
                            } else {
                                item.isModified = false;
                            }
                        });
                        //reset namespace status
                        scope.toReleaseNamespace.itemModifiedCnt = 0;
                        scope.toReleaseNamespace.lockOwner = undefined;

                        //check rules
                        if (!scope.toReleaseNamespace.rules
                            || !scope.toReleaseNamespace.rules.ruleItems
                            || !scope.toReleaseNamespace.rules.ruleItems.length) {

                            scope.toReleaseNamespace.viewType = 'rule';
                            AppUtil.showModal('#grayReleaseWithoutRulesTips');
                        }

                    }, function (result) {
                        scope.releaseBtnDisabled = false;
                        toastr.error(AppUtil.errorMsg(result), "灰度发布失败");

                    });
            }

            function mergeAndPublish() {

                NamespaceBranchService.mergeAndReleaseBranch(scope.appId,
                                                             scope.env,
                                                             scope.cluster,
                                                             scope.toReleaseNamespace.baseInfo.namespaceName,
                                                             scope.toReleaseNamespace.baseInfo.clusterName,
                                                             scope.toReleaseNamespace.releaseTitle,
                                                             scope.releaseComment,
                                                             scope.isEmergencyPublish,
                                                             scope.toReleaseNamespace.mergeAfterDeleteBranch)
                    .then(function (result) {

                        toastr.success("全量发布成功");

                        EventManager.emit(EventManager.EventType.REFRESH_NAMESPACE,
                                          {
                                              namespace: scope.toReleaseNamespace
                                          })

                    }, function (result) {
                        toastr.error(AppUtil.errorMsg(result), "全量发布失败");
                    });

                AppUtil.hideModal('#releaseModal');
            }

            function switchReleaseChangeViewType(type) {
                scope.releaseChangeViewType = type;
            }
        }
    }
}