class Licitacao::ItemDoOrcamentoDaDespesaDoContrato < ApplicationRecord
	has_paper_trail

	delegate :contrato, to: :orcamento_da_despesa_do_contrato

	belongs_to :orcamento_da_despesa_do_contrato, class_name: "Licitacao::OrcamentoDaDespesaDoContrato"
	belongs_to :item_do_contrato, class_name: 'Licitacao::ItemDoContrato'

	validates_numericality_of :quantidade, greater_than: 0
	validates_presence_of :quantidade

	validate :valida_quantidade_de_itens
	validate :valida_valor_total_do_item

	def quantidade_vinculada_em_outras_dotacoes
		contrato.itens_dos_orcamentos_da_despesa_do_contrato.where.not(id: self.id).where(item_do_contrato: item_do_contrato).sum(:quantidade)
	end

	def quantidade_vinculada
		quantidade_vinculada_em_outras_dotacoes.to_f + self.quantidade
	end

	def saldo_da_quantidade
		item_do_contrato.quantidade_total.to_f - quantidade_vinculada.to_f
	end

	def saldo_a_vincular
		item_do_contrato.quantidade_total.to_f - quantidade_vinculada_em_outras_dotacoes.to_f
	end

	def valor_pela_quantidade
		quantidade.to_f * item_do_contrato.valor_unitario.to_f
	end

	def valor
		return total_por_item.to_f if total_por_item.present?
		valor_pela_quantidade
	end

	private

	def valida_quantidade_de_itens
		if item_do_contrato.present? && quantidade.present? && saldo_da_quantidade.to_f < 0
			errors.add(:quantidade, "não pode ser maior que a quantidade de itens licitada. Saldo para vincular: #{saldo_a_vincular.to_f}")
		end
	end

	def valida_valor_total_do_item
		return if quantidade.blank? || total_por_item.blank?

		if total_por_item.to_f < valor_pela_quantidade.to_f - 0.1 || total_por_item.to_f > valor_pela_quantidade.to_f + 0.1
			msg = 'deve ser igual a quantidade * valor unitário com uma margem de até 10 centavos'
			errors.add(:total_por_item, msg)
		end
	end
end
