module ZuoraConnect::Controllers::Helpers

def authenticate_connect_app_request

def authenticate_connect_app_request
  if ZuoraConnect.configuration.mode == "Production"
    instance_id = process_encrypted_response
    if session["appInstance"]
      if ZuoraConnect::AppInstance.where(:id => instance_id).size == 0
        Apartment::Tenant.switch!("public")
        Apartment::Tenant.create(instance_id)
        ZuoraConnect::AppInstance.create!(:id => instance_id )
      end
      @appinstance = ZuoraConnect::AppInstance.find(instance_id)
      begin
        @appinstance.new_session(session["#{instance_id}::user"], session["#{instance_id}::key"], session)
        I18n.locale = session["#{instance_id}::user::timezone"] ? session["#{instance_id}::user"] : ZuoraConnect.configuration.default_locale
        Time.zone = session["#{instance_id}::user::locale"] ? session["#{instance_id}::user"] : ZuoraConnect.configuration.default_time_zone
      rescue
        redirect_to ZuoraConnect.configuration.session_error_path
      end
    else
      redirect_to ZuoraConnect.configuration.invalid_app_instance_error_path
    end
  else
    dev_mode
    instance_id = session["appInstance"].to_i
    if session["appInstance"]
      if ZuoraConnect::AppInstance.where(:id => instance_id).size == 0
        Apartment::Tenant.switch!("public")
        Apartment::Tenant.create(instance_id)
        ZuoraConnect::AppInstance.create!(:id => instance_id )
      end
      @appinstance = ZuoraConnect::AppInstance.find(instance_id)
    else
      redirect_to "/500.html"
    end
    @appinstance.options = ZuoraConnect.configuration.dev_mode_options
    ZuoraConnect.configuration.dev_mode_logins.each do |k,v|
      tmp = ZuoraConnect::Login.new(v)
      tmp.client.current_session = session["#{self.id}::#{k}:session"] if !session.nil? && v["tenant_type"] == "Zuora" && session["#{self.id}::#{k}:session"]
      @appinstance.logins[k] = tmp
      @appinstance.attr_builder(k, tmp)
    end
    @appinstance.mode = ZuoraConnect.configuration.dev_mode_mode
  end
end

def check_connect_admin

def check_connect_admin
  redirect_to "/500.html" if !session["#{@appinstance.id}::admin"]
end

def dev_mode

def dev_mode
  session["appInstance"] = "1"
  session["1::user"] = "test"
  session["1::key"] = "test"
  session["1::valid"] = true
end

def persist_connect_app_session

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

def process_encrypted_response

def process_encrypted_response
  session["valid"] |= false
  if request["data"]
    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"]}::user::timezone"] = values["timezone"]
    session["#{values["appInstance"]}::user::locale"] = values["local"]
    session["#{values["appInstance"]}::user"] = values["user"]
    session["#{values["appInstance"]}::key"] = values["key"]
    session["#{values["appInstance"]}::valid"] = false
    session["appInstance"] = values["appInstance"]
    session["#{values["appInstance"]}::admin"] = values["admin"] ? values["admin"] : false
  end
  return session["appInstance"]
end