module OrbitCategory
  module Categorizable

    def self.included(base)
      base.extend ClassMethods
      base.class_eval 'categorizable'
    end

    module ClassMethods

      def categorizable
        class_eval do
          field :category_id, type: BSON::ObjectId
          has_one :buffer_category, as: :categorizable, autosave: true, dependent: :destroy
          accepts_nested_attributes_for :buffer_category, allow_destroy: true
        end
        send :include, InstanceMethods
      end
    end

    module InstanceMethods

      def remove_id(id)
        self.update_attribute(:category_id, id)
      end

      def category
        self.buffer_category.category if self.buffer_category
      end

      def category=(id)
        self.buffer_category.destroy if self.buffer_category
        self.build_buffer_category(category_id: id)
        self.write_attribute(:category_id, id)
      end

      def category_id=(id)
        self.category = id
      end

      def disable?
        category.disable?
      end

    end

  end

end
