class Obra::ItemDoServicoDaMedicaoDaObra < ApplicationRecord
	has_paper_trail

	belongs_to :medicao_da_obra, class_name: 'Contabilidade::MedicaoDaObra'
	belongs_to :item_do_servico_da_obra, class_name: 'Obra::ItemDoServicoDaObra'

	validate :valida_quantidade_do_item, if: Proc.new { !self.quantidade_medida.blank? }
	validate :limite_do_total_digitado_pelo_calculo, if: Proc.new{ !self.quantidade_medida.blank? }

	after_save :apaga_a_si_mesmo_se_quantidade_for_zero_ou_nula

	# VALIDAÇÕES
	def valida_quantidade_do_item
		errors.add(:quantidade_medida, "não pode ser maior que o saldo disponível") if self.quantidade_medida > quantidade_disponivel_para_o_item
	end

	def limite_do_total_digitado_pelo_calculo
		total_calculado = (self.quantidade_medida * self.item_do_servico_da_obra.preco_unitario).to_f
		errors.add(:total, "não pode ser mais que 10 centavos do valor calculado da quantidade x preço unitário") if self.total.to_f > (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.to_f < (total_calculado - 0.1)
	end

	# AÇÃO
	def apaga_a_si_mesmo_se_quantidade_for_zero_ou_nula
		self.delete if self.quantidade_medida == 0 || self.quantidade_medida.nil?
	end

	# VALORES
	def quantidade_disponivel_para_o_item
		self.item_do_servico_da_obra.saldo_quantidade.to_f
	end

	def porcentagem
		porcentagem = (( self.quantidade_medida * 100).to_f / (self.item_do_servico_da_obra.quantidade).to_f).round(2)
		porcentagem.cap_at 100
	end

	def quantidade_medida_acumulada
		(self.item_do_servico_da_obra.itens_do_servico_da_medicao_da_obra.where.not(id: self.id).sum(:quantidade_medida).to_f + self.quantidade_medida.to_f).to_f
	end

	def porcentagem_quantidade_medida_acumulada
		porcentagem = (( self.quantidade_medida_acumulada * 100).to_f / (self.item_do_servico_da_obra.quantidade).to_f).round(2)
		porcentagem.cap_at 100
	end

	def preco_total_medido
		(self.item_do_servico_da_obra.preco_unitario.to_f * self.quantidade_medida.to_f).to_f
	end

	def preco_total_medido_acumulado
		(self.item_do_servico_da_obra.itens_do_servico_da_medicao_da_obra.sum(&:preco_total_medido) - self.preco_total_medido).to_f
	end

	def porcentagem_preco_total_medido
		porcentagem = (( self.preco_total_medido * 100).to_f / (self.item_do_servico_da_obra.valor_total).to_f).round(2)
		porcentagem.cap_at 100
	end

end
