module Agents
  class WebhookAgent < Agent
    cannot_be_scheduled!
    cannot_receive_events!

    description  do
        <<-MD
        Use this Agent to create events by receiving webhooks from any source.

        In order to create events with this agent, make a POST request to:
        ```
           https://#{ENV['DOMAIN']}/users/#{user.id}/web_requests/#{id || '<id>'}/:secret
        ``` where `:secret` is specified in your options.

        The

        Options:

          * `secret` - A token that the host will provide for authentication.
          * `expected_receive_period_in_days` - How often you expect to receive
            events this way. Used to determine if the agent is working.
          * `payload_path` - JSONPath of the attribute in the POST body to be
            used as the Event payload.
      MD
    end

    event_description do
      <<-MD
        The event payload is base on the value of the `payload_path` option,
        which is set to `#{interpolated['payload_path']}`.
      MD
    end

    def default_options
      { "secret" => "supersecretstring",
        "expected_receive_period_in_days" => 1,
        "payload_path" => "payload"}
    end

    def receive_web_request(params, method, format)
      secret = params.delete('secret')
      return ["Please use POST requests only", 401] unless method == "post"
      return ["Not Authorized", 401] unless secret == interpolated['secret']

      create_event(:payload => payload_for(params))

      ['Event Created', 201]
    end

    def working?
      event_created_within?(interpolated['expected_receive_period_in_days']) && !recent_error_logs?
    end

    def validate_options
      unless options['secret'].present?
        errors.add(:base, "Must specify a secret for 'Authenticating' requests")
      end
    end

    def payload_for(params)
      Utils.value_at(params, interpolated['payload_path']) || {}
    end
  end
end
