module RubyPGExtras

def self.connection

def self.connection
  database_uri = URI.parse(database_url)
  @_connection ||= PG.connect(
    dbname: database_uri.path[1..-1],
    host: database_uri.host,
    port: database_uri.port,
    user: database_uri.user,
    password: database_uri.password
  )
end

def self.database_url

def self.database_url
  @@database_url || ENV.fetch("DATABASE_URL")
end

def self.database_url=(value)

def self.database_url=(value)
  @@database_url = value
end

def self.description_for(query_name:)

def self.description_for(query_name:)
  first_line = File.open(
    sql_path_for(query_name: query_name)
  ) { |f| f.readline }
  first_line[/\/\*(.*?)\*\//m, 1].strip
end

def self.display_result(result, title:, in_format:)

def self.display_result(result, title:, in_format:)
  case in_format
  when :array
    result.values
  when :hash
    result.to_a
  when :raw
    result
  when :display_table
    headings = if result.count > 0
      result[0].keys
    else
      ["No results"]
    end
    puts Terminal::Table.new(
      title: title,
      headings: headings,
      rows: result.values
    )
  else
    raise "Invalid in_format option"
  end
end

def self.run_query(query_name:, in_format:, args: {})

def self.run_query(query_name:, in_format:, args: {})
  if %i(calls outliers).include?(query_name)
    pg_stat_statements_ver = RubyPGExtras.connection.exec("select installed_version from pg_available_extensions where name='pg_stat_statements'")
      .to_a[0].fetch("installed_version", nil)
    if pg_stat_statements_ver != nil
      if Gem::Version.new(pg_stat_statements_ver) < Gem::Version.new(NEW_PG_STAT_STATEMENTS)
        query_name = "#{query_name}_legacy".to_sym
      end
    end
  end
  sql = if (custom_args = DEFAULT_ARGS[query_name].merge(args)) != {}
    sql_for(query_name: query_name) % custom_args
  else
    sql_for(query_name: query_name)
  end
  result = connection.exec(sql)
  display_result(
    result,
    title: description_for(query_name: query_name),
    in_format: in_format
  )
end

def self.sql_for(query_name:)

def self.sql_for(query_name:)
  File.read(
    sql_path_for(query_name: query_name)
  )
end

def self.sql_path_for(query_name:)

def self.sql_path_for(query_name:)
  File.join(File.dirname(__FILE__), "/ruby-pg-extras/queries/#{query_name}.sql")
end