class Attachment < ApplicationRecord
  include BaseModel
  include Publicable
  include Publishable
  include Lockable

  belongs_to :container, polymorphic: true, touch: true, optional: true
  belongs_to :author, class_name: "User", foreign_key: :author_id
  belongs_to :course, foreign_key: :container_id, optional: true
  has_many :attachment_group_settings, :dependent => :destroy
  has_many :attachment_histories, -> { order(version: :desc) }, :dependent => :destroy

  scope :by_filename_or_user_name,      -> (keywords) { joins(:author).where("filename like :search or LOWER(concat(users.lastname, users.firstname)) LIKE :search",
                                                        :search => "%#{keywords.split(" ").join('|')}%") unless keywords.blank? }
  scope :by_keywords,                   -> (keywords) { where("filename LIKE ?", "%#{keywords.split(" ").join('|')}%") unless keywords.blank? }
  scope :ordered,                       -> (opts = {}) { order("#{opts[:sort_type]} #{opts[:sort] == 1 ? 'asc': 'desc'}") }
  scope :by_course_second_category_id,  -> (course_second_category_id = 0) { where(course_second_category_id: course_second_category_id) }
  scope :contains_only_course,          -> { where(container_type: 'Course') }
  scope :contains_only_project,         -> { where(container_type: 'Project') }
  scope :contains_course_and_project,   -> { contains_only_course.or(contains_only_project) }
  scope :mine,                          -> (author_id) { where(author_id: author_id) }
  scope :simple_columns,                -> { select(:id, :filename, :filesize, :created_on, :cloud_url, :author_id) }
  scope :search_by_container,           -> (ids) {where(container_id: ids)}

  validates_length_of :description, maximum: 100

  def diskfile
    File.join(File.join(Rails.root, "files"), disk_directory.to_s, disk_filename.to_s)
  end

  def title
    filename
  end

  def downloads_count
    downloads
  end

  def quotes_count
    quotes.nil? ? 0 : quotes
  end

  def self.associate_container(ids, container_id, container_type, attachtype=1)
    return false  if ids.blank? || !ids.is_a?(Array)
    ids.each do |id|
      attachment = Attachment.find id
      attachment.update_attributes(container_id: container_id, container_type: container_type, attachtype: attachtype)
    end
  end

  # Returns an unsaved copy of the attachment
  def copy(attributes=nil)
    copy = self.class.new
    copy.attributes = self.attributes.dup.except("id", "downloads", "quotes")
    copy.attributes = attributes if attributes
    copy
  end

  def set_publish_time(publish_time)
    self.unified_setting = 1
    if publish_time.blank?
      self.publish_time = Time.now
      self.is_publish = 1
    else
      self.is_publish = publish_time.to_s > (format_time Time.now).to_s ? 0 : 1
      self.publish_time = publish_time.to_s > (format_time Time.now).to_s ? publish_time : Time.now
    end
  end

  def set_course_group_publish_time(course, course_group_publish_times)
    self.unified_setting = 0
    min_publish_time = ""
    course_group_publish_times.each do |obj|
      if obj && obj[:course_group_id]
        publish_time = obj[:publish_time]
        if !publish_time.blank? && publish_time < min_publish_time
          min_publish_time = publish_time
        elsif publish_time.blank?
          publish_time = Time.now
        end
        attachment_group_setting = self.attachment_group_settings.where(course_group_id: obj[:course_group_id], course_id: course.id).first
        if attachment_group_setting.present?
          attachment_group_setting.update_columns(publish_time: publish_time)
        else
          self.attachment_group_settings.create(
              :course_group_id => obj[:course_group_id],
              :course_id => course.id,
              :publish_time => publish_time
          )
        end
      end
    end
    self.is_publish = min_publish_time > (format_time Time.now).to_s ? 0 : 1
    self.publish_time = min_publish_time > (format_time Time.now).to_s ? min_publish_time : self.created_on
  end

  def become_history
    history = self.attachment_histories.first
    new_attachment_history = AttachmentHistory.new(self.attributes.except("id", "resource_bank_id", "unified_setting", "course_second_category_id").merge(
        attachment_id: self.id,
        version: history.nil? ? 1 :  history.version + 1,
    ))
    new_attachment_history
  end

  def copy_attributes_from_new_attachment(new_attachment)
    self.attributes = new_attachment.attributes.dup.except("id","container_id","container_type","is_public","downloads", "quotes",'is_publish','publish_time')
  end

  def set_public(is_public)
    if is_public == true
      is_public = 1
    elsif is_public == false
      is_public = 0
    end
  end

end