class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :confirmable,
    :recoverable, :rememberable, :trackable, :validatable

  has_many :personal_profiles, dependent: :destroy
  has_many :lectures
  has_many :workshops
  has_many :propositions, foreign_key: :proposer_id
  has_many :events, through: :propositions, source: :proposable, source_type: "Event"
  has_many :feedbacks, through: :events
  has_many :feedbacks_with_comment, -> { where.not(comment: [nil, '']) }, through: :events

  has_many :participations, foreign_key: :participant_id
  has_many :events_participated_in, through: :participations, source: :event
  has_many :volunteerships, foreign_key: :volunteer_id

  include FeedbackReceiving

  def average_rating
    return nil unless rated?
    ratings_per_event = feedbacks.group(:feedback_receiving_type,
                                        :feedback_receiving_id).average(:rating).values
    BigDecimal(ratings_per_event.reduce(&:+)) / BigDecimal(ratings_per_event.size)
  end

  def find_or_build_personal_profile(conference, params = {})
    current_profile = personal_profile(conference)
    if current_profile.present?
      current_profile.assign_attributes params
      current_profile
    else
      build_personal_profile(conference, params)
    end
  end

  def build_personal_profile(conference, params = {})
    if personal_profiles.last.present?
      new_personal_profile = personal_profiles.last.try(:dup)
      CopyCarrierwaveFile::CopyFileService.new(personal_profiles.last, new_personal_profile, :picture).set_file
    else
      new_personal_profile = personal_profiles.build
    end
    new_personal_profile.conference = conference
    new_personal_profile.assign_attributes params
    new_personal_profile
  end

  def personal_profile(conference)
    personal_profiles.find_by(conference_id: conference.id)
  end

  default_scope { order id: :desc }

  def toggle_admin!
    update admin: !admin
  end
end