# encoding: utf-8
# require "impressionist"
class Bulletin
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::MultiParameterAttributes
  include Sunspot::Mongo
  include Impressionist::Impressionable

  BelongsToCategory =  :bulletin_category
  include OrbitCoreLib::BelongsToCategoryMayDisable

  # include NccuSearch

  #scope :searchable,where(:is_checked=>true,:is_hidden=>false,:is_pending=>false)

  is_impressionable :counter_cache => { :column_name => :view_count }

  field :title, localize: true
  field :subtitle, localize: true
  field :text, localize: true

  has_and_belongs_to_many :tags, :class_name => "AnnouncementTag"

  field :postdate , :type => DateTime
  field :deadline , :type => DateTime
  # field :url
  field :cache_dept,type: Hash

  field :create_user_id
  field :update_user_id, :class_name => "User"
  
  field :is_top, :type => Boolean, :default => false
  field :is_hot, :type => Boolean, :default => false
  field :is_hidden, :type => Boolean, :default => false
  field :is_checked, :type => Boolean, :default => false
  field :is_pending, :type => Boolean, :default => true 
  field :is_rejected, :type => Boolean, :default => false 

  field :view_count, :type => Integer, :default => 0
  
  field :not_checked_reason
  
  field :public, :type => Boolean, :default => true
  
  scope :can_display, where(is_checked: true, is_rejected: false, is_pending: false)
  scope :available_for_lang, ->(locale){ where("available_for_#{locale}".to_sym => true) }

  mount_uploader :image, ImageUploader
  

  # belongs_to :unit_list_for_anc
  
  # embeds_many :bulletin_links, :cascade_callbacks => true
  # embeds_many :bulletin_files, :cascade_callbacks => true

  has_many :bulletin_links, :autosave => true, :dependent => :destroy
  has_many :bulletin_files, :autosave => true, :dependent => :destroy
  
  accepts_nested_attributes_for :bulletin_files, :allow_destroy => true
  accepts_nested_attributes_for :bulletin_links, :allow_destroy => true
  
  validates :title, :at_least_one => true

  before_save :check_deadline, :update_avliable_language, :clean_tags

  before_save :fetch_dept  
  after_save :save_bulletin_links
  after_save :save_bulletin_files

  searchable do
    text :titles do
      title_translations.to_a.collect{|t| t[1]}
    end
    text :texts do
      text_translations.to_a.collect{|t| Nokogiri::HTML(t[1]).text}
    end
    # text :text do
    #   a = (title_translations["zh_tw"] + title_translations["en"])
    #   a
    # end
    boolean :frontend_search do
      ( !is_hidden &&  !is_pending && is_checked && !is_rejected )
    end

    integer :view_count
    string :bulletin_category_id
    end

  def proc_check(check,not_pass_info = "")
    self.is_checked = true
      if check =="true"
        self.is_rejected = false
      elsif check == "false"
        self.is_rejected = true
        self.not_checked_reason = not_pass_info
      end
  end

  def de_pending
    self.is_pending = false
  end

  def de_pending!
    de_pending
    self.save!
  end

  def enabled_for_lang(lang)
    eval("self.available_for_#{lang}")
  end

  def publish_month
    published_at.strftime("%B %Y")
  end

  def self.search( search = nil, category_id = nil )
    if category_id.to_s.size > 0 and search.to_s.size > 0
      key = /#{search}/
      find(:all, :conditions => {title: key, bulletin_category_id: category_id}).desc( :is_top, :postdate )
    elsif category_id.to_s.size > 0 and search.to_s.size < 1
      find(:all, :conditions => {bulletin_category_id: category_id}).desc( :is_top, :postdate )
    elsif search.to_s.size > 0 and category_id.to_s.size < 1
      key = /#{search}/
      find(:all, :conditions => {title: key}).desc( :is_top, :postdate )
    else
      find(:all).desc( :is_top, :postdate)
    end
  end


  def self.widget_datas( category_id = nil )
  
    date_now = Time.now
 
   # find(:all, :conditions => {:postdate => {"$lte" => Date.today}, deadline: nil} ).desc( :is_top, :postdate)
   # where( :postdate.lte => date_now ).where( :deadline => nil ).desc(:is_top, :postdate)
   # any_of({ :title => "test" },{:deadline => nil, :title => "123"})
   
   if category_id.to_s.size > 0
     find(:all, :conditions => {bulletin_category_id: category_id}).any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate)
   else
     any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate)
   end
   
  end

  def is_expired?
    Date.today > self.deadline ? true : false  rescue false
    #some dates might sat as nil so rescue false
  end

  def is_top?
    self.is_top
  end
  
  def is_hot?
    self.is_hot
  end
  
  def is_hidden?
    self.is_hidden
  end

  def is_checked?
    !self.is_pending && self.is_checked && (self.is_rejected == false)
  end
  
  def is_pending?
    self.is_pending
  end
  
  def is_rejected?
    !self.is_pending && self.is_rejected && (self.is_rejected == true)
  end
  
  
  def save_bulletin_links
	self.bulletin_links.each do |t|
	  if t.should_destroy
		t.destroy
	  end
    end
  end
  
  def save_bulletin_files
	self.bulletin_files.each do |t|
	  if t.should_destroy
		t.destroy
	  end
    end
  end

  def self.filter(bulletins)
    bulletins.each do |bulletin|
      p "#{bulletin.id}/#{bulletin.is_top}/#{bulletin.is_hot}/#{bulletin.is_hidden}"
    end
    return nil
  end

  def sorted_tags
    tags.order_by(I18n.locale, :asc)
  end
  
  protected
  
  def check_deadline
    if(!self.deadline.nil? and (self.deadline < self.postdate ))
      self.deadline = nil
    end
  end
  
  def update_avliable_language
    VALID_LOCALES.each  do |locale|
      if (title_translations[locale].blank? rescue true)
        self["available_for_#{locale}".to_sym] = false 
      else
        self["available_for_#{locale}".to_sym] = true
      end
    end
  end
  
  def fetch_dept
    self.cache_dept =  (User.find(self.create_user_id).cache_dept rescue nil) if self.new_record?
  end

  def clean_tags
    self.tag_ids.delete('')
  end

end