# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
class Profile < ActiveRecord::Base

	attr_accessible \
		:registered, # bool
		:mini_bio,
		:first_name, # str
		:last_name, # str
		:name,
		:phone, # str
		:address, # str
		:email, # str
		:city, # str
		:state_code, # str (eg. CA)
		:zip_code, # str
		:privacy_settings, # text [str]: XXX deprecated
		:picture, # str: either their social network pic or a stored pic on S3
		:anonymous, # bool: negates all privacy_settings
		:city_state,
		:user_id

	validates :email, format: {with: Email::Regex}, allow_blank: true

	attr_accessor :email, :city_state

	serialize :privacy_settings, Array

	mount_uploader :picture, ProfileUploader

	belongs_to :user
	has_many :activities # Activities this profile has created
	has_many :supporters
	has_many :donations
	has_many :campaigns
	has_many :events
	has_many :recurring_donations
	has_many :comments, as: :host, dependent: :destroy
	has_many :nonprofits, through: :supporters
	has_many :activities, dependent: :destroy
#	has_one :card, as: :holder

	#accepts_nested_attributes_for :card

	scope :non_anon, -> {where(anonymous: [nil, false])}

	before_validation(on: :create) do
		self.set_defaults
		self
	end

	def set_defaults
		self.name    ||= self.user.name    if self.user
		self.email   ||= self.user.email   if self.user
		self.picture ||= self.user.picture if self.user
		if self.name.blank? && self.first_name.present? && self.last_name.present?
			self.name    ||= self.first_name + ' ' + self.last_name
		end
	end

	# Queries

	def recent_donations(npo_id)
		self.donations.valid.order("created_at").where(nonprofit_id: npo_id).take(10)
	end

	# Attrs

	def total_given_to(nonprofit)
		self.donations.valid.where(nonprofit_id: nonprofit.id).pluck(:amount).sum
	end

	def monthly_giving(nonprofit_id)
		self.donations.where(nonprofit_id: nonprofit_id).map(&:amount).sum
	end

	def monthly_total_giving
		self.donations.map(&:amount).sum
	end

	def full_name
		"#{self.first_name} #{self.last_name}"
	end

	def supporter_name
		self.name.blank? ? "A Supporter" : self.name
	end

	def get_profile_picture(size=:normal)
		# Can be, in order of precedence: your uploaded photo, facebook picture, or
		# default image
		if self.user.picture
			return self.user.get_picture(size)
		else
			return self.picture_url(size)
		end
		# Either does not want photo shown or has none uploaded.
		return Image::DefaultProfileUrl
	end

	def url 
		Rails.application.routes.url_helpers.profile_path(self)
	end

	def as_json(options = {})
		h = super(options)
		h[:pic_tiny] = self.get_profile_picture :tiny
		h[:url] = self.url
		h
	end

	# Cache setters
	
	def set_caches!
		self.total_raised = self.donations.pluck(:amount).sum
		self.total_recurring = self.recurring_donations.active.pluck(:amount).sum
		self.save!
	end

end