module Agents
  class WitaiAgent < Agent
    cannot_be_scheduled!
    no_bulk_receive!

    description <<~MD
      The `wit.ai` agent receives events, sends a text query to your `wit.ai` instance and generates outcome events.

      Fill in `Server Access Token` of your `wit.ai` instance. Use [Liquid](https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid) to fill query field.

      `expected_receive_period_in_days` is the expected number of days by which agent should receive events. It helps in determining if the agent is working.
    MD

    event_description <<~MD
      Every event have `outcomes` key with your payload as value. Sample event:

          {"outcome" : [
            {"_text" : "set temperature to 34 degrees at 11 PM",
             "intent" : "get_temperature",
             "entities" : {
               "temperature" : [
               {
                 "type" : "value",
                 "value" : 34,
                 "unit" : "degree"
               }],
               "datetime" : [
               {
                 "grain" : "hour",
                 "type" : "value",
                 "value" : "2015-03-26T21:00:00.000-07:00"
               }]},
               "confidence" : 0.556
             }]}
    MD

    def default_options
      {
        'server_access_token' => 'xxxxx',
        'expected_receive_period_in_days' => 2,
        'query' => '{{xxxx}}'
      }
    end

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

    def validate_options
      unless %w[server_access_token query expected_receive_period_in_days].all? { |field| options[field].present? }
        errors.add(:base, 'All fields are required')
      end
    end

    def receive(incoming_events)
      incoming_events.each do |event|
        interpolated_event = interpolated event
        response = HTTParty.get query_url(interpolated_event[:query]), headers
        create_event 'payload' => {
          'outcomes' => JSON.parse(response.body)['outcomes']
        }
      end
    end

    private

    def api_endpoint
      'https://api.wit.ai/message?v=20141022'
    end

    def query_url(query)
      api_endpoint + { q: query }.to_query
    end

    def headers
      # oauth
      { headers: { 'Authorization' => 'Bearer ' + interpolated[:server_access_token] } }
    end
  end
end
