lib/wolf_core/application/integrations/iterate_orders_service.rb



module WolfCore
  module Integrations
    class IterateOrdersService < WolfCore::ApplicationService
      include WolfCore::Integrations::OrdersApiOperations

      def initialize(params: nil)
        params ||= {}
        @page = params[:page] || 1
        @per_page = params[:per_page] || 100
        @max_page = params[:max_page]
      end

      def process
        @wolf_token = get_wolf_token
        iterate_all_orders
        build_success_result
      end

      private
      def iterate_all_orders
        begin
          @orders = get_page_orders
          @orders.each do |order|
            log_object '===== Processing order ====='
            log_object order, title: 'order is'
            process_order(order)
          end
        end while page_is_less_or_equal_to_last
        @page -= 1
      end

      def build_success_result
        Result.success(
          data: {
            page: @page,
            per_page: @per_page,
            max_page: @max_page,
          }.merge(build_success_result_data)
        )
      end

      def get_page_orders
        3.times { log_object '===== Starting get_page_orders =====' }
        query = { per_page: @per_page, page: @page, client_id: 1 }
        log_object query, title: 'fetching orders query params are'
        response = fetch_orders!(
          wolf_token: @wolf_token, tenant: ENV['TENANT'], query: query,
          wolf_platform_url: ENV['WOLF_PLATFORM_URL'], error_message: 'Failed to fetch orders',
        )
        @total_pages = response.dig('total_pages')
        log_object "total_pages are #{@total_pages}"
        @page += 1
        3.times { log_object '===== Ending get_page_orders =====' }
        response.dig('orders')
      end

      def process_order(order)
        raise_service_error({ message: 'process_order must be implemented in a subclass' })
      end

      def page_is_less_or_equal_to_last
        3.times { log_object '===== Starting evaluating page_is_less_or_equal_to_last =====' }
        log_object "page is #{@page}"
        log_object "max_page is #{@max_page}"
        if @max_page.present?
          log_object "@page < @max_page is #{@page < @max_page}"
          return @page < @max_page
        end
        log_object "total_pages is #{@total_pages}"
        log_object "@page <= @total_pages is #{@page <= @total_pages}"
        3.times { log_object '===== Ending evaluating page_is_less_or_equal_to_last =====' }
        @page <= @total_pages
      end

      def build_success_result_data
        {}
      end
    end
  end
end