class Licitacao::ItemDoEmpenhoRetroativoDoContrato < ApplicationRecord
	has_paper_trail

	attr_accessor :saldo

	belongs_to :empenho_retroativo_do_contrato , class_name: 'Licitacao::EmpenhoRetroativoDoContrato'
	belongs_to :item_do_contrato, class_name: 'Licitacao::ItemDoContrato', foreign_key: 'item_do_contrato_id'

	validates_presence_of :quantidade, :valor_unitario, :total
	validates_numericality_of :quantidade, :valor_unitario, :total, greater_than: 0

	validate :valida_quantidade_do_item, on: :create, if: Proc.new { !self.quantidade.blank? }
	validate :limite_do_total_digitado_pelo_calculo, if: Proc.new{ !self.quantidade.blank? && !self.valor_unitario.blank? && !self.total.blank?}

	def quantidade_disponivel_para_empenho_retroativo
		item_do_contrato.saldo_para_empenho_atual(empenho_retroativo_do_contrato.data_do_empenho)
	end

	def quantidade_disponivel
		if empenho_retroativo_do_contrato.possui_itens_repetidos?
			empenho_retroativo_do_contrato.itens_do_empenho_retroativo_do_contrato.where(item_id: item_id).sum(:quantidade)
		else
			self.quantidade
		end
	end

	def total_disponivel
		quantidade_disponivel * valor_unitario
	end

	# VALIDAÇÕES

	def valida_quantidade_do_item
		if quantidade.to_f.round(2) > item_do_contrato.saldo.to_f.round(2)
			errors.add(:quantidade, "não pode ser maior que o saldo do item")
		end
	end

	def limite_do_total_digitado_pelo_calculo
		total_calculado = self.quantidade.to_f * self.valor_unitario
		errors.add(:total, "não pode ser mais que 10 centavos do valor calculado da quantidade x preço unitário") if self.total > (total_calculado + 0.1)
		errors.add(:total, "não pode ser menos que 10 centavos do valor calculado da quantidade x preço unitário") if self.total < (total_calculado - 0.1)
	end
end
