class ZuoraConnect::AppInstanceBase

def build_task(task_data: {}, session: {})

### START Task Methods ####
def build_task(task_data: {}, session: {})
  session = {} if session.blank?
  self.task_data = task_data
  if self.task_data.blank? &&  ZuoraConnect.configuration.local_task_data
    self.task_data = self.zuora_logins
  end
 
  self.mode = self.task_data["mode"]
  if self.task_data['id'].to_s != self.id.to_s
    raise ZuoraConnect::Exceptions::MissMatch.new("Wrong Instance Identifier/Lookup")
  end
  self.task_data.each do |k,v|
    if k.match(/^(.*)_login$/)
      tmp = ZuoraConnect::Login.new(v)
      if v["tenant_type"] == "Zuora"
        if tmp.entities.size > 0
          tmp.entities.each do |value|
            entity_id = value["id"]
            tmp.client(entity_id).current_session          = session["#{self.id}::#{k}::#{entity_id}:current_session"]               if session["#{self.id}::#{k}::#{entity_id}:current_session"]
            tmp.client(entity_id).bearer_token             = session["#{self.id}::#{k}::#{entity_id}:bearer_token"]                  if session["#{self.id}::#{k}::#{entity_id}:bearer_token"]
            tmp.client(entity_id).oauth_session_expires_at = session["#{self.id}::#{k}::#{entity_id}:oauth_session_expires_at"]      if session["#{self.id}::#{k}::#{entity_id}:oauth_session_expires_at"]
          end
        else
          tmp.client.current_session                       = session["#{self.id}::#{k}:current_session"]                             if session["#{self.id}::#{k}:current_session"]
          tmp.client.bearer_token                          = session["#{self.id}::#{k}:bearer_token"]                                if session["#{self.id}::#{k}:bearer_token"] && tmp.client.respond_to?(:bearer_token) ## need incase session id goes from basic to aouth in same redis store
          tmp.client.oauth_session_expires_at              = session["#{self.id}::#{k}:oauth_session_expires_at"]                    if session["#{self.id}::#{k}:oauth_session_expires_at"]  && tmp.client.respond_to?(:oauth_session_expires_at)
        end
      end
      self.logins[k] = tmp
      self.attr_builder(k, @logins[k])
    elsif k == "options"
      v.each do |opt|
        self.options[opt["config_name"]] = opt
      end
    elsif k == "user_settings"
      self.timezone =  v["timezone"]
      self.locale = v["local"]
    end
  end
rescue ZuoraConnect::Exceptions::MissMatch => ex
  raise
rescue ZuoraConnect::Exceptions::InvalidCredentialSet => ex
  raise
rescue => ex
  ZuoraConnect.logger.error("Build Task Error", ex)
  ZuoraConnect.logger.error("Task Data: #{self.task_data}") if self.task_data.present?
  if session.present?
    ZuoraConnect.logger.error("Task Session: #{session.to_h}")  if session.methods.include?(:to_h)
    ZuoraConnect.logger.error("Task Session: #{session.to_hash}") if session.methods.include?(:to_hash)
  end
  raise
end