class Licitacao::OperacaoDeCreditoDoContrato < ApplicationRecord
  has_paper_trail

  belongs_to :contrato, class_name: "Licitacao::Contrato"
  belongs_to :operacao_de_credito, class_name: "Obra::OperacaoDeCredito"

  has_many :acoes_da_operacao_de_credito_do_contrato, class_name: "Licitacao::AcaoDaOperacaoDeCreditoDoContrato", dependent: :destroy

  validates :acoes_da_operacao_de_credito_do_contrato, uniq_nested_attributes: { atributo: :acao_do_componente_id, mensagem: "ação deve ser única dentro de um contrato" }

  accepts_nested_attributes_for :acoes_da_operacao_de_credito_do_contrato, allow_destroy: true

  validates :contrato_id, :operacao_de_credito_id, presence: true

  validate :valor_das_acoes_maior_que_valor_do_contrato

  def valor_das_acoes_maior_que_valor_do_contrato
    errors.add(:acoes_da_operacao_de_credito_do_contrato, "valor total das ações não pode ser maior que valor total do contrato") if valor_total_das_acoes_da_operacao_de_credito_do_contrato.to_f > self.try(:contrato).try(:valor_total_do_contrato).to_f
  end

  def valor_total_das_acoes_da_operacao_de_credito_do_contrato
    total = self.acoes_da_operacao_de_credito_do_contrato.inject(0) { |total, acao_da_operacao_de_credito_do_contrato|
      total + acao_da_operacao_de_credito_do_contrato.valor_da_acao.to_f
    }
  end
end
