# encoding: utf-8
require "orbit_form_helper"
class SeminarReview

  include Mongoid::Document
  include Mongoid::Timestamps

  field :review_start_date, :type => Date, :default => Time.now #Already move to seminar_main
  field :review_end_date, :type => Date, :default => Time.now #Already move to seminar_main
  field :reviewer_id
  field :seminar_signup_ids, :type => Array, :default => []
  field :remove_seminar_signup_ids, :type => Array, :default => []
  field :seminar_signup_contribute_ids, :type => Array, :default => []
  field :remove_seminar_signup_contribute_ids, :type => Array, :default => []
  field :default_seminar_signup_ids, :type => Array, :default => []
  field :default_topics, :type => Array, :default => []
  field :default_topics_values, :type => Array, :default => []
  field :final_session
  field :session_ids
  field :seminar_session_ids
  belongs_to :seminar_main
  after_initialize do
    unless self.new_record? || @triggered_initialize
      @triggered_initialize = true
      save_flag = false
      destroy_flag = false
      if (self.reviewer_id.class == Array rescue false)
        reviewer_ids = self.reviewer_id[1..-1]
        reviewer_ids.each do |reviewer_id|
            self.class.create(:reviewer_id=>reviewer_id,:seminar_main_id=>self.seminar_main_id)
        end
        self.reviewer_id = self.reviewer_id.first
        save_flag = true
      elsif self[:reviewer_id].nil?
        self.destroy
        destroy_flag = true
      end
      if !destroy_flag
        if (self.session_ids.nil? rescue true)
          session_ids = []
          self.default_topics.each_with_index do |t,i|
            next if t != "seminar_signup_contributes.description"
            session_ids << self.default_topics_values[i]
          end
          session_ids = session_ids.flatten.map{|i| i.to_i}
          self.session_ids = session_ids
          save_flag = true
        end
        if self.seminar_session_ids.nil? && self.session_ids.class == Array
          self.seminar_session_ids = SeminarSession.where(:seminar_main_id=>self.seminar_main_id,:key.in=>self.session_ids).pluck(:id) rescue nil
          save_flag = true
        end
        self.save(:validate=>false) if save_flag
      end
    end
  end
  before_save do
    default_seminar_signup_ids = []
    self.session_ids = []
    self.default_topics.each_with_index do |topic,i|
      fn,id = (topic.split(".") rescue [])
      next if fn.nil?
      if fn == "seminar_signup_fields"
        default_seminar_signup_ids += SeminarSignupValue.where(:seminar_signup_field_id=>id,:val.in=>self.default_topics_values[i].to_a).pluck(:seminar_signup_id)
      elsif fn == "seminar_submission_fields"
        seminar_signup_contribute_ids = SeminarSubmissionValue.where(:seminar_submission_field_id=>id,:val.in=>self.default_topics_values[i].to_a).pluck(:seminar_signup_contribute)
        default_seminar_signup_ids += SeminarSignupContribute.where(:id.in=>seminar_signup_contribute_ids).pluck(:seminar_signup_id)
      elsif fn == "seminar_signup_contributes"
        seminar_signup_ids_from_contribute = SeminarSignupContribute.where(:description.in=>self.default_topics_values[i].to_a).pluck(:seminar_signup_id)
        seminar_signup_ids_from_contribute = seminar_signup_ids_from_contribute & (SeminarSignup.where(:seminar_main_id=>self.seminar_main_id).pluck(:id) rescue [])
        default_seminar_signup_ids += seminar_signup_ids_from_contribute
        self.session_ids =  self.session_ids.concat(self.default_topics_values[i].map{|v| v.to_i})
      end
    end
    self.seminar_session_ids = SeminarSession.where(:seminar_main_id=>self.seminar_main_id,:key.in=>self.session_ids.to_a).pluck(:id) rescue []
    default_seminar_signup_ids.uniq!
    default_seminar_signup_ids = default_seminar_signup_ids.map{|s| s.to_s}
    self.default_seminar_signup_ids = default_seminar_signup_ids
  end
  def review
    MemberProfile.find(self.reviewer_id) rescue nil
  end
  def get_all_seminar_signup_ids(mode = nil)
    if (self.default_topics.include?("seminar_signup_contributes.description") && self.seminar_main.assign_mode != 0) || mode != 0
      final_assign_signup_ids = SeminarSession.where(:id.in=>self.seminar_session_ids).pluck(:seminar_signup_ids).flatten.map{|id| id.to_s} rescue []
      default_seminar_signup_ids = SeminarSession.where(:id.in=>self.seminar_session_ids).pluck(:default_seminar_signup_ids).flatten
      default_seminar_signup_ids = SeminarSignup.where(:seminar_session_id=>nil,:id.in=>default_seminar_signup_ids).pluck(:id).map{|id| id.to_s} rescue []
      result = final_assign_signup_ids + default_seminar_signup_ids + self.seminar_signup_ids - self.remove_seminar_signup_ids
      result = result.uniq
    else
      result = all_seminar_signup_ids
    end
    result
  end
  def all_seminar_signup_ids
    result = self.seminar_signup_ids - self.remove_seminar_signup_ids + self.default_seminar_signup_ids
    result.uniq
  end
  def append_default_signup_id(signup_id)
    sid = signup_id.to_s
    unless self.default_seminar_signup_ids.include?(sid)
      self.default_seminar_signup_ids << sid
    end
  end
  def fix_assign
    seminar_signups = SeminarSignup.where(:id.in=>self.seminar_signup_ids)
    self.seminar_signup_ids = seminar_signups.pluck(:id).map{|id| id.to_s}
    seminar_signups = seminar_signups.to_a
    self.seminar_signup_contribute_ids = seminar_signups.map{|ss| ss.seminar_signup_contribute_ids}.flatten.map{|id| id.to_s}
    
    remove_seminar_signups = SeminarSignup.where(:id.in=>self.remove_seminar_signup_ids)
    self.remove_seminar_signup_ids = remove_seminar_signups.pluck(:id).map{|id| id.to_s}
    remove_seminar_signups = remove_seminar_signups.to_a
    self.remove_seminar_signup_contribute_ids = remove_seminar_signups.map{|ss| ss.seminar_signup_contribute_ids}.flatten.map{|id| id.to_s}
    
    self.save
  end
  def clear_all_assign
    self.seminar_signup_ids = []
    self.remove_seminar_signup_ids = []
    self.seminar_signup_contribute_ids = []
    self.remove_seminar_signup_contribute_ids = []
    self.save
  end
end
