class Contabilidade::OrcamentoDoContingenciamento < ApplicationRecord
  has_paper_trail

  belongs_to :contigenciamento, class_name: 'Contabilidade::Contigenciamento'
  has_many :acoes_do_contigenciamento, class_name: 'Contabilidade::AcaoDoContigenciamento'

  validates_presence_of :contigenciamento_id

  accepts_nested_attributes_for :acoes_do_contigenciamento, reject_if: :all_blank, allow_destroy: true

  validates_associated :acoes_do_contigenciamento

	validates :acoes_do_contigenciamento, uniq_nested_attributes: {
		atributo: :acao_id,
		mensagem: "Ação deve ser única dentro do Orçamento"
	}

  validate :valida_valor_total_contingenciado

  after_save :atualiza_valor_total_da_acao

  def valor_contingenciado_atual
    self.acoes_do_contigenciamento.to_a.sum(&:valor_contingenciado).to_f
  end

  def valor_contingenciado_salvo
    self.acoes_do_contigenciamento.sum(:valor).to_f
  end

  def valor_a_contingenciar
    (self.contigenciamento.valor - valor_contingenciado_salvo).to_f
  end

  def valida_valor_total_contingenciado
    errors.add(:base, "Valor contingenciado não pode ultrapassar o valor a contingenciar.") if valor_contingenciado_atual > self.contigenciamento.valor.to_f
  end

  def atualiza_valor_total_da_acao
    self.acoes_do_contigenciamento.each do |acao|
      valor_total_da_acao = acao.elementos_por_acao_do_contigenciamento.sum(:valor).to_f
      acao.update_column(:valor, valor_total_da_acao)
    end
  end
end
