class Sequencer
  class Unit
    module Import
      module Zendesk
        class Tickets < Sequencer::Unit::Import::Zendesk::SubSequence::Object

          uses :user_map, :organization_map, :group_map, :ticket_field_map

          private

          def default_params
            super.merge(
              user_map:         user_map,
              group_map:        group_map,
              organization_map: organization_map,
              ticket_field_map: ticket_field_map,
            )
          end

          def resource_iteration
            super do |record|
              # call passed/originally intended block
              yield(record)

              # add hook to check if ticket count
              # update is needed because the request
              # might have changed
              update_ticket_count
            end
          end

          # The source if this is the limitation of not knowing
          # how much tickets there are in total before requesting the endpoint
          # This is caused by the Zendesk API which only returns max. 1000
          # per request
          def update_ticket_count
            update_import_job
            previous_page = next_page
          end

          attr_accessor :previous_page

          def update_import_job
            return if !update_required?

            state.provide(import_job, updated_import_job)
          end

          def updated_import_job
            import_job.result[:Tickets].merge(
              total: import_job.result[:Tickets][:total] + current_request_count
            )
          end

          def update_required?
            return false if previous_page.blank?
            return false if previous_page == next_page

            current_request_count.present?
          end

          def current_request_count
            # access the internal instance method of the
            # Zendesk collection request to get the current
            # count of the endpoint (max. 1000)
            resource_collection_attribute.instance_variable_get(:@count)
          end

          def next_page
            # access the internal instance method of the
            # Zendesk collection request to get the next
            # page number of the endpoint
            resource_collection_attribute.instance_variable_get(:@next_page)
          end
        end
      end
    end
  end
end
