class Ppa::Indicador < ApplicationRecord
	has_paper_trail

	belongs_to :programa
	belongs_to :unidade_de_medida

	validates_presence_of :programa_id, :nome, :ano_de_referencia, :unidade_de_medida_id

	validates_uniqueness_of :nome, scope: :programa_id

	validates_numericality_of :indice_de_referencia, greater_than: 0

	validate :programa_de_gestao_nao_tem_indicadores
	validate :ano_de_referencia_menor_que_ano_inicial_do_ppa
	validate :verifica_casas_decimais

	def programa_de_gestao_nao_tem_indicadores
		if	programa.present? && programa.tipo_de_programa.present? && programa.tipo_de_programa.codigo == 2
			errors[:programa_id] << "Programas de gestão não possuem indicadores"
		end
	end

	def ano_de_referencia_menor_que_ano_inicial_do_ppa
		if self.ano_de_referencia.present? && self.programa.present? && self.ano_de_referencia >= self.programa.ppa.exercicio_inicial
			errors[:ano_de_referencia] << "deve ser menor que o ano inicial do PPA"
		end
	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 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 o indice de referência deve ser inteiro.") if self[:indice_de_referencia].to_f - self[:indice_de_referencia].to_i > 0
		end
	end
end
