module Base
	class ModalidadeDeAplicacao < ApplicationRecord
		include ClassificacaoDaDespesaConcern
		include CalculaValoresDeElementos

		has_paper_trail

		belongs_to :grupo_de_natureza_da_despesa

		has_many :elementos_de_despesa
		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: :grupo_de_natureza_da_despesa_id

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

		scope :selecionados, -> {self.joins(: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_do_grupo
			"#{codigo[0]}.#{codigo[1]}.#{codigo[2..3]} - #{self&.grupo_de_natureza_da_despesa&.descricao}"
		end

		def pertence_a_91?
			codigo[2,2] == '91'
		end

		def reserva_de_contingencia?
			descricao == 'Reserva de Contingência' && codigo == '99990000'
		end

		private
		def codigo_deve_estar_contido_nos_dados_base
			if codigo.present?
				unless NaturezaDaDespesa::ModalidadeDeAplicacao.find_by( codigo: codigo[2..3] )
					errors.add(:codigo, 'não existe modalidade de aplicação com esse código')
				end
			end
		end

		def descricao_deve_estar_contida_nos_dados_base
			if descricao.present?
				unless NaturezaDaDespesa::ModalidadeDeAplicacao.find_by( descricao: descricao )
					errors.add(:descricao, 'não existe modalidade de aplicação com essa descrição')
				end
			end
		end
	end
end
