module  OrbitCoreLib
  module Preview
    def self.included(base)
      base.class_eval ("
        def to_preview
          raise 'Developer,please override to_preview method'  
        end
      ")
    end
  end

  module ObjectDisable
     def self.included(base)

      base.instance_eval("field :disable,type: Boolean,:default => false")
      base.instance_eval("scope :all, ->{ where(:disable.in => [false, nil, '']) }")
      base.instance_eval("scope :admin_manager_all, ->{ find(:all) }")
      
      base.define_singleton_method :find do |*args|
        if args ==[:all]
          unscoped
        else
          res = unscoped.find(args) 
          res.count == 1 ? res[0] : res
        end
      end

      base.define_singleton_method :first do |*args|
        all.first
      end

      base.define_singleton_method :last do |*args|
        all.last
      end

    end
  end

  module Authorize
    def self.included(base)
      base.class_eval do
        before_filter :can_use
        send :include, InstanceMethods
      end
    end

    module InstanceMethods
      protected
      def can_use
        @app_title ||= controller_path.split('/')[1].singularize rescue nil
        @module_app ||= ModuleApp.find_by(key: @app_title) rescue nil
        @module_app = ModuleApp.find(params[:module_app_id]) if @module_app.key == "category" || "tag" rescue nil
        if @module_app.nil?
          o = OrbitApp::Module::Registration.find_by_url(controller_path)
          @app_title = o.key rescue nil
          @module_app ||= ModuleApp.find_by(key: @app_title) rescue nil
        end
        @module_authorized_users ||= Authorization.module_authorized_users(@module_app.id).pluck(:user_id) rescue nil
        
        if current_user.nil? && !current_site.backend_openness_on
          redirect_to new_session_path 
          return
        end
        if !@module_app.nil?
           if @module_app.store_permission_granted || params["controller"] == "admin/authorizations"
              check_user_can_use
            else
              redirect_to admin_license_denied_path
            end
        else
          if current_user.nil? || !current_user.is_admin?
            if params["controller"] != "admin/assets"
              render "public/401"
            end
          end
        end
      end

      def check_user_can_use
        permissions = {}
        @module_app.get_registration.get_side_bar.get_context_links.each do |link|
          l = (Rails.application.routes.url_helpers.send(link.path) rescue Rails.application.routes.url_helpers.send(link.path, {:module_app_id => @module_app.id}))
          if l == request.path.sub("/" + I18n.locale.to_s,"")
           permissions["link"] = l 
           permissions["available_for"] = link.available_for
           break
         end
        end
        if !permissions.empty?
          if !allow?(permissions["available_for"] || ["admin"])
            render "public/401" , layout: "back_end" if !current_user.nil?
          end
        end
      end

       def allow?(af)
          if !current_user.nil? && current_user.is_approved?
            status = "users"
            if current_user.is_admin?
              status = "admin"
            elsif current_user.is_manager?(@module_app)
              status = "managers"
            elsif current_user.is_manager_with_role?(@module_app)
              status = "managers"
            elsif current_user.is_sub_manager?(@module_app)
              status = "sub_managers"
            elsif current_user.is_sub_manager_with_role?(@module_app)
              status = "sub_managers"
            elsif current_user.is_normal_user?
              status = "users"
            end
            return af.include?status
          else
            return false
          end
      end
    end
  end

end