class Ppa::UnidadeOrcamentaria < ApplicationRecord
	include IncrementadorDeCodigoConcern

	has_paper_trail

	belongs_to :orgao
	has_many :iniciativas, dependent: :restrict_with_exception
	has_many :convenios, dependent: :restrict_with_exception
	has_many :valores_do_convenio, through: :convenios
	has_many :loa_unidades_orcamentarias, class_name: "Loa::UnidadeOrcamentaria", foreign_key: :ppa_unidade_orcamentaria_id
	has_many :unidades_orcamentarias_do_almoxarifado, class_name: "GestaoDeEstoque::UnidadeOrcamentariaDoAlmoxarifado"
	has_many :recebimento_de_materiais, class_name: "GestaoDeEstoque::RecebimentoDeMaterial"

	validates_presence_of :nome, :codigo, :orgao_id, :sigla
	validates_uniqueness_of :nome, :codigo, :sigla, scope: :orgao_id

	after_initialize :sugestao_de_codigo, if: :new_record?

	def codigo_com_zeros
		self.codigo.try(:digitos, 2)
	end

	def codigo_completo
		orgao.codigo.digitos(2) + codigo_com_zeros
	end

	def codigo_e_sigla
		"#{codigo_com_zeros} - #{sigla}"
	end

	def codigo_completo_e_nome
		"#{codigo_completo} - #{nome}"
	end

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

	def total_previsao_de_convenios_correntes
		return self.valores_do_convenio.convenios_correntes.inject(0){ |total, valor_do_convenio| total + valor_do_convenio.valor.to_f }
	end

	def total_previsao_de_convenios_de_capital
		return self.valores_do_convenio.convenios_de_capital.inject(0){|total, valor_do_convenio| total + valor_do_convenio.valor.to_f}
	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 sugestao_de_codigo
		gerar_sugestao_codigo( :codigo, 2, {orgao_id: orgao_id} ) if (orgao.present? && codigo.blank?)
	end
end
