class ZuoraConnect::AppInstanceBase

def refresh_oauth

def refresh_oauth
  refresh_oauth_count ||= 0
  start = Time.now
  params = {
            :grant_type => "refresh_token",
            :redirect_uri => ZuoraConnect.configuration.oauth_client_redirect_uri,
            :refresh_token => self.refresh_token
          }
  response = HTTParty.post("#{ZuoraConnect.configuration.url}/oauth/token",:body => params)
  response_time = Time.now - start
  ZuoraConnect.logger.debug("[#{self.id}] REFRESH OAUTH - In #{response_time.round(2).to_s}")
  if response.code == 200
    response_body = JSON.parse(response.body)
    self.refresh_token = response_body["refresh_token"]
    self.access_token = response_body["access_token"]
    self.oauth_expires_at = Time.at(response_body["created_at"].to_i) + response_body["expires_in"].seconds
    self.save(:validate => false)
  else
    ZuoraConnect.logger.fatal("[#{self.id}] REFRESH OAUTH - Failed Code #{response.code}")
    raise ZuoraConnect::Exceptions::ConnectCommunicationError.new("Error Refreshing Access Token", response.body, response.code)
  end
rescue *(ZuoraAPI::Login::CONNECTION_EXCEPTIONS).concat(ZuoraAPI::Login::CONNECTION_READ_EXCEPTIONS) => ex
  if (refresh_oauth_count += 1) < 3
    ZuoraConnect.logger.info("[#{self.id}] REFRESH OAUTH - #{ex.class} Retrying(#{refresh_oauth_count})")
    retry
  else
    ZuoraConnect.logger.fatal("[#{self.id}] REFRESH OAUTH - #{ex.class} Failed #{refresh_oauth_count}x")
    raise
  end
rescue ZuoraConnect::Exceptions::ConnectCommunicationError => ex
  sleep(CONNECT_COMMUNICATION_SLEEP)
  self.reload_attributes([:refresh_token, :oauth_expires_at, :access_token]) #Reload only the refresh token for retry
  #After reload, if nolonger expired return
  return if !self.oauth_expired?
  if (refresh_oauth_count += 1) < 3
    ZuoraConnect.logger.info("[#{self.id}] REFRESH OAUTH - Failed Retrying(#{refresh_oauth_count})")
    retry
  else
    ZuoraConnect.logger.fatal("[#{self.id}] REFRESH OAUTH - Failed #{refresh_oauth_count}x")
    raise
  end
end