require 'open-uri'
require 'hypdf'

module Agents
  class PdfInfoAgent < Agent
    gem_dependency_check { defined?(HyPDF) }

    cannot_be_scheduled!
    no_bulk_receive!

    description <<~MD
      The PDF Info Agent returns the metadata contained within a given PDF file, using HyPDF.

      #{'## Include the `hypdf` gem in your `Gemfile` to use PDFInfo Agents.' if dependencies_missing?}

      In order for this agent to work, you need to have [HyPDF](https://devcenter.heroku.com/articles/hypdf) running and configured.

      It works by acting on events that contain a key `url` in their payload, and runs the [pdfinfo](https://devcenter.heroku.com/articles/hypdf#pdfinfo) command on them.
    MD

    event_description do
      "This will change based on the metadata in the pdf.\n\n    " +
        Utils.pretty_print({
          "Title" => "Everyday Rails Testing with RSpec",
          "Author" => "Aaron Sumner",
          "Creator" => "LaTeX with hyperref package",
          "Producer" => "xdvipdfmx (0.7.8)",
          "CreationDate" => "Fri Aug  2 05",
          "32" => "50 2013",
          "Tagged" => "no",
          "Pages" => "150",
          "Encrypted" => "no",
          "Page size" => "612 x 792 pts (letter)",
          "Optimized" => "no",
          "PDF version" => "1.5",
          "url": "your url"
        })
    end

    def working?
      !recent_error_logs?
    end

    def default_options
      {}
    end

    def receive(incoming_events)
      incoming_events.each do |event|
        interpolate_with(event) do
          url_to_scrape = event.payload['url']
          check_url(url_to_scrape, event.payload) if url_to_scrape =~ /^https?:\/\//i
        end
      end
    end

    def check_url(in_url, payload)
      return unless in_url.present?

      Array(in_url).each do |url|
        log "Fetching #{url}"
        info = HyPDF.pdfinfo(open(url))
        create_event payload: info.merge(payload)
      end
    end
  end
end
