module Support
  # This can stay as a singleton module because we really shouldn't use
  # multiple accounts.
  module S3Client
    class << self
      def read_file(bucket:, prefix:)
        s3_file_contents = ""
        wait_for_file(bucket: bucket, prefix: prefix)
        s3_client.list_objects_v2(bucket: bucket, prefix: prefix).contents.each do |object|
          download_file(
            bucket: bucket,
            key: object.key,
            destination: Support::Paths.downloads + "/" + object.etag
          )
          s3_file_contents = File.open(Support::Paths.downloads + "/" + object.etag, "rb").read
        end
        s3_file_contents
      end

      def delete_files(bucket:, prefix:)
        s3_client.list_objects_v2(bucket: bucket, prefix: prefix).contents.each do |object|
          s3_client.delete_object(bucket: bucket, key: object.key)
        end
      end

      def download_file(bucket:, key:, destination:)
        s3_client.get_object(
          response_target: destination,
          bucket: bucket,
          key: key
        )
      end

      def upload_file(bucket:, key:, file:)
        File.open(file) do |file_contents|
          s3_client.put_object(
            bucket: bucket,
            key: key,
            body: file_contents
          )
        end
      end

      private

      def s3_client
        @s3_client ||= Aws::S3::Client.new(region: "us-east-1")
      end

      def wait_for_file(bucket:, prefix:)
        puts "Waiting for a file..."
        Watir::Wait.until do
          !s3_client.list_objects(bucket: bucket, prefix: prefix).contents.map(&:key).empty?
        end
      end
    end
  end
end
