require 'rack/app' require 'oj' require 'surikat'

Dir.glob('./config/initializers/*.rb').sort.each do |file|

require file

end

class %{app_name_capitalized} < Rack::App

get '/' do
  app
end

post '/' do
  app
end

options '/' do
  response.headers['Access-Control-Allow-Origin'] = '*'
  response.headers['Access-Control-Allow-Headers'] = 'Surikat'
end

def app
  ActiveRecord::Base.logger = Logger.new(STDOUT) unless ENV['RACK_ENV'] == 'production'

  session_key = request.env['HTTP_SURIKAT']

  # first, try to parse it as JSON
  json_payload = Oj.load(payload) rescue nil

  if json_payload
    query, variables = json_payload['query'], json_payload['variables']
  else # then, as parameters, either GET
    if query = params['query']
      variables = params['variables']
    else # or POST
      split_payload, query, variables = payload.split('&'), nil, nil
      split_payload.to_a.each do |line|
        split_line  = line.split('=')
        name, value = split_line.to_a[0], split_line.to_a[1, 1000].join('=')

        query       = CGI::unescape(value) if name == 'query'
        variables   = CGI::unescape(value) if name == 'variables'
      end

      variables = Oj.load(variables) if !variables.to_s.empty?
    end
  end

  if query.to_s.strip.empty?
    result = {'error' => 'Empty query'}
  else
    result = begin
      Surikat::run query, variables, debug: false, session_key: session_key
    rescue Exception => e
      puts "Error running query #{query.inspect}: #{e.message}\n#{e.backtrace.join("\n")}"
      {'error': e.message}
    end
  end

  response.headers['Access-Control-Allow-Origin'] = '*'

  Oj.dump result, mode: :compat
end

end

run %{app_name_capitalized}