class Contabilidade::ElementoPorSubacaoDaSolicitacao < ApplicationRecord
	has_paper_trail

	belongs_to :subacao_da_solicitacao, inverse_of: :elementos_por_subacao_da_solicitacao
	belongs_to :elemento_de_despesa, class_name: 'Base::ElementoDeDespesa'

	has_many :fontes_por_elemento_da_subacao_da_solicitacao, class_name: 'Contabilidade::FontePorElementoDaSubacaoDaSolicitacao', dependent: :destroy
	has_many :orcamentos_da_despesa, through: :fontes_por_elemento_da_subacao_da_solicitacao, source: :fonte_de_recursos

	delegate :codigo_e_descricao, to: :elemento_de_despesa

	accepts_nested_attributes_for :fontes_por_elemento_da_subacao_da_solicitacao, reject_if: :all_blank, allow_destroy: true

	validates_presence_of :elemento_de_despesa_id
	validates_associated :fontes_por_elemento_da_subacao_da_solicitacao

	validates :fontes_por_elemento_da_subacao_da_solicitacao, uniq_nested_attributes: {
		atributo: :fonte_de_recursos_id,
		mensagem: "Fonte de Recursos deve ser única dentro de um Elemento de Despesa"
	}

	validate :valida_vinculo_com_fonte

	before_destroy :desfaz_os_vinculos_no_loa

	private
	def valida_vinculo_com_fonte
		if fontes_por_elemento_da_subacao_da_solicitacao.empty? || fontes_por_elemento_da_subacao_da_solicitacao.all?{ |fonte| fonte.marked_for_destruction? }
			errors.add(:elemento_de_despesa_id, "É preciso vincular no mínimo uma Fonte de Recursos por Elemento de Despesa")
		end
	end

	def desfaz_os_vinculos_no_loa
		elemento_vinculado = subacao_da_solicitacao.subacao.elementos_de_despesa_por_subacao
			.find_by(elemento_de_despesa_id: self.elemento_de_despesa_id, de_credito_adicional: true)
		elemento_vinculado.destroy if elemento_vinculado.present?
	end
end
