class Ppa::SubAreaTematica < ApplicationRecord
	has_paper_trail

	belongs_to :area_tematica
	belongs_to :funcao

	has_many :propostas, dependent: :restrict_with_exception
	has_many :convenios
	has_many :valores_do_convenio, through: :convenios

	validates_presence_of :area_tematica_id, :funcao_id, :nome
	validates_uniqueness_of :nome, scope: :area_tematica_id
	validate :funcao_deve_pertencer_ao_mesmo_ppa_da_area_tematica

	def total_geral_de_previsao_de_convenios_por_exercicio exercicio
		return self.valores_do_convenio.select { |c| c.exercicio.eql?(exercicio) }.inject(0){|total, valor_do_convenio| total + valor_do_convenio.valor.to_f}
	end

	def total_geral_de_previsao_de_convenios
		return self.convenios.inject(0){ |total, convenio| total + convenio.valor.to_f }
	end

	def area_tematica_e_nome
		self.area_tematica.try(:nome).to_s + " / " + self.nome
	end

	def total_de_votos_das_propostas_por_sub_area_tematica
		return self.propostas.votaveis.inject(0) { |total, proposta| total + proposta.total_de_votos.to_i }
	end

	def percentual_de_votos_da_sub_area_tematica
		return self.area_tematica.ppa.total_de_votos_das_propostas_do_ppa_participativo.to_i > 0 ? ( (self.total_de_votos_das_propostas_por_sub_area_tematica * 100) / self.area_tematica.ppa.total_de_votos_das_propostas_do_ppa_participativo.to_f ).round(2) : 0.0
	end

	def total_geral_de_previsao_de_convenios_por_exercicio exercicio
		return self.valores_do_convenio.select { |c| c.exercicio.eql?(exercicio) }.inject(0){|total, valor_do_convenio| total + valor_do_convenio.valor.to_f}
	end

	def total_previsao_de_convenios_correntes_por_exercicio exercicio
		return self.valores_do_convenio.convenios_correntes.select { |c| c.exercicio.eql?(exercicio) }.inject(0){|total, valor_do_convenio| total + valor_do_convenio.valor.to_f}
	end

	def total_previsao_de_convenios_de_capital_por_exercicio exercicio
		return self.valores_do_convenio.convenios_de_capital.select { |c| c.exercicio.eql?(exercicio) }.inject(0){|total, valor_do_convenio| total + valor_do_convenio.valor.to_f}
	end

	private
	def funcao_deve_pertencer_ao_mesmo_ppa_da_area_tematica
		if funcao.try(:ppa_id) != area_tematica.try(:ppa_id)
			errors[:funcao_id] << "deve pertencer ao mesmo PPA da Área Temática"
		end
	end
end
