class Licitacao::ItemDoOrcamentoDaDespesaDoAditivo < ApplicationRecord
	has_paper_trail

	delegate :aditivo, to: :orcamento_da_despesa_do_aditivo

	belongs_to :orcamento_da_despesa_do_aditivo, class_name: "Licitacao::OrcamentoDaDespesaDoAditivo"
	belongs_to :item_do_aditivo, class_name: 'Licitacao::ItemDoAditivo'
	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, unless: Proc.new { self.aditivo.try(:nova_unidade_orcamentaria?) }
	validate :valida_valor_total_do_item, unless: Proc.new { self.aditivo.try(:nova_unidade_orcamentaria?) }
	validate :valida_quantidade_de_itens_quando_for_aditivo_de_nova_unidade_orcamentaria, if: Proc.new { self.aditivo.try(:nova_unidade_orcamentaria?) && self.item_do_contrato.present? }

	def quantidade_vinculada_em_outras_dotacoes
		aditivo.itens_dos_orcamentos_da_despesa_do_aditivo.where.not(id: self.id).where(item_do_aditivo: item_do_aditivo).sum(:quantidade) rescue 0
	end

	def quantidade_vinculada
		quantidade_vinculada_em_outras_dotacoes.to_f + self.quantidade rescue 0
	end

	def saldo_da_quantidade
		item_do_aditivo.quantidade.to_f - quantidade_vinculada.to_f rescue 0
	end

	def saldo_a_vincular
		item_do_aditivo.quantidade.to_f - quantidade_vinculada_em_outras_dotacoes.to_f rescue 0
	end

	def valor_pela_quantidade
		if item_do_aditivo.aditivo.reajuste_de_valor_acrescimo? || item_do_aditivo.aditivo.reajuste_de_valor_decrescimo? 
			quantidade.to_d * item_do_aditivo.valor_adicionado.to_d rescue 0
		elsif item_do_aditivo.aditivo.prazo_e_reajuste_acrescimo? 
			quantidade.to_d * (item_do_aditivo.valor_do_item.to_d + item_do_aditivo.valor_adicionado.to_d) rescue 0
		elsif item_do_aditivo.aditivo.prazo_e_reajuste_decrescimo?
			quantidade.to_d * (item_do_aditivo.valor_do_item.to_d - item_do_aditivo.valor_adicionado.to_d) rescue 0
		else
			quantidade.to_d * item_do_aditivo.valor_do_item.to_d rescue 0
		end
	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_aditivo.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

	def valida_quantidade_de_itens_quando_for_aditivo_de_nova_unidade_orcamentaria
		if self.quantidade > self.item_do_contrato.saldo
			errors.add(:quantidade, "Não pode ser maior que saldo disponivel no contrato")
		end
	end
end
