class Ppa::Quantitativo < ApplicationRecord
	has_paper_trail

	belongs_to :meta, inverse_of: :quantitativos
	belongs_to :unidade_de_medida

	validates_presence_of :unidade_de_medida_id
	validates_presence_of :meta, :exercicio
	validates_uniqueness_of :exercicio, scope: :meta_id
	validates :meta_id, immutable: true
	validates :exercicio, immutable: true
	validates_numericality_of :exercicio, greater_than_or_equal_to: Proc.new{ |quantitativo| quantitativo.ppa.exercicio_inicial }, less_than_or_equal_to: Proc.new{ |quantitativo| quantitativo.ppa.exercicio_final }

	validate :quando_unidade_de_medida_for_percentual_as_metas_fisicas_devem_somar_cem_porcento, if: Proc.new{|quantitativo| quantitativo.unidade_de_medida.present? && quantitativo.unidade_de_medida.descricao.eql?('%')}
	validate :verifica_casas_decimais

	def ppa
		meta.objetivo.programa.ppa if meta.present?
	end

	def percentual?
		unidade_de_medida.present? && unidade_de_medida.descricao.to_s == "%" ? true : false
	end

	def indice_de_referencia
		if (unidade_de_medida.present? && unidade_de_medida.utiliza_casa_decimal) || percentual?
			self[:indice_de_referencia].to_f
		else
			self[:indice_de_referencia].to_i
		end
	end

	private
	def quando_unidade_de_medida_for_percentual_as_metas_fisicas_devem_somar_cem_porcento
		errors.add(:indice_de_referencia, 'a soma do valor dos quatro exercícios deve ser 100%') if meta.valor_total_dos_quantitativos != 100
	end

	def verifica_casas_decimais
		unless (unidade_de_medida.present? && unidade_de_medida.utiliza_casa_decimal) || percentual?
			errors.add(:indice_de_referencia, "Para essa unidade de medida valor deve ser inteiro.") if self[:indice_de_referencia].to_f - self[:indice_de_referencia].to_i > 0
		end
	end
end
