module OrbitApp
	module Module
		module SideBarRegistration
			Version = "0.5"

			module ClassMethods
				#initiate a blank array for generating the side bar
				cattr_accessor :side_bars
				self.side_bars = []

				def add(var)
					self.side_bars << var
				end

				def find_by_key(key)
				  self.side_bars.each{|t|
            return t if t.name.eql?(key)
          }
          return nil
				end

				def render_all(request,params,user,current_module_app)
          self.side_bars.collect{|t| t.render(request,params,user,current_module_app)}.join.html_safe
        end

        def all
          return self.side_bars
        end

        def all_get_ordered!
          self.side_bars.sort! {|x,y| x.get_sidebar_order! <=> y.get_sidebar_order! }
        end

			end

			extend ClassMethods
			def self.included(other)
				other.extend(ClassMethods)
			end

			class SideBar
        include SideBarRenderer

				def initialize(name = '', key, get_module_app, &block)
				  @head_label = name
          @context_links = []
          @head_link = ""
          @app_base_path = ''
          @active_for_controllers = []
          @available_for = []
          @active_for_app_auth = []
          @module_app_key = key
          @get_module_app = get_module_app
          @sidebar_order = 0 
          block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given?
        	SideBarRegistration.add(self)
          SideBarRegistration.all_get_ordered!
				end

				def get_sidebar_order!
			    @sidebar_order = (get_module_app.sidebar_order rescue 0)
				end

				def get_icon_class
          @icon_class
        end

        def get_module_app
          @get_module_app.call
        end

        def get_module_app_key
          @module_app_key
        end

        def get_active_for_controllers
          @active_for_controllers
        end

        def head_label_i18n(var,options ={})
          @head_label = var
          @icon_class = options[:icon_class]
        end

        def head_link_path(var)
          @head_link = var
        end

        def available_for(var)
          @available_for = set_avaibility(var || "admin") 
        end

        def get_availability
          @available_for
        end

         def set_avaibility(af)
          temp = []
          case af
          when 'users'
            temp << 'users'
            temp << 'sub_managers'
            temp << 'managers'
            temp << 'admin'
           when 'sub_managers'
            temp << 'sub_managers'
            temp << 'managers'
            temp << 'admin'
           when 'managers'
            temp << 'managers'
            temp << 'admin'
           when 'admin'
            temp << 'admin'
          end
          temp
        end

        def active_for_controllers(var)
          @active_for_controllers = var
        end

        def get_context_links
          @context_links
        end

        def context_link(*var)
          var[1].merge!({:module_app_key=>@module_app_key,:get_module_app=>@get_module_app}) unless @module_app_key.nil?
          new_context_link = ContextLink.new(*var)
          @context_links << new_context_link
        end

        def finalize!
          set_controllers_scope
          # set_default_active_app_auth
          current_priority = @context_links.count
          if @authorizable_with_link
            context_link 'module_authorization',
                          :link_path => "admin_authorizations_path(get_module_app.key)",
                          :priority => current_priority + 2,
                          :available_for => "managers"
          end
          @context_links.each do |t| 
            # t.set_module_app = @module_app
            t.finalize!
          end
        end

        protected

        def set_controllers_scope
          var = @active_for_controllers
          @active_for_controllers = []
          var[:private].each do |controller|
            @active_for_controllers <<   "#{locale}/admin/"+controller
          end unless var[:private].nil?
          var[:public].each do |controller|
            @active_for_controllers <<   controller
          end unless var[:public].nil? 
        end
			end

      class ContextLink
        include ContextLinkRenderer
        attr_reader :label_i18n,:available_for,:priority,:path,:active_for_action

        def initialize(label_i18n="NoNameLink",options={})
          @label_i18n = label_i18n
          @priority = options[:priority] || 0
          @path = options[:link_path] || ""
          @arg = options[:link_arg] || ""
          @available_for = set_avaibility(options[:available_for] || "admin")
          @active_for_action = options[:active_for_action] || []
          @active_for_app_auth = options[:active_for_app_auth] || []
          @module_app_key = options[:module_app_key]
          @get_module_app = options[:get_module_app]
        end

        def get_module_app
          @get_module_app.call
        end

        def available_for
          @available_for
        end

        def set_avaibility(af)
          temp = []
          case af
          when 'users'
            temp << 'users'
            temp << 'sub_managers'
            temp << 'managers'
            temp << 'admin'
           when 'sub_managers'
            temp << 'sub_managers'
            temp << 'managers'
            temp << 'admin'
           when 'managers'
            temp << 'managers'
            temp << 'admin'
           when 'admin'
            temp << 'admin'
          end
          temp
        end

        def active?
          for_action = @active_for_action.blank? ? false : active_for_action?
          for_app_auth = @active_for_app_auth.blank? ? false : active_for_app_auth?
          for_action || for_app_auth
        end

        def active_for_action?
          @active_for_action[controller] == action
        end

        def get_active_action
          @active_for_action
        end

        def finalize!
          set_active_actions
        end

        protected

        def set_active_actions
          controller_action_hash = @active_for_action
          @active_for_action = Hash[controller_action_hash.map{|controller,action| ["#{locale}/admin/"+controller.to_s,action.to_s]}]
        end
      end
		end
	end
end