app/models/zuora_connect/app_instance.rb



module ZuoraConnect
  class AppInstance < ActiveRecord::Base
    after_initialize :init
    attr_accessor :user, :pass, :options, :mode, :logins, :valid, :task_data, :last_refresh

    def init
      @options = Hash.new
      @logins = Hash.new
      Apartment::Migrator.migrate(self.id)
      Apartment::Tenant.switch!(self.id)
    end

    def new_session(user, password, session = nil)
      @user = user
      @pass = password
      if session.nil? || (!session.nil? && self.id != session["appInstance"].to_i) || session["#{self.id}::task_data"].blank? || ( session["#{self.id}::last_refresh"].blank? || session["#{self.id}::last_refresh"].to_i < ZuoraConnect.configuration.timeout.ago.to_i )
        Rails.logger.debug("REFRESHING - Session Nil") if session.nil?
        Rails.logger.debug("REFRESHING - AppInstance ID does not match session id") if  (!session.nil? && self.id != session["appInstance"].to_i)
        Rails.logger.debug("REFRESHING - Task Data Blank") if session["#{self.id}::task_data"].blank?
        Rails.logger.debug("REFRESHING - No Time on Cookie") if session["#{self.id}::last_refresh"].blank?
        Rails.logger.debug("REFRESHING - Session Old") if (session["#{self.id}::last_refresh"].blank? || session["#{self.id}::last_refresh"].to_i < ZuoraConnect.configuration.timeout.ago.to_i )
        self.refresh(session)
      else
        Rails.logger.debug("REBUILDING")
        build_task(session["#{self.id}::task_data"], session)
      end
      @valid = true
    end

    def save_data(session = Hash.new)
      self.logins.each do |key, login|
        if login.tenant_type == "Zuora"
          session["#{self.id}::#{key}:session"] = login.client.current_session
        end
      end
      session["#{self.id}::task_data"] = self.task_data
      session["#{self.id}::last_refresh"] = self.last_refresh
      session["appInstance"] = self.id
      return session
    end

    def updateOption(optionId, value)
      if @user && @pass
        return HTTParty.get(ZuoraConnect.configuration.url + "/api/v1/tools/application_options/#{optionId}/edit?value=#{value}",:basic_auth => auth = {:username => user, :password => password})
      else
        return false
      end
    end

    def refresh(session = nil)
      response = HTTParty.get(ZuoraConnect.configuration.url + "/api/v1/tools/tasks/#{self.id}.json",:basic_auth => auth = {:username => self.user, :password => self.pass})
      if response.code == 200
        @last_refresh = Time.now.to_i
        build_task(JSON.parse(response.body), session)
      else
        raise "Unauthorized"
      end
    end

    def build_task(task_data, session)
      @task_data = task_data
      @mode = @task_data["mode"]
      @task_data.each do |k,v|
        if k.match(/^(.*)_login$/)
          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"]
          @logins[k] = tmp
          self.attr_builder(k, @logins[k])
        elsif k == "options"
          v.each do |opt|
            @options[opt["config_name"]] = opt
          end
        end
      end
    end

    def send_email

    end

    def self.decrypt_response(resp)
      OpenSSL::PKey::RSA.new(ZuoraConnect.configuration.private_key).private_decrypt(resp)
    end

    def attr_builder(field,val)
      singleton_class.class_eval { attr_accessor "#{field}" }
      send("#{field}=", val)
    end
  end
end