module Agents
  class JsonParseAgent < Agent
    include FormConfigurable

    cannot_be_scheduled!

    description <<-MD
      The JSON Parse Agent parses a JSON string and emits the data in a new event

      `data` is the JSON to parse. Use [Liquid](https://github.com/cantino/huginn/wiki/Formatting-Events-using-Liquid) templating to specify the JSON string.

      `data_key` sets the key which contains the parsed JSON data in emitted events
    MD

    def default_options
      {
        'data' => '{{ data }}',
        'data_key' => 'data',
      }
    end

    event_description do
      "Events will looks like this:\n\n    %s" % Utils.pretty_print(interpolated['data_key'] => {parsed: 'object'})
    end

    form_configurable :data
    form_configurable :data_key

    def validate_options
      errors.add(:base, "data needs to be present") if options['data'].blank?
      errors.add(:base, "data_key needs to be present") if options['data_key'].blank?
    end

    def working?
      received_event_without_error?
    end

    def receive(incoming_events)
      incoming_events.each do |event|
        begin
          mo = interpolated(event)
          create_event payload: { mo['data_key'] => JSON.parse(mo['data']) }
        rescue JSON::JSONError => e
          error("Could not parse JSON: #{e.class} '#{e.message}'")
        end
      end
    end
  end
end