module Base
	class GrupoDeNaturezaDaDespesa < ApplicationRecord
		include CalculaValoresDeElementos
		include ClassificacaoDaDespesaConcern

		has_paper_trail

		belongs_to :categoria_economica

		has_many :modalidades_de_aplicacao
		has_many :elementos_de_despesa, through: :modalidades_de_aplicacao
		has_many :sub_elementos_de_despesa, through: :elementos_de_despesa, class_name: 'Contabilidade::SubElementoDeDespesa'
		has_many :elementos_de_despesa_por_subacao, through: :elementos_de_despesa
		has_many :orcamentos_da_despesa, through: :elementos_de_despesa_por_subacao
		has_many :lancamentos_do_orcamento_da_despesa, through: :orcamentos_da_despesa

		validates_presence_of :codigo, :descricao
		validates_uniqueness_of :codigo, :descricao, scope: :categoria_economica_id

		validate :codigo_deve_estar_contido_nos_dados_base, unless: Proc.new { Rails.env.test? }
		#validate :descricao_deve_estar_contida_nos_dados_base, unless: Proc.new { Rails.env.test? }

		scope :selecionados, -> {self.joins(modalidades_de_aplicacao: [:elementos_de_despesa]).where(base_elementos_de_despesa: {exibir_elemento_de_despesa: 'true'}).distinct}

		def codigo_formatado_e_descricao
			"#{codigo_formatado} - #{descricao}"
		end

		def codigo_com_4_digitos_e_descricao
			"#{codigo[0]}.#{codigo[1]}.#{codigo[2..3]} - #{descricao}"
		end

		def codigo_abreviado
			abreviacao = case self.codigo[1]
				when "1" then "1- PES"
				when "2" then "2- JUR"
				when "3" then "3- ODC"
				when "4" then "4- INV"
				when "5" then "5- INF"
				when "6" then "6- AMT"
				when "9" then "9- RES"
				else " "
			end
		end

		def valor_total_por_subfuncao subfuncao
			self.orcamentos_da_despesa.joins(elemento_de_despesa_por_subacao: :subacao).where(loa_subacoes: {subfuncao_id: subfuncao.id}).sum(:valor)
		end

		private
		def codigo_deve_estar_contido_nos_dados_base
			if codigo.present?
				unless NaturezaDaDespesa::GrupoDeNaturezaDaDespesa.find_by( codigo: codigo[1] )
					errors.add(:codigo, 'não existe grupo de natureza da despesa com esse código')
				end
			end
		end

		def descricao_deve_estar_contida_nos_dados_base
			if descricao.present?
				unless NaturezaDaDespesa::GrupoDeNaturezaDaDespesa.find_by( descricao: descricao )
					errors.add(:descricao, 'não existe grupo de natureza da despesa com essa descrição')
				end
			end
		end
	end
end
