module ZuoraConnect::Controllers::Helpers

def authenticate_app_api_request

def authenticate_app_api_request
  authenticate_or_request_with_http_basic do |username, password|
    @appinstance = ZuoraConnect::AppInstance.where(:token => password).first
    if !@appinstance.blank?
      @appinstance.new_session(:session => {})
      Thread.current[:appinstance] = @appinstance
      return  @appinstance.valid
    else
      render text: "Access Denied", status: :unauthorized
    end
  end
end

def authenticate_connect_app_request

def authenticate_connect_app_request
  if ZuoraConnect.configuration.mode == "Production"
    if request["data"]
      setup_instance_via_data
    else
      setup_instance_via_session
    end
  else
    setup_instance_via_dev_mode
  end
  @appinstance.new_session(:session =>instance_data_lookup(@appinstance.id, @appinstance.access_token))
  I18n.locale = session["#{@appinstance.id}::user::locale"] ?  session["#{@appinstance.id}::user::locale"] : ZuoraConnect.configuration.default_locale
  Time.zone = session["#{@appinstance.id}::user::timezone"] ? session["#{@appinstance.id}::user::timezone"] : ZuoraConnect.configuration.default_time_zone
end

def check_connect_admin

def check_connect_admin
  return session["#{@appinstance.id}::admin"]
end

def check_connect_admin!

def check_connect_admin!
  raise ZuoraConnect::Exceptions::AccessDenied.new("User is not an authorized admin for this application") if !session["#{@appinstance.id}::admin"]
end

def instance_data_lookup(id = nil, user = nil)

def instance_data_lookup(id = nil, user = nil)
  return session.blank? ? {} : session
end

def persist_connect_app_session

def persist_connect_app_session
  session.merge!(@appinstance.save_data)
end

def setup_instance_via_data

def setup_instance_via_data
  session["valid"] |= false
  reset_session
  values = JSON.parse(ZuoraConnect::AppInstance.decrypt_response(Base64.urlsafe_decode64(request["data"])))
  if values["param_data"]
    values["param_data"].each do |k ,v|
      params[k] = v
    end
  end
  session["#{values["appInstance"]}::destroy"] = values["destroy"]
  session["#{values["appInstance"]}::valid"] = false
  session["appInstance"] = values["appInstance"]
  if values["current_user"]
    session["#{values["appInstance"]}::admin"] = values["current_user"]["admin"] ? values["current_user"]["admin"] : false
    session["#{values["appInstance"]}::user::timezone"] = values["current_user"]["timezone"]
    session["#{values["appInstance"]}::user::locale"] = values["current_user"]["locale"]
    session["#{values["appInstance"]}::user::email"] = values["current_user"]["email"]
  end
  @appinstance = ZuoraConnect::AppInstance.where(:id => values["appInstance"].to_i).first
  if @appinstance.blank?
    Apartment::Tenant.switch!("public")
    Apartment::Tenant.create(values["appInstance"].to_s)
    @appinstance = ZuoraConnect::AppInstance.create!(:id => values["appInstance"].to_i, :access_token => values["user"], :refresh_token => values["key"])
  end
  if @appinstance.access_token.blank? || @appinstance.refresh_token.blank?
    @appinstance.update_attributes(:access_token =>  values["user"], :refresh_token =>  values["key"])
  end
end

def setup_instance_via_dev_mode

def setup_instance_via_dev_mode
  session["appInstance"] = ZuoraConnect.configuration.dev_mode_appinstance
  user = ZuoraConnect.configuration.dev_mode_user
  key = ZuoraConnect.configuration.dev_mode_pass
  session["valid"] = true
  values = {:user => user , :key => key, :appinstance => session["appInstance"]}
  @appinstance = ZuoraConnect::AppInstance.where(:id => values[:appinstance].to_i).first
  if @appinstance.blank?
    Apartment::Tenant.switch!("public")
    Apartment::Tenant.create(values[:appinstance].to_s)
    @appinstance = ZuoraConnect::AppInstance.create!(:id => values[:appinstance].to_i, :access_token => values[:user], :refresh_token => values[:key])
  end
  if @appinstance.access_token.blank? || @appinstance.refresh_token.blank?
    @appinstance.update_attributes(:access_token =>  values["user"], :refresh_token =>  values["key"])
  end
  session["#{@appinstance.id}::admin"] =  ZuoraConnect.configuration.dev_mode_admin
end

def setup_instance_via_session

def setup_instance_via_session
  if !session["appInstance"].blank?
    @appinstance = ZuoraConnect::AppInstance.where(:id => session["appInstance"]).first
  else
    raise ZuoraConnect::Exceptions::SessionInvalid.new("Session Blank -- Relaunch Application")
  end
end