class ZuoraConnect::AppInstanceBase

def refresh(session: {}, session_fallback: false)

def refresh(session: {}, session_fallback: false)
  refresh_count ||= 0
  skip_connect ||= false
  #Check how app was deployed
  if self.id < 25000000 && !skip_connect  
    start = Time.now
    response = HTTParty.get(ZuoraConnect.configuration.url + "/api/#{self.api_version}/tools/tasks/#{self.id}.json",:body => {:access_token => self.access_token})
    response_time = Time.now - start
    ZuoraConnect.logger.debug("REFRESH TASK - Connect Task Info Request Time #{response_time.round(2).to_s}", self.default_ougai_items)
    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)  
      if self.kms_key.present?
        begin
          parsed_json.delete('applications')
          parsed_json.delete('tokens')
          self.zuora_logins = parsed_json
          self.save(:validate => false)
        rescue Aws::KMS::Errors::ValidationException, *AWS_AUTH_ERRORS => ex
          Rails.logger.warn(AWS_AUTH_ERRORS_MSG, ex)
        rescue => ex
          Rails.logger.error(AWS_AUTH_ERRORS_MSG, ex)
        end
      end        
    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
  elsif refresh_count < 4 && self['zuora_logins'].present?
    ZuoraConnect.logger.warn("REFRESH TASK - Fallback to local encrypted store", ex, self.default_ougai_items)
    skip_connect = true
    retry
  else
    ZuoraConnect.logger.fatal("REFRESH TASK - Connection Failed", ex, self.default_ougai_items)
    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)
    if ex.code == 401
      self.refresh_oauth
    end
    retry
  elsif refresh_count < 4 && self['zuora_logins'].present?
    ZuoraConnect.logger.warn("REFRESH TASK - Fallback to local encrypted store", ex, self.default_ougai_items)
    skip_connect = true
    retry
  else
    ZuoraConnect.logger.fatal("REFRESH TASK - Communication Failed #{ex.code}", ex, self.default_ougai_items)
    raise
  end
end