# frozen_string_literal: true

module ConvenientService
  module Service
    module Plugins
      module HasMermaidFlowchart
        module Entities
          class Flowchart
            module Entities
              class Code
                module Commands
                  class GenerateServiceLines < Support::Command
                    ##
                    # @api private
                    #
                    # @!attribute service [r]
                    #   @return [ConvenientService::Service]
                    #
                    attr_reader :service

                    ##
                    # @api private
                    #
                    # @!attribute ids [r]
                    #   @return [Array<String>]
                    #
                    attr_reader :ids

                    ##
                    # @api private
                    #
                    # @!attribute settings [r]
                    #   @return [ConvenientService::Service::Plugins::HasMermaidFlowchart::Entities::Flowchart::Entities::Settings]
                    #
                    attr_reader :settings

                    ##
                    # @api private
                    #
                    # @param service [ConvenientService::Service]
                    # @param ids [Array<String>]
                    # @param settings [ConvenientService::Service::Plugins::HasMermaidFlowchart::Entities::Flowchart::Entities::Settings]
                    # @return [void]
                    #
                    def initialize(service:, ids:, settings:)
                      @service = service
                      @ids = ids
                      @settings = settings
                    end

                    ##
                    # @api private
                    #
                    # @return [Array<String>]
                    #
                    def call
                      return Commands::GenerateResultLines[service: service, settings: settings, ids: next_ids] if service.steps.none?

                      service.steps.flat_map do |step|
                        if step.method_step?
                          Commands::GenerateMethodStepLines[service: service, settings: settings, step: step, ids: next_ids]
                        else
                          Commands::GenerateServiceStepLines[service: service, settings: settings, step: step, ids: next_ids]
                        end
                      end
                    end

                    private

                    ##
                    # @return [Array<String>]
                    #
                    # @internal
                    #   TODO: Entities::ID.
                    #
                    def next_ids
                      @next_ids ||= ids + [service.object_id]
                    end
                  end
                end
              end
            end
          end
        end
      end
    end
  end
end