class Contabilidade::FontePorElementoDaSubacaoDaSolicitacao < ApplicationRecord
	has_paper_trail

	belongs_to :elemento_por_subacao_da_solicitacao, inverse_of: :fontes_por_elemento_da_subacao_da_solicitacao
	belongs_to :fonte_de_recursos, class_name: 'Base::FonteDeRecursos'

	validates_presence_of :fonte_de_recursos_id, :iduso

	delegate :codigo_completo_e_descricao, to: :fonte_de_recursos

	validate :checa_se_ja_possui_vinculo

	before_destroy :desfaz_os_vinculos_no_loa

	enum iduso: {
		recursos_não_destinados_à_contrapartida: 0,
		contrapartida_de_empréstimos_do_BIRD: 1,
		contrapartida_de_empréstimos_do_BID: 2,
		Contrapartida_de_empréstimos_por_desempenho: 3,
		contrapartida_de_outros_empréstimos: 4,
		contrapartida_de_doações: 5,
		recursos_destinados_à_aplicação_mínima_em_ações_e_serviços_públicos_de_saúde: 6
	}

	def orcamento_da_despesa_vinculado
		subacao = elemento_por_subacao_da_solicitacao.subacao_da_solicitacao.subacao
		elemento_de_despesa_id = elemento_por_subacao_da_solicitacao.elemento_de_despesa_id
		elemento_de_despesa_por_subacao = subacao.elementos_de_despesa_por_subacao.find_by(elemento_de_despesa_id: elemento_de_despesa_id)
		orcamento_vinculado = elemento_de_despesa_por_subacao.orcamentos_da_despesa.find_by(fonte_de_recursos_id: self.fonte_de_recursos_id, de_credito_adicional: true)
		return orcamento_vinculado
	end

	private
	def checa_se_ja_possui_vinculo
		elemento_de_despesa_id = elemento_por_subacao_da_solicitacao.try(:elemento_de_despesa_id)
		subacao_id = elemento_por_subacao_da_solicitacao.try(:subacao_da_solicitacao).try(:subacao_id)
		fontes_ja_vinculadas_ids = Loa::OrcamentoDaDespesa
			.joins(elemento_de_despesa_por_subacao: :orcamentos_da_despesa)
			.where(loa_elementos_de_despesa_por_subacao: { subacao_id: subacao_id, elemento_de_despesa_id: elemento_de_despesa_id })
			.pluck(:fonte_de_recursos_id)
		if fontes_ja_vinculadas_ids.include?(self.fonte_de_recursos_id)
			errors.add(:fonte_de_recursos_id, "A Fonte escolhida já está vinculada a esse Elemento e essa Ação") if !self.persisted?
		end
	end

	def desfaz_os_vinculos_no_loa
		subacao = elemento_por_subacao_da_solicitacao.subacao_da_solicitacao.subacao
		elemento_de_despesa_id = elemento_por_subacao_da_solicitacao.elemento_de_despesa_id
		elemento_de_despesa_por_subacao = subacao.elementos_de_despesa_por_subacao.find_by(elemento_de_despesa_id: elemento_de_despesa_id)
		orcamento_vinculado = elemento_de_despesa_por_subacao.orcamentos_da_despesa.find_by(fonte_de_recursos_id: self.fonte_de_recursos_id, de_credito_adicional: true)
		orcamento_vinculado.destroy if orcamento_vinculado.present?
	end
end
