class ModuleApp
  include Mongoid::Document
  include Mongoid::Timestamps
  include OrbitCoreLib::ObjectTokenUnility

  field :key
  field :title
  field :version
  field :organization
  field :author
  field :intro
  field :update_info
  field :create_date
  field :enable_frontend, type: Boolean, :default => true
  
  field :app_pages ,type: Array
  # field :widgets ,type: Array
  field :widgets ,type: Hash
  field :widget_fields ,type: Array
    
  has_many :managers,as: :managing_app ,:class_name => "AppManager" ,:dependent => :destroy#,:foreign_key => "managing_app_id",:inverse_of => :managing_app
  has_many :sub_managers,as: :sub_managing_app ,:class_name => "AppManager", :dependent => :destroy#,:foreign_key => "sub_managing_app_id",:inverse_of => :sub_managing_app
  
  has_many :tags
  has_many :page_parts
  has_many :pages
  
  has_one :app_auth,dependent: :delete
  
  before_save :set_key
  
  def is_manager?(user)
    managing_users.include?(user)
  end
  
  def is_sub_manager?(user)
    sub_managing_users.include?(user) || is_manager?(user)
  end
  
  def managing_users
    self.managers.collect{ |t| t.user }
  end
  
  def sub_managing_users
    self.sub_managers.collect{ |t| t.user }
  end
  
  def assign_manager(user,assigner)
    manager = AppManager.first(conditions: {managing_app_id: self.id,user_id: user.id}) rescue nil    
    if manager.nil? 
      manager = self.managers.create(:user_id => user.id,:rule_creator_id => (assigner.id rescue nil))
    end
    manager
  end
  
  def assign_sub_manager(user,assigner)
    submanager = AppManager.first(conditions: {sub_managing_app_id: self.id,user_id: user.id}) rescue nil
    if submanager.nil? && !self.managing_users.include?(user)
      submanager = self.sub_managers.create(:user_id => user.id,:rule_creator_id => (assigner.id rescue nil) )
    end
    submanager
  end
  
  def remove_manager(user)
    manager = AppManager.first(conditions: {managing_app_id: self.id,user_id: user.id}) rescue nil
    if manager
      manager.destroy
    else
      false
    end
  end
  
  def remove_sub_manager(user)
    submanager = AppManager.first(conditions: {sub_managing_app_id: self.id,user_id: user.id}) rescue nil
    if submanager
      submanager.destroy
    else
      false
    end
  end
  
  protected
  
  def set_key
    self.key = self.title.underscore.singularize if self.title
  end

  
end