class Loa::ElementoDeDespesaPorSubacao < ApplicationRecord
	has_paper_trail

	belongs_to :elemento_de_despesa, class_name: 'Base::ElementoDeDespesa', required: true
	belongs_to :subacao, class_name: 'Loa::Subacao', required: true
	belongs_to :solicitacao_de_alteracao_orcamentaria, class_name: 'Contabilidade::SolicitacaoDeAlteracaoOrcamentaria', required: false

	has_many :orcamentos_da_despesa, class_name: 'Loa::OrcamentoDaDespesa', dependent: :destroy, inverse_of: :elemento_de_despesa_por_subacao
	has_many :sub_elementos_de_despesa, through: :elemento_de_despesa

	accepts_nested_attributes_for :orcamentos_da_despesa, allow_destroy: true

	validates :orcamentos_da_despesa, uniq_nested_attributes: { atributo: :fonte_de_recursos_id, mensagem: "fonte de recursos deve ser único dentro de elemento de despesa" }

	#Eduarda pediu para retirar dizendo que a regra era antiga (chamado 2067)
	#validate :despesa_reserva_de_contingencia_deve_ser_unidade_reserva_de_contingencia

	validates_presence_of :subacao_id
	validates_presence_of :elemento_de_despesa_id
	validates_presence_of :status_do_orcamento

	enum status_do_orcamento: STATUS_DO_ORCAMENTO

	validates_uniqueness_of :elemento_de_despesa_id, scope: :subacao_id, if: :persisted?

	before_destroy :verifica_se_pode_deletar

	def valor_total
		if subacao.present? && subacao.acao.present? && subacao.acao.solicitacao_de_alteracao_orcamentaria.present?
			orcamentos_da_despesa.sum(&:valor_total_acrescentado_na_alteracao)
		else
			orcamentos_da_despesa.sum(:valor)
		end
	end

	def valor_orcamentado
		orcamentos_da_despesa.sum(:valor)
	end

	def codigo_e_descricao_elemento
		elemento_de_despesa.codigo_e_descricao
	end

	def unidade_orcamentaria
		subacao&.unidade_orcamentaria
	end

	def verifica_se_pode_deletar
		raise Exception.new("não é possível apagar elemento de despesa da subação nesse momento") if orcamentos_da_despesa.any? {|o| o.valor_orcado.present? }
	end

	private
	def despesa_reserva_de_contingencia_deve_ser_unidade_reserva_de_contingencia
		if self.try(:elemento_de_despesa).try(:reserva_de_contingencia?)
			if unidade_orcamentaria && self.try(:unidade_orcamentaria).try(:tipo_de_unidade_administrativa).try(:codigo) != '99'
				errors.add(:elemento_de_despesa_id, 'só pode ser selecionada se o orgão, a unidade orçamentária, a função e a subfunção forem do tipo reserva de contingência')
			end
		end
	end

end
