1# frozen_string_literal: true
2
3module MergeRequests
4  class MergeOrchestrationService < ::BaseService
5    def execute(merge_request)
6      return unless can_merge?(merge_request)
7
8      merge_request.update(merge_error: nil)
9
10      if can_merge_automatically?(merge_request)
11        auto_merge_service.execute(merge_request)
12      else
13        merge_request.merge_async(current_user.id, params)
14      end
15    end
16
17    def can_merge?(merge_request)
18      can_merge_automatically?(merge_request) || can_merge_immediately?(merge_request)
19    end
20
21    def preferred_auto_merge_strategy(merge_request)
22      auto_merge_service.preferred_strategy(merge_request)
23    end
24
25    private
26
27    def can_merge_immediately?(merge_request)
28      merge_request.can_be_merged_by?(current_user) &&
29        merge_request.mergeable_state?
30    end
31
32    def can_merge_automatically?(merge_request)
33      auto_merge_service.available_strategies(merge_request).any?
34    end
35
36    def auto_merge_service
37      @auto_merge_service ||= AutoMergeService.new(project, current_user, params)
38    end
39  end
40end
41