class Obra::ItemDoServicoDaObra < ApplicationRecord
	has_paper_trail

	belongs_to :servico_da_obra, class_name: "Obra::ServicoDaObra"

	has_many :itens_do_servico_da_medicao_da_obra , dependent: :restrict_with_exception

	validates :codigo, :descricao, :unidade_de_medida, :quantidade, :preco_unitario, presence: true
	validates_length_of :codigo, maximum: 5

	validate :quantidade_atual_eh_maior_que_as_quantidades_medidas
	after_save :apaga_a_si_mesmo_se_quantidade_for_zero_ou_nula

	scope :order_ids,  -> { order(:id) }

	def apaga_a_si_mesmo_se_quantidade_for_zero_ou_nula
		self.delete if self.quantidade == 0 || self.quantidade.nil?
	end

	def saldo_quantidade
		self.quantidade - quantidade_medida_acumulada
	end

	def quantidade_medida_acumulada
		itens_do_servico_da_medicao_da_obra.sum(:quantidade_medida)
	end

	def porcentagem
		porcentagem = (( self.valor * 100).to_f / (self.obra.contrato.valor_total_do_contrato).to_f).round(2)
		porcentagem.cap_at 100
	end

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

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

	def preco_total_medido
		(self.preco_unitario * quantidade_medida_acumulada).to_f
	end

	def saldo_preco_total_a_medir
		(self.preco_unitario * saldo_quantidade).to_f
	end

	def valor_total
		(self.preco_unitario * self.quantidade).to_d.round(2)
	end

	def quantidade_atual_eh_maior_que_as_quantidades_medidas
		if self.itens_do_servico_da_medicao_da_obra.any?
			total_medido = 0
			self.itens_do_servico_da_medicao_da_obra.each do |item_do_servico_da_medicao_da_obra|
				total_medido += item_do_servico_da_medicao_da_obra.quantidade_medida
			end
			errors.add(:quantidade, "Quantidade do item não pode ser menor do que já foi medido") if self.quantidade < total_medido
		end
	end

	def prazo_de_execucao
		servico_da_obra.prazo_de_execucao > 1 ? servico_da_obra.prazo_de_execucao.to_s + " dias" : servico_da_obra.prazo_de_execucao.to_s + " dia"
	end

end
