class ZuoraConnect::AppInstanceBase

def refresh(session: {})

def refresh(session: {})
  refresh_count ||= 0
  skip_connect ||= ZuoraConnect.configuration.skip_connect
  begin
    #Check how app was deployed
    if !self.auto_deployed? && !skip_connect
      self.check_oauth_state
      response = HTTParty.get(ZuoraConnect.configuration.url + "/api/#{self.api_version}/tools/tasks/#{self.id}.json",:body => {:access_token => self.access_token})
      if response.code == 200
        begin
          parsed_json = JSON.parse(response.body)
        rescue JSON::ParserError => ex
          raise ZuoraConnect::Exceptions::ConnectCommunicationError.new("JSON parse error", response.body, response.code)
        end
        self.build_task(task_data: parsed_json, session: session)
        self.set_backup_creds
        self.save(validate: false) if self.changed?
      else
        raise ZuoraConnect::Exceptions::ConnectCommunicationError.new("Error Communicating with Connect", response.body, response.code)
      end
    else
      self.build_task(task_data: self.zuora_logins, session: session)
    end
    self.last_refresh = Time.now.to_i
    self.cache_app_instance
    self.reset_mark_for_refresh
  rescue *(ZuoraAPI::Login::CONNECTION_EXCEPTIONS + ZuoraAPI::Login::CONNECTION_READ_EXCEPTIONS) => ex
    refresh_count += 1
    if refresh_count < 3
      sleep(10)
      ZuoraConnect.logger.debug("REFRESH TASK - Connection Failure Retrying(#{refresh_count})", ex, self.default_ougai_items)
      retry
    else
      ZuoraConnect.logger.fatal("REFRESH TASK - Connection Failed", ex)
      raise
    end
  rescue ZuoraConnect::Exceptions::ConnectCommunicationError => ex
    refresh_count += 1
    if refresh_count < 3
      ZuoraConnect.logger.debug("REFRESH TASK - Communication Failure Retrying(#{refresh_count})", ex, self.default_ougai_items)
      self.refresh_oauth if ex.code == 401
      retry
    else
      ZuoraConnect.logger.fatal("REFRESH TASK - Communication Failed #{ex.code}", ex, self.default_ougai_items)
      raise
    end
  end
rescue => ex
  refresh_count += 1
  if self['zuora_logins'].present? && refresh_count < 3
    ZuoraConnect.logger.warn("REFRESH TASK - Fallback to local encrypted store", ex, self.default_ougai_items)
    skip_connect = true
    retry
  end
  raise
end