class Licitacao::PessoasDoProjetoDoLoteController < ApplicationController
	include LicitacaoHelper
	include ControllerConcern
	include LicitacaoControllersConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:inabilita, :excluir_ganhador]
	before_action :set_lote, only: [:edita_pessoas_do_projeto_do_lote, :update, :edita_justificativa, :inabilita, :excluir_ganhador]
	before_action :verifica_criterio_de_julgamento, only: [:edita_pessoas_do_projeto_do_lote]
	before_action :verifica_se_contem_licitantes, only: [:edita_pessoas_do_projeto_do_lote]
	before_action :valida_se_todos_os_itens_do_lote_tem_cotacoes, only: [:edita_pessoas_do_projeto_do_lote]

	# GET /licitacao/lotes/1/pessoas_do_projeto_do_lote/new
	def edita_pessoas_do_projeto_do_lote
		@pessoas_com_cotacao = @lote.pessoas_do_projeto_do_lote_com_cotacao
	end

	# PATCH/PUT /licitacao/lotes/1/pessoas_do_projeto_do_lote
	def update
		if @lote.update(pessoas_do_projeto_do_lote_params)
			redirect_to licitacao_processo_path(@lote.processo, tab: "lotes"), notice: 'Nota Técnica foi atualizado com sucesso.'
		else
			@pessoas_com_cotacao = @lote.pessoas_do_projeto_do_lote_com_cotacao
			render :edita_pessoas_do_projeto_do_lote
		end
	end

	# GET /licitacao/lotes/1/pessoas_do_projeto_do_lote/1/edita_justificativa
	def edita_justificativa
		@pessoa_do_projeto_do_lote = Licitacao::PessoaDoProjetoDoLote.find( params[:pessoa_do_projeto_do_lote_id])
		unless @pessoa_do_projeto_do_lote.justificativa.nil?
			@lote.update(status: 'fracassado')
			redirect_to licitacao_processo_path(@lote.processo, tab: "lotes"), alert: "Não há mais licitantes habilitados para ser o novo ganhador, lote está fracassado"
		end
	end

	# PATCH /licitacao/lotes/1/pessoas_do_projeto_do_lote/1/excluir_ganhador
	def excluir_ganhador
		return if bloqueia_usuario_com_base_em 'update'
		@pessoa_do_projeto_do_lote = Licitacao::PessoaDoProjetoDoLote.find( params[:pessoa_do_projeto_do_lote_id])
		if @pessoa_do_projeto_do_lote.exclui_ganhador
			redirect_to licitacao_processo_path(@lote.processo, tab: "lotes"), notice: "Ganhador do lote excluído com sucesso"
		end
	end

	# PATCH/PUT /licitacao/lotes/1/pessoas_do_projeto_do_lote/inabilita
	def inabilita
		return if bloqueia_usuario_com_base_em 'edita_justificativa'
		begin
			@pessoa_do_projeto_do_lote = Licitacao::PessoaDoProjetoDoLote.find(params[:licitacao_pessoa_do_projeto_do_lote][:id])
			if @pessoa_do_projeto_do_lote.inabilita_e_atualiza_ganhador(inabilita_params)
				redirect_to licitacao_processo_path(@lote.processo, tab: "lotes"), notice: "Licitante inabilitado com sucesso"
			else
				render :edita_justificativa
			end
		rescue => e
			flash[:alert] = e.message
			render :edita_justificativa
		end
	end

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

	def verifica_criterio_de_julgamento
		redirect_to licitacao_processo_path(@lote.processo, tab: "lotes"), alert: 'O critério de julgamento do lote deve ser Melhor Técnica ou Melhor Técnica e Conteúdo Artístico para esta ação' unless @lote.melhor_tecnica? || @lote.melhor_tecnica_ou_conteudo_artistico?
	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 nota técnica" unless @lote.processo.pessoas_do_projeto.classificados.any?
	end

	def valida_se_todos_os_itens_do_lote_tem_cotacoes
		begin
			@lote.todos_os_itens_do_lote_devem_ter_cotacoes
		rescue Exception => e
			redirect_to licitacao_processo_path(@lote.processo, tab: "lotes"), alert: e.message
		end
	end

	# Permite apenas os parâmetros específicos
	def pessoas_do_projeto_do_lote_params
		begin
			params.require(:licitacao_lote).permit(pessoas_do_projeto_do_lote_attributes: [:id, :pessoa_do_projeto_id, :lote_id, :nota_tecnica, :_destroy])
		rescue ActionController::ParameterMissing
			nil
		end
	end

	def inabilita_params
		params.require(:licitacao_pessoa_do_projeto_do_lote).permit(:id, :justificativa).merge(habilitado: false)
	end
end