class Site
  
  METAS = ['description', 'keywords']

  include Mongoid::Document
  include Mongoid::Timestamps
  
  field :in_use_locales, :type => Array
  field :valid_locales, :type => Array
  
  field :roaming_id
  field :private_key, :type => Binary
  field :public_key, :type => Binary
  field :title_always_on, :type => Boolean, :default => false

  field :mail_settings, :type => Hash
  
  field :school
  field :department

  field :search,:type => Hash

  has_one :title, :class_name => "I18nVariable", :as => :language_value, :autosave => true, :dependent => :destroy
  has_one :footer, :class_name => "I18nVariable", :as => :language_value, :autosave => true, :dependent => :destroy
  has_one :sub_menu, :class_name => "I18nVariable", :as => :language_value, :autosave => true, :dependent => :destroy
  has_many :site_metas, :autosave => true, :dependent => :destroy
  
  before_save :set_key

  def generate_keys
    private_key = OpenSSL::PKey::RSA.generate(2048)
    self.public_key = private_key.public_key.to_s
    self.private_key = private_key.to_s
  end
  
  def registered?
    !self.roaming_id.blank?
  end
  
  def up_to_date?
    res = res.split('rails_3_1').pop.gsub('(', '').gsub(')','').strip rescue nil
    res.eql?('local out of date') ? false : true
  end

  def title
    @title ||= I18nVariable.first(:conditions => {:key => 'title', :language_value_id => self.id, :language_value_type => self.class}) rescue nil
  end

  def footer
    @footer ||= I18nVariable.first(:conditions => {:key => 'footer', :language_value_id => self.id, :language_value_type => self.class}) rescue nil
  end

  def sub_menu
    @sub_menu ||= I18nVariable.first(:conditions => {:key => 'sub_menu', :language_value_id => self.id, :language_value_type => self.class}) rescue nil
  end

  METAS.each do |meta|
    define_method meta do
      fetch_meta = self.site_metas.where(key: meta).limit(1)
      fetch_meta.blank? ? nil : fetch_meta[0].i18n_variable
    end
    define_method "#{meta}=" do |values|
      if a = self.send(meta)
        a.update_attributes(values)
      else
        a = self.site_metas.build(key: meta)
        a.build_i18n_variable(values)
      end
    end
  end

  protected
  
  def set_key
    title.key = 'title' if title && (title.key.blank? rescue true)
    footer.key = 'footer' if footer && (footer.key.blank? rescue true)
    sub_menu.key = 'sub_menu' if sub_menu && (sub_menu.key.blank? rescue true)
  end
  
end