module ArchiveModel
  module Cache
    require 'active_support/concern'
    extend ActiveSupport::Concern
    included do
      after_save :cache_tag_ids, :do_before_save
      after_destroy :do_before_save
      before_destroy :cache_tag_ids
    end
    def cache_tag_ids
      if !@skip_callback && self.class == ArchiveFile
        @tag_ids = self.tag_ids
        @org_tag_ids = self.org_tag_ids
        @category_id = self.category_id
        @org_category_id = self.org_category_id
      end
    end
    def do_before_save
      unless @skip_callback
        if self.class == SubPart
          ArchiveCache.where(parent_id: /^#{self.id}/).delete
        elsif self.class == ArchiveFile || (self.class == Page && self.module == "archive")
          if self.class == ArchiveFile
            tmp_tag_ids = (Array(@tag_ids) + Array(@org_tag_ids)).uniq
            tmp_cat_ids = (Array(@category_id) + Array(@org_category_id)).uniq
            Thread.new do
              ArchiveFileFeedCache.where(:uid.in => ArchiveFileFeed.any_of([{:tag_ids.in => tmp_tag_ids.collect{|v| v.to_s}},{:category_ids.in => tmp_cat_ids.collect{|v| v.to_s}}]).pluck(:uid)).each do |cache|
                cache.regenerate
              end
            end
          end
          ArchiveCache.all.delete
        end
      end
    end
  end
end