class Licitacao::LancesController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:anular_lance]
	before_action :set_lote, only: [:show, :update]
	before_action :set_lances, except: [:show,:anular_lance]
	before_action :verifica_se_contem_licitantes, :verifica_status_do_processo, :verifica_modalidade_do_processo, except: [:anular_lance]
	before_action :verifica_se_rodada_existe, :verifica_se_rodada_nao_esta_concluida, except: [:show, :anular_lance]
	before_action :verifica_desistencia, only: [:update]

	# GET /licitacao/lotes/1/lances
	def show
	end

	# GET /licitacao/lotes/1/rodadas/1/lances/edit
	def edit
	end

	# PATCH/PUT /licitacao/lotes/1/lances
	def update
		if @rodada.update( rodada_params )
			if manter_form_apos_cadastro?
				redirect_path = licitacao_editar_lances_path(@lote, @lote.rodadas.last.numero)
			else
				redirect_path = licitacao_mostrar_lances_path(@lote)
			end
			redirect_to redirect_path, success: 'Rodada lançada com sucesso.'
		else
			render :edit
		end
	end

	def anular_lance
		return if bloqueia_usuario_com_base_em 'update'
		@lance = Licitacao::Lance.find( params[:lance_id] )
		if @lance.rodada.numero == 0 && @lance.deleta_lances_das_rodadas_iniciais && @lance.anula_itens_lance
			redirect_to licitacao_mostrar_lances_path(@lance.rodada.lote), success: 'Lance anulado com sucesso.'
		else
			redirect_to licitacao_mostrar_lances_path(@lance.rodada.lote), success: 'Lance não pode ser anulado nessa rodada.'
		end
	end

	private
	def set_lote
		@lote = Licitacao::Lote.find( params[:lote_id] )
	end

	def set_lances
		set_lote
		@rodada = @lote.rodadas.find_by_numero(params[:numero_rodada]) if params[:numero_rodada]
		@lances = @rodada.lances.sort_by(&:valor_anterior)
		@lances.reverse! unless @rodada.desempate? || @lote.lote_por_desconto?
	end

	def verifica_se_contem_licitantes
		redirect_to licitacao_processo_path(@lote.processo, tab: "lotes"), alert: "Adicione pelo menos um licitante para acessar a tela de lances." unless @lote.processo.pessoas_do_projeto.classificados.any?
	end

	def verifica_se_rodada_existe
		redirect_to licitacao_mostrar_lances_path(@lote), alert: "Essa rodada não existe." if @rodada.nil?
	end

	def verifica_se_rodada_nao_esta_concluida
		redirect_to licitacao_mostrar_lances_path(@lote), alert: "Essa rodada não pode ser editada pois está concluída." if @rodada.concluida?
	end

	def verifica_status_do_processo
		redirect_back(fallback_location: licitacao_processo_path(@lote.processo), alert: "Não pode cadastrar lance nessa etapa") if @lote.processo.em_sessao? == false && @lote.processo.homologado? && @lote.processo.homologado_parcialmente? == false
	end

	def verifica_modalidade_do_processo
		if @lote.processo.lei_8666_93? && (!@lote.processo.pregao_presencial? && !@lote.processo.pregao_eletronico?)
			redirect_back(fallback_location: licitacao_processo_path(@lote.processo), alert: "Não há rodada de lances na modalidade #{@lote.processo.modalidade_de_licitacao.humanize}")
		end
	end

	def verifica_desistencia
		todos_desistiram = rodada_params[:lances_attributes].to_unsafe_h.all? {|index, lance| lance[:desistir].eql?("1")}
		redirect_to licitacao_editar_lances_path(@lote, @lote.rodadas.last.numero), alert: "Não é possível desistir todos os licitantes na mesma rodada" if todos_desistiram
	end

	# Permite apenas os parâmetros específicos
	def rodada_params
		params.require(:licitacao_rodada).permit(
			:id, lances_attributes: [
				:id, :pessoa_do_projeto_id, :valor, :desistir
		])
	end
end
