class Licitacao::ItemDoProjetoPorPessoa < ApplicationRecord
	has_paper_trail

	attr_default :valido, true

	belongs_to :item_do_lote
	belongs_to :pessoa_do_projeto

	has_one :lote, through: :item_do_lote

	delegate :item, to: :item_do_lote
	delegate :projeto, to: :pessoa_do_projeto

	validates_presence_of :preco
	validates_presence_of :marca, if: Proc.new { self.obriga_marca? }

	# Validação retirada a pedido da consultoria, pois é necessário em alguns casos com mais de 2 casas decimais
	#validates :preco, casas_decimais: 2, unless: Proc.new { item_do_lote.item.combustivel }

	validate :pessoa_do_projeto_ganhadora_do_lote, if: :final?

	after_create :cria_ocorrencia_abertura_de_propostas

	scope :validos,  -> { where(valido: true) }
	scope :finais,   -> { where(final: true)  }
	scope :iniciais, -> { where(final: false) }
	scope :final,   -> { find_by(final: true) }
	scope :inicial, -> { find_by(final: false) }
	scope :por_preco, -> { self.joins(item_do_lote: [:item_do_pedido]).where(licitacao_itens_do_pedido: {tipo: Licitacao::ItemDoPedido.tipos[:por_preco]}) }

	def total
		(self.item_do_lote.item_do_pedido.quantidade_total_requisitada * self.preco).round(2).to_f
	end

	def valor_final
		((pessoa_do_projeto.projeto.por_item? && !pessoa_do_projeto.projeto.tomada_de_precos? && !pessoa_do_projeto.projeto.carona? && !pessoa_do_projeto.projeto.parceria_osc?) || lote.lote_por_desconto?) ? self.preco : total
	end

	def obriga_marca?
		return item_do_lote.try(:item_do_pedido).try(:por_valor_previsto?) == false && self.item.try(:categoria).try(:tipo).eql?("servico") == false
	end

	private

	def cria_ocorrencia_abertura_de_propostas
		unless projeto.ocorrencias.abertura_de_proposta.any?
			projeto.ocorrencias.create(data_da_ocorrencia: Date.today, horario_da_ocorrencia: Time.now.strftime("%H:%M"), tipo: "abertura_de_proposta", motivo: "Abertura de Proposta")
		end
	end

	def pessoa_do_projeto_ganhadora_do_lote
		errors.add(:base, "Licitante precisa ter ganhado o lote para dar lance final") if item_do_lote.try(:lote) && item_do_lote.lote.ganhador != pessoa_do_projeto && pessoa_do_projeto.pessoa_do_lote_habilitado?(item_do_lote.try(:lote))
	end
end
