module OrbitModel

  module TimeFrame

    def self.included(base)
      base.extend ClassMethods
      base.class_eval do
        field :postdate , :type => DateTime
        field :deadline , :type => DateTime
        before_save :check_deadline
        query = {type: 'any_of', conditions: "{deadline: nil, :postdate.lte => Time.now} , {:deadline.gte => Time.now, :postdate.lte => Time.now}"}
        if class_variable_defined?(:@@can_display)
          class_variable_set(:@@can_display, (class_variable_get(:@@can_display) << query))
        else
          class_variable_set(:@@can_display, [query])
        end
        send :include, InstanceMethods
      end
    end

    module InstanceMethods

      def is_expired?
        Date.today > self.deadline ? true : false  rescue false
      end
      
      private

      def check_deadline
        if(!self.deadline.nil? and (self.deadline < self.postdate ))
          self.deadline = nil
        end
      end
      
    end

    module ClassMethods

      define_method(:can_display) do
        final_query = class_variable_get(:@@can_display).inject('') do |result, query_hash|
          result << "." if result.present?
          result << "#{query_hash[:type]}(#{query_hash[:conditions]})"
          result
        end
        eval(final_query)
      end unless method_defined? :can_display

    end

  end

end