require "global_id"

module Sidekiq
  module GlobalIDMiddleware
    class Processor
      def call(_worker_class, job, *)
        job["args"].map!(&method(:process))
        yield
      end

      def process(argument)
        argument
      end
    end

    class Deserializer < Processor
      def process(argument)
        if argument.to_s.start_with?("gid://")
          GlobalID::Locator.locate(argument)
        else
          argument
        end
      end
    end

    class Serializer < Processor
      def process(argument)
        if argument.respond_to?(:to_global_id)
          argument.to_global_id.to_s
        else
          argument
        end
      end
    end
  end

  server_middleware do |chain|
    chain.prepend GlobalIDMiddleware::Deserializer
  end

  client_middleware do |chain|
    chain.prepend GlobalIDMiddleware::Serializer
  end
end