# frozen_string_literal: true

require "json"
require "net/http"
require "uri"

class LotContext
  def initialize(api_key:, base_url: "https://lotcontext.com/api/v1")
    @api_key = api_key
    @base_url = base_url
  end

  def search(query:, limit: 50, cursor: nil, format: "json")
    get("/properties", query: query, limit: limit, cursor: cursor, format: format)
  end

  def property(id)
    get("/properties/#{URI.encode_www_form_component(id)}")
  end

  def changes(cursor: nil, limit: 50, property_id: nil)
    get("/changes", cursor: cursor, limit: limit, property_id: property_id)
  end

  def coverage
    get("/meta/coverage")
  end

  private

  def get(path, params = {})
    uri = URI(@base_url + path)
    uri.query = URI.encode_www_form(params.compact)
    request = Net::HTTP::Get.new(uri)
    request["Authorization"] = "Bearer #{@api_key}"
    request["Accept"] = "application/json"
    response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(request) }
    raise "LotContext API error #{response.code}: #{response.body}" unless response.is_a?(Net::HTTPSuccess)

    JSON.parse(response.body)
  end
end
