module Licitacao
class PessoasDoProjetoController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:deleta_pessoa_do_projeto]
	before_action :set_pessoa_do_projeto, only: [:show, :edit, :update, :destroy, :justificativa_descredenciamento, :descredenciar, :recredenciar, :justificativa_desclassificacao, :desclassificar, :anular_lote, :reverter_anulacao_lote, :deleta_pessoa_do_projeto, :prepara_copia_de_proposta_inicial, :editar_lances_finais, :atualizar_lances_finais]
	before_action :verifica_se_nao_eh_dispensa, only: [:edit, :update]
	before_action :verifica_se_todos_os_lotes_estao_fechados, only: [:edit, :update]
	before_action :verifica_se_esta_credenciado, only: [:edit]

	# GET /licitacao/pessoas_do_projeto/1
	def show
		@possui_proposta_final =  @pessoa_do_projeto.ganhou_algum_lote?
	end

	# GET /licitacao/pessoas_do_projeto/1/edit
	def edit
		if params[:copia_de_proposta_inicial].present?
			opcoes = prepara_copia_de_proposta_inicial
		else
			opcoes = prepara_proposta
		end

		if params[:proposta_final].eql?("true")
			@pessoa_do_projeto.eh_proposta_final = true
		else
			@pessoa_do_projeto.eh_proposta_final = false
		end

		if opcoes[:proposta_final] && @projeto.por_item?
			redirect_to licitacao_processo_path(@projeto), alert: 'Não é necessária proposta final em projeto por itens'
		else
			prepara_proposta
			render :edit, locals: { proposta_final: @pessoa_do_projeto.eh_proposta_final.eql?("true") || @pessoa_do_projeto.eh_proposta_final.eql?(true) }
		end
	end

	# PATCH/PUT /licitacao/pessoas_do_projeto/1
	def update
		@pessoa_do_projeto.assign_attributes(pessoa_do_projeto_params)
		if !@pessoa_do_projeto.cpf_responsavel_existente?( pessoa_do_projeto_params[:cpf_do_responsavel] ) && @pessoa_do_projeto.save
			redirect_to @pessoa_do_projeto, success: 'Proposta atualizada com sucesso.'
		else
			flash[:alert] = "Erro ao atualizar proposta."
			opcoes = prepara_proposta
			render :edit, locals: { proposta_final: @pessoa_do_projeto.eh_proposta_final.eql?("true") || @pessoa_do_projeto.eh_proposta_final.eql?(true) }
		end
	end

	# PATCH /licitacao/pessoas_do_projeto/1/deleta_pessoas_do_projeto
	def deleta_pessoa_do_projeto
		return if bloqueia_usuario_com_base_em 'update'
		if @pessoa_do_projeto.deleta_pessoa_do_projeto
			redirect_to licitacao_processo_path(@projeto), notice: 'Licitante e proposta deletados com sucesso!'
		else
			redirect_to @pessoa_do_projeto, alert: 'Não foi possível deletar o licitante e suas propostas.'
		end
	end

	# GET	/licitacao/pessoas_do_projeto/1/justificativa_descredenciamento
	def justificativa_descredenciamento
		return if bloqueia_usuario_com_base_em 'descredenciar'
	end

	# PATCH	/licitacao/pessoas_do_projeto/1/descredenciar
	def descredenciar
		if @pessoa_do_projeto.descredenciar_e_desclassificar( descredenciamento_params[:justificativa_descredenciado] )
			redirect_to @pessoa_do_projeto, success: 'Licitante foi descredenciado.'
		else
			render :justificativa_descredenciamento
		end
	end

	# PATCH	/licitacao/pessoas_do_projeto/1/recredenciar
	def recredenciar
		return if bloqueia_usuario_com_base_em 'descredenciar'
		if @pessoa_do_projeto.update_attributes(justificativa_descredenciado: nil, credenciado: true, justificativa_desclassificado: nil, classificado: true)
			redirect_to @pessoa_do_projeto, success: 'Licitante foi recredenciado.'
		else
			redirect_to @pessoa_do_projeto, alert: 'Não foi possível recredenciar o licitante.'
		end
	end

	# GET	/licitacao/pessoas_do_projeto/1/justificativa_desclassificacao
	def justificativa_desclassificacao
		return if bloqueia_usuario_com_base_em 'desclassificar'
	end

	# PATCH	/licitacao/pessoas_do_projeto/1/desclassificar
	def desclassificar
		if @pessoa_do_projeto.desclassificar( desclassificacao_params[:justificativa_desclassificado] )
			redirect_to @pessoa_do_projeto, success: 'Licitante foi desclassificado.'
		else
			render :justificativa_desclassificacao
		end
	end

	# PATCH	/licitacao/pessoas_do_projeto/1/anular_lote
	def anular_lote
		return if bloqueia_usuario_com_base_em 'desclassificar'
		if @pessoa_do_projeto.anular_lote( params[:lote_id] )
			redirect_to @pessoa_do_projeto, success: 'Propostas do Lote foram anuladas.'
		else
			render :show
		end
	end

	# PATCH	/licitacao/pessoas_do_projeto/1/reverter_anulacao_lote
	def reverter_anulacao_lote
		return if bloqueia_usuario_com_base_em 'desclassificar'
		if @pessoa_do_projeto.reverter_anulacao_lote( params[:lote_id] )
			redirect_to @pessoa_do_projeto, success: 'Anulação das propostas do lote foi revertida.'
		else
			render :show
		end
	end

	private
	def prepara_proposta
		@responsaveis = @pessoa_do_projeto.pessoa.responsaveis
		@tipos_de_responsaveis = Licitacao::PessoaDoProjeto.tipos_de_responsaveis
		@responsavel = @pessoa_do_projeto.pessoa.responsaveis.find_by(nome: @pessoa_do_projeto.nome_do_responsavel)

		if @pessoa_do_projeto.eh_proposta_final.eql?("true") || @pessoa_do_projeto.eh_proposta_final.eql?(true)
			@lotes = @pessoa_do_projeto.lotes_ganhos_ativos.includes(itens_do_lote: [item_do_pedido: [item: :unidade_de_medida]])

			@pessoa_do_projeto.inicia_proposta_final unless @projeto.dispensa_de_licitacao? && @projeto.lei_8666_93?
		else
			@lotes = @pessoa_do_projeto.projeto.lotes.where.not(id: @pessoa_do_projeto.lotes_ganhos_ativos).where(ganhador_id: nil).includes(itens_do_lote: [item_do_pedido: [item: :unidade_de_medida]])
			@pessoa_do_projeto.inicia_proposta unless @projeto.dispensa_de_licitacao? && @projeto.lei_8666_93?
		end


		if @pessoa_do_projeto.projeto.homologado_parcialmente?
			@lotes = @lotes.where(licitacao_itens_do_lote: {arquivo_id: nil})
		end

		return { proposta_final: @pessoa_do_projeto.lotes_ganhos_ativos.any? }
	end

	def prepara_proposta_para_edicao
		@responsaveis = @pessoa_do_projeto.pessoa.responsaveis
		@tipos_de_responsaveis = Licitacao::PessoaDoProjeto.tipos_de_responsaveis
		@responsavel = @pessoa_do_projeto.pessoa.responsaveis.find_by(nome: @pessoa_do_projeto.nome_do_responsavel)
		if @pessoa_do_projeto.lotes_ganhos_ativos.any?
			@lotes = @pessoa_do_projeto.lotes_ganhos_ativos.includes(itens_do_lote: [item_do_pedido: [item: :unidade_de_medida]])
			{ proposta_final: true }
		else
			@lotes = @pessoa_do_projeto.projeto.lotes.where.not(id: @pessoa_do_projeto.lotes_ganhos_ativos).where(ganhador_id: nil).includes(itens_do_lote: [item_do_pedido: [item: :unidade_de_medida]])
			{ proposta_final: false }
		end

		if @pessoa_do_projeto.projeto.homologado_parcialmente?
			@lotes = @lotes.where(licitacao_itens_do_lote: {arquivo_id: nil})
		end

		return { proposta_final: @pessoa_do_projeto.lotes_ganhos_ativos.any? }
	end

	def prepara_copia_de_proposta_inicial
		@responsaveis = @pessoa_do_projeto.pessoa.responsaveis
		@tipos_de_responsaveis = Licitacao::PessoaDoProjeto.tipos_de_responsaveis
		@responsavel = @pessoa_do_projeto.pessoa.responsaveis.find_by(nome: @pessoa_do_projeto.nome_do_responsavel)
		@lotes = @pessoa_do_projeto.projeto.lotes.includes(itens_do_lote: [item_do_pedido: [item: :unidade_de_medida]])

		if @pessoa_do_projeto.projeto.homologado_parcialmente?
			@lotes = @lotes.where(licitacao_itens_do_lote: {arquivo_id: nil})
		end

		@pessoa_do_projeto.copia_proposta_inicial_para_final unless @projeto.dispensa_de_licitacao?
		{ proposta_final: true }
	end

	def set_pessoa_do_projeto
		@pessoa_do_projeto = PessoaDoProjeto.find(params[:id])
		@projeto = @pessoa_do_projeto.projeto
	end

	# Permite apenas os parâmetros específicos
	def pessoa_do_projeto_params
		begin
			params.require(:licitacao_pessoa_do_projeto).permit(:pessoa_id, :eh_proposta_final, :projeto_id, :nome_do_responsavel, :cpf_do_responsavel, :tipo_de_responsavel, :arquivo_cotacao, :lotes_nao_preenchidos, itens_do_projeto_por_pessoa_attributes: [:id, :preco, :marca, :item_do_lote_id, :final])
		rescue ActionController::ParameterMissing
			nil
		end
	end

	def descredenciamento_params
		params.require(:licitacao_pessoa_do_projeto).permit(:justificativa_descredenciado)
	end

	def desclassificacao_params
		params.require(:licitacao_pessoa_do_projeto).permit(:justificativa_desclassificado)
	end

	def verifica_se_nao_eh_dispensa
		redirect_to @pessoa_do_projeto, alert: "Não é necessário cadastrar proposta" if @projeto.dispensa_ou_inexigibilidade? && @projeto.lei_8666_93?
	end

	def verifica_se_todos_os_lotes_estao_fechados
		redirect_to @pessoa_do_projeto, alert: "Existem lotes abertos para lances." if @projeto.lotes.any?(&:lances_abertos?)
	end

	def verifica_se_esta_credenciado
		redirect_to @pessoa_do_projeto, alert: "Licitante deve ser credenciado para abertura de proposta." unless @pessoa_do_projeto.credenciado?
	end

end
end
