class SeminarSubmissionValue
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Attributes::Dynamic
  include ::AttributeValuesHelper
  include ::Admin::SeminarsValuesHelper

  field :key, type: String
  field :val
  belongs_to :seminar_submission_field
  belongs_to :seminar_signup_contribute
  before_save :check_key
  before_save :data_proc
  after_save do
    if (self.seminar_submission_field.markup == "seminar_preferred_session" rescue false) && self.seminar_signup_contribute
      val_change = self.val_change
      self.seminar_signup_contribute.update(:preferred_session=>val.to_i)
      self.seminar_signup_contribute.seminar_signup.set_preferred_sessions
      unless val_change.nil?
        old_val = val_change[0]
        new_val = val_change[1]
        seminar_signup_id = self.seminar_signup_contribute.seminar_signup_id.to_s
        seminar_sessions = self.seminar_submission_field.seminar_main.seminar_sessions.to_a
        old_seminar_session = seminar_sessions.select{|ss| ss.key.to_s == old_val}.first
        if old_seminar_session
          old_seminar_session.default_seminar_signup_ids.delete seminar_signup_id
          old_seminar_session.save
        end
        new_seminar_session = seminar_sessions.select{|ss| ss.key.to_s == new_val}.first
        if new_seminar_session
          new_seminar_session.default_seminar_signup_ids << seminar_signup_id
          new_seminar_session.save
        end
      end
    end
  end
  def add_more_counter
    index_max = self["val"].count rescue 0
    index_max == 0 ?   1 : index_max
  end

  def value(index = nil)
  	site = Site.first
    result = case self.seminar_submission_field.markup
      when 'text_field','text_area'
        if self.seminar_submission_field.add_more and (self.seminar_submission_field.markup == "text_field")
          index.nil? ? self["val"] : self["val"][index]
        else
          self.seminar_submission_field.get_data["cross_lang"] =="true" ?  self["val"] : Hash[site.valid_locales.collect{|lang|  [lang,self[lang.to_sym]]}]
        end
      when 'select','radio_button','address','seminar_preferred_session'
        self["val"]
      when 'date'
          if !self["val"].blank? and !self["val"]['(1i)'].blank?
            "#{self["val"]['(1i)']}/#{self["val"]['(2i)']}/#{self["val"]['(3i)']}"
          else
            self["val"]
          end
      when 'checkbox'
        self["val"]
    end #end of case self.seminar_submission_field.markup
  end

  def value=(value)
    #save everything to temp_data waiting for futher process
    self[:temp_data] = value
  end

  def get_field_value
    seminar_submission_field = self.seminar_submission_field
    if (seminar_submission_field.markup.eql?("text_field") || seminar_submission_field.markup.eql?("text_area"))
      if self.value.class == String
        field_value = self.value
      else
        field_value = self.value[I18n.locale]
      end
    elsif (seminar_submission_field.markup.eql?("select") || seminar_submission_field.markup.eql?("radio_button"))
      field_value = seminar_submission_field.markup_value["#{self.value}"][I18n.locale] rescue nil
    elsif  seminar_submission_field.markup.eql?("seminar_preferred_session")
      field_value = seminar_submission_field.seminar_main.summary_chioices[self.value.to_i] rescue nil
    elsif seminar_submission_field.markup.eql?("address")
      field_value = rf[:address_key][I18n.locale].map{|k,v| v}.delete_if(&:blank?).join(', ')
    elsif seminar_submission_field.markup.eql?("date")
      case seminar_submission_field.typeC['format']
      when 'format1'
        field_value = self.value.to_date.strftime("%Y/%m/%d")
      when 'format2'
        field_value = self.value.to_date.strftime("%Y/%m/%d")
      when 'format3'
        field_value = self.value.to_date.strftime("%Y/%m")       
      when 'format4'
        field_value = self.value.to_date.strftime("%Y")  
      end
    elsif seminar_submission_field.markup.eql?("checkbox")
      field_value = self.value.map {|v| seminar_submission_field.markup_value["#{v}"][I18n.locale]}.join(', ') rescue nil
    end

    field_value = (field_value =~ /\A#{URI::regexp(['http', 'https'])}\z/) ? "<a href='#{field_value}' target='blank'>#{field_value}</a>" : field_value
    field_value = (field_value =~ /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i) ? "<a href='mailto:#{field_value}'>#{field_value}</a>" : field_value

    if !field_value.blank?
    {
      "key" => seminar_submission_field.key,
      "title" => seminar_submission_field.title,
      "value" => field_value,
      "val" => field_value = self.value
    }
    else
      {
        "key" => seminar_submission_field.key,
        "title" => seminar_submission_field.title,
        "value" => "",
        "val" => field_value = self.value
      }
    end
  end

  def get_value_by_locale(locale,add_more_index=nil)
    seminar_submission_field = self.seminar_submission_field
    case seminar_submission_field.markup
      when "text_field"
        case seminar_submission_field.add_more
        when true
          if seminar_submission_field.locale
            add_more_index.nil? ? self.value.collect{|t| t[locale.to_s]}.join(",") : self.value(add_more_index)[locale]
          else
            add_more_index.nil? ? self.value.join(",") : self.value(add_more_index)
          end
          
        when false
          seminar_submission_field.locale ? self[locale.to_s]  : self.value
        end

      when "select"
        markup_values = seminar_submission_field.self_defined_markup_options? ? seminar_submission_field.markup_value : self.seminar_submission_field.markup_value
        markup_values[self.value][locale.to_s] rescue 'NoData'

      when "text_area"
        seminar_submission_field.locale ? self[locale.to_s]  : self.value

      when "date"
        if seminar_submission_field.date_is_range?
          get_date_by_format(:from) + ' ~ '  + get_date_by_format(:to)
          # self.value["from"] + ' ~ ' + self.value["to"]
        else
          get_date_by_format  
          # self.value
        end

      when "address"
        self.value[locale.to_s]

      when "radio_button"
        markup_values = seminar_submission_field.markup_value
        markup_values[self.value][locale.to_s]
      when "seminar_preferred_session"
        seminar_submission_field.seminar_main.summary_chioices[self.value.to_i] rescue nil
      when "checkbox" 
        markup_values = seminar_submission_field.markup_value
        self.value.collect{|key| markup_values["#{key}"][I18n.locale]}.join(",")
      when "date_durnation"
        self.value

      else
        seminar_submission_field.locale ? self[locale.to_s]  : self.value
    end
  end

  def get_date(item = nil)
    case item
    when :from
      # data = self[:val]["from"]
      data = self.value["from"]
    when :to
      # data = self[:val]["to"]
      data = self.value["to"]
    when nil
      # data = self[:val]
      data = self.value
    end

    # Date.new(data["(1i)"].to_i,data["(2i)"].to_i,data["(3i)"].to_i) rescue nil
  end

  def self.put_field_values(member, field_value_param, field_value_id=nil,field_value_status)
    if field_value_status.eql?(true)
      @seminar_submission_field_value = self.find(field_value_id) rescue nil
      @seminar_submission_field_value.update(field_value_param) rescue nil
      @seminar_submission_field_value.save rescue nil
    else
      @seminar_submission_field_value = member.seminar_submission_values.build(field_value_param) rescue nil
      @seminar_submission_field_value.save
    end
    return @seminar_submission_field_value
  end


protected
  
def unset_all_lang_values
  VALID_LOCALES.each{|t| self.unset t}
end

  def data_proc
    seminar_submission_field = self.seminar_submission_field
    unless self[:temp_data].nil?
      case seminar_submission_field.markup
        when "address"
           self["val"] = self["temp_data"]
        when 'text_field','text_area'
          if seminar_submission_field.add_more
            self["val"] = self["temp_data"]
          else # if not add_more
            if seminar_submission_field.can_muti_lang_input?
                self[:temp_data].each do |key,val| 
                  self[key] = val
                  end if(!seminar_submission_field.get_data[:cross_lang]) 
              else
                self["val"] = self[:temp_data]
            end
          end # of self.seminar_submission_field.add_more
         
        when 'select','date','radio_button','seminar_preferred_session'
          self["val"] = self[:temp_data]
        when 'checkbox'
          self["val"] = self[:temp_data].keys 
      end #end of case self.seminar_submission_field.markup  
    end # of self[:temp_data].nil?
    self.unset('temp_data')
    self.unset('temp')
  end #of data_proc

  def check_key
    if self.seminar_submission_field_id.present? && self.seminar_submission_field.nil?
      begin
        self.seminar_submission_field = SeminarSubmissionField.find(self.seminar_submission_field_id)
      rescue
        nil
      end
    end
    self.key = self.seminar_submission_field.key rescue nil
  end

  def method_missing(*field)
    if field.size < 1
      self[field[0]]  
    else
      self[(field[0].to_s.delete "=")] = field[1]
    end
  end
end