class Lndhub
  attr_accessor :auth_token

  def initialize
    @base_url = ENV["LNDHUB_API_URL"]
  end

  def post(endpoint, payload)
    headers = { "Content-Type" => "application/json" }
    if auth_token
      headers.merge!({ "Authorization" => "Bearer #{auth_token}" })
    end

    res = Faraday.post "#{@base_url}/#{endpoint}", payload.to_json, headers
    log_error(res) if res.status != 200

    JSON.parse(res.body)
  end

  def get(endpoint, auth_token)
    res = Faraday.get("#{@base_url}/#{endpoint}", {}, {
      "Content-Type" => "application/json",
      "Accept" => "application/json",
      "Authorization" => "Bearer #{auth_token}"
    })
    data = JSON.parse(res.body)

    if data.is_a?(Hash) && data["error"] && data["message"] == "bad auth"
      raise AuthError
    else
      data
    end
  end

  def create(payload)
    post "create", payload
  end

  def authenticate(user)
    credentials = post "auth?type=auth", { login: user.ln_account, password: user.ln_password }
    self.auth_token = credentials["access_token"]
    self.auth_token
  end

  def balance(user_token=nil)
    get "balance", user_token || auth_token
  end

  def gettxs(user_token=nil)
    get "gettxs", user_token || auth_token
  end

  def getuserinvoices(user_token=nil)
    get "getuserinvoices", user_token || auth_token
  end

  def addinvoice(payload)
    invoice = post "addinvoice", {
      amt: payload[:amount],
      memo: payload[:memo],
      description_hash: payload[:description_hash]
    }

    invoice["payment_request"]
  end

  def log_error(res)
    Rails.logger.error "[lndhub] API request failed:"
    Rails.logger.error res.body

    if Setting.sentry_enabled?
      Sentry.capture_message("Lndhub API request failed: #{res.body}")
    end
  end
end
