directive_module.directive('rollbackmodal', rollbackModalDirective);

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

            scope.showRollbackAlertDialog = showRollbackAlertDialog;

            EventManager.subscribe(EventManager.EventType.PRE_ROLLBACK_NAMESPACE,
            function (context) {
                preRollback(context.namespace);
            });

            EventManager.subscribe(EventManager.EventType.ROLLBACK_NAMESPACE,
                                   function (context) {
                                       rollback();
                                   });

            function preRollback(namespace) {
                scope.toRollbackNamespace = namespace;
                //load latest two active releases
                ReleaseService.findActiveReleases(scope.appId,
                                                  scope.env,
                                                  scope.cluster,
                                                  scope.toRollbackNamespace.baseInfo.namespaceName,
                                                  0, 2)
                    .then(function (result) {
                        if (result.length <= 1) {
                            toastr.error("没有可以回滚的发布历史");
                            return;
                        }
                        scope.toRollbackNamespace.firstRelease = result[0];
                        scope.toRollbackNamespace.secondRelease = result[1];

                        ReleaseService.compare(scope.env,
                                               scope.toRollbackNamespace.firstRelease.id,
                                               scope.toRollbackNamespace.secondRelease.id)
                            .then(function (result) {
                                scope.toRollbackNamespace.releaseCompareResult = result.changes;

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

            function rollback() {
                scope.toRollbackNamespace.rollbackBtnDisabled = true;
                ReleaseService.rollback(scope.env,
                                        scope.toRollbackNamespace.firstRelease.id)
                    .then(function (result) {
                        toastr.success("回滚成功");
                        scope.toRollbackNamespace.rollbackBtnDisabled = false;
                        AppUtil.hideModal('#rollbackModal');
                        EventManager.emit(EventManager.EventType.REFRESH_NAMESPACE,
                                          {
                                              namespace:scope.toRollbackNamespace
                                          });
                    }, function (result) {
                        scope.toRollbackNamespace.rollbackBtnDisabled = false;
                        AppUtil.showErrorMsg(result, "回滚失败");
                    })
            }

            function showRollbackAlertDialog() {
                AppUtil.hideModal("#rollbackModal");
                AppUtil.showModal("#rollbackAlertDialog");
            }
        }
    }
}