class Licitacao::PessoaDoProjetoDoLote < ApplicationRecord
	has_paper_trail

	belongs_to :lote, class_name: 'Licitacao::Lote', required: true
	belongs_to :pessoa_do_projeto, class_name: 'Licitacao::PessoaDoProjeto', required: true, inverse_of: :pessoas_do_projeto_do_lote

	delegate :projeto, to: :pessoa_do_projeto

	validates_presence_of :justificativa, if: Proc.new { !habilitado && habilitado_was == true}
	validates_presence_of :nota_tecnica, on: :update, if: Proc.new { self.nota_tecnica_changed? && deve_receber_nota?}

	validates_numericality_of :nota_tecnica, on: :update, greater_than: 0, if: Proc.new { self.nota_tecnica_changed? && deve_receber_nota?}

	before_validation :preenche_campo_habilitacao, on: :create, if: Proc.new { self.try(:pessoa_do_projeto).present? && self.try(:projeto) != nil }

	scope :classificados, -> { joins(:pessoa_do_projeto).where(licitacao_pessoas_do_projeto: {classificado: true}) }

	# BOOLEANS
	def pode_ser_inabilitado?
		(self.justificativa.nil? || !self.habilitado? ) && !self.lote.fracassado? && !self.lote.projeto.pos_sessao_em_diante?
	end

	def pode_ser_excluido?
		!projeto.eh_dispensa_ou_inexigibilidade?
	end

	# VALORES
	def lance_final
		if self.lote.lote_por_desconto?
			self.lote.lances.where(pessoa_do_projeto_id: self.pessoa_do_projeto_id).maximum(:valor)
		else
			self.lote.lances.where(pessoa_do_projeto_id: self.pessoa_do_projeto_id).minimum(:valor)
		end
	end

	def nota_lance_ou_proposta
		if self.lote.melhor_tecnica? || self.lote.melhor_tecnica_ou_conteudo_artistico?
			self.try(:nota_tecnica)
		elsif self.projeto.pregao_presencial? || self.projeto.pregao_eletronico?
			self.try(:lance_final).try(:valor_financeiro)
		else
			self.pessoa_do_projeto.valor_total_do_lote(self.lote).try(:valor_financeiro)
		end
	end

	# AÇÕES
	def inabilita_e_atualiza_ganhador(params)
		ActiveRecord::Base.transaction do
			begin
				if self.update!(params)
					self.lote.atualiza_novo_ganhador
					self.lote.cria_proposta_final_para_ganhador if projeto.por_item? && !lote.itens_do_projeto_por_pessoa.where(pessoa_do_projeto_id: lote.ganhador.id).finais.any?
					self.lote.fracassar
					return true
				end
				return false
			rescue
				raise 'Não foi possível inabilitar o licitante, verifique os campos'
				raise ActiveRecord::Rollback
			end
		end
	end

	def exclui_ganhador
		ActiveRecord::Base.transaction do
			self.lote.rodadas.delete_all
			self.lote.lances.destroy_all
			self.lote.update!(lances_abertos:false)
			self.lote.itens_do_projeto_por_pessoa.finais.each do |item_do_lote|
				item_do_lote.delete
			end
			self.lote.update!(ganhador:nil) if self.lote.ganhador.present?
		end
	end

	private
	def deve_receber_nota?
		(lote.melhor_tecnica? || lote.melhor_tecnica_ou_conteudo_artistico?) && pessoa_do_projeto.lote_preenchido?(lote)
	end

	def preenche_campo_habilitacao
		if self.try(:projeto) != nil && self.try(:projeto).try(:outro?)
			self.habilitado = false
		else
			self.habilitado = self.try(:projeto).present? ? !self.try(:projeto).processo_licitatorio? : nil
		end
		!habilitado.nil?
	end
end
