module Licitacao
	class DocumentosDoProcessoController < ApplicationController
		include ControllerConcern
		include LicitacaoControllersConcern
		include DocumentosDoProcessoHelper

		before_action :authenticate_usuario!
		before_action :autoriza_usuario!, except: [:modelos, :retorna_modelo]
		before_action :set_processo, only: [:new, :create, :retorna_modelo]
		before_action :set_projeto, only: [:new, :create]
		before_action :set_documento_do_processo, only: [:show, :edit, :update, :destroy, :edita_parecer, :atualiza_parecer, :conclui_parecer, :receber_parecer_no_setor_juridico, :devolver_parecer]

		# GET /licitacao/documentos_do_processo
		def index
			@q = Licitacao::DocumentoDoProcesso.where(tipo_de_documento: 8).order("id DESC, data_do_documento DESC").ransack(query_params)
			@documentos_do_processo = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
		end

		# GET /licitacao/documentos_do_processo/parecer
		def parecer
			@documento_do_processo = Licitacao::DocumentoDoProcesso.new
			disponibiliza_dependencias_do_parecer
		end

		# POST /licitacao/documentos_do_processo/parecer
		def cria_parecer
			@documento_do_processo = Licitacao::DocumentoDoProcesso.new(documento_do_processo_params)
			@documento_do_processo.usuario = current_usuario
			@documento_do_processo.tipo_de_documento = "parecer"
			@documento_do_processo.status_parecer = "enviado_ao_setor_juridico"
			if @documento_do_processo.save
				redirect_to licitacao_documentos_do_processo_path, notice: 'Documento do processo foi criado com sucesso.'
			else
				disponibiliza_dependencias_do_parecer
				render :parecer
			end
		end

		# GET /licitacao/documentos_do_processo/1/edita_parecer
		def edita_parecer
			if @documento_do_processo.pendente? || @documento_do_processo.enviado_ao_setor_juridico? || @documento_do_processo.recebido_pelo_setor_juridico?
				@modelos_de_documentos = Licitacao::ModeloDeDocumento.where(modalidade: Licitacao::Projeto.modalidades_de_licitacao[@documento_do_processo.processo.modalidade_de_licitacao], tipo: Licitacao::DocumentoDoProcesso.tipos_de_documento["parecer"])
				disponibiliza_agentes_publicos_municipais
			end
		end

		# PATCH/PUT /licitacao/documentos_do_processo/edita_parecer/1
		def atualiza_parecer
			@documento_do_processo.usuario = current_usuario
			if @documento_do_processo.update( documento_do_processo_params )
				redirect_to @documento_do_processo, notice: 'Documento do processo foi atualizado com sucesso.'
			else
				disponibiliza_dependencias_do_parecer
				render :edita_parecer
			end
		end

		# PUT /licitacao/documentos_do_processo/conclui_parecer/1
		def conclui_parecer
			if @documento_do_processo.concluir_parecer
				redirect_to @documento_do_processo, notice: 'Parecer concluído com sucesso'
			else
				redirect_to @documento_do_processo, notice: 'Não foi possível concluir o parecer'
			end
		end

		# PUT /licitacao/documentos_do_processo/receber_parecer_no_setor_juridico/1
		def receber_parecer_no_setor_juridico
			if @documento_do_processo.receber_parecer_no_setor_juridico
				redirect_to @documento_do_processo, notice: 'Parecer recebido pelo setor jurídico com sucesso'
			else
				redirect_to @documento_do_processo, notice: 'Não foi possível o setor jurídico receber o parecer'
			end
		end

		# PUT /licitacao/documentos_do_processo/devolver_parecer/1
		def devolver_parecer
			if @documento_do_processo.devolver_parecer
				redirect_to @documento_do_processo, notice: 'Parecer devolvido com sucesso'
			else
				redirect_to @documento_do_processo, notice: 'Não foi possível devolver o parecer'
			end
		end

		# GET /licitacao/documentos_do_processo/new
		def new
			@documento_do_processo = @processo.documentos_do_processo.new
			@documento_do_processo.documento_do_projeto = true if params[:documento] == "projeto" || params[:documento] == "termo_de_referencia" || params[:documento] == "autorizacao"
			disponibiliza_dependencias
			disponibiliza_agentes_publicos_municipais
		end

		# GET /licitacao/documentos_do_processo/1/edit
		def edit
			disponibiliza_dependencias
			disponibiliza_agentes_publicos_municipais
		end

		# GET /licitacao/documentos_do_processo/1
		def show
		end

		# POST /licitacao/documentos_do_processo
		def create
			@documento_do_processo = @processo.documentos_do_processo.new(documento_do_processo_params)
			@documento_do_processo.usuario = current_usuario
			if @documento_do_processo.save
				redirect_to redireciona_para_projeto_ou_processo(@documento_do_processo), notice: 'Documento do processo foi criado com sucesso.'
			else
				disponibiliza_dependencias
				render :new
			end
		end

		# PATCH/PUT /licitacao/documentos_do_processo/1
		def update
			if @documento_do_processo.update( documento_do_processo_params )
				redirect_to redireciona_para_projeto_ou_processo(@documento_do_processo), notice: 'Documento do processo foi atualizado com sucesso.'
			else
				disponibiliza_dependencias
				render :edit
			end
		end

		# DELETE /licitacao/documentos_do_processo/1
		def destroy
			if @documento_do_processo.processo.aguardando_parecer?
				@documento_do_processo.processo.enviado_para_comissao!
			elsif @documento_do_processo.processo.aguardando_parecer_final?
				@documento_do_processo.processo.update(status: :adjudicado)
			end
			mensagem = apaga_e_retorna_mensagem(@documento_do_processo)
			if @documento_do_processo.parecer?
					redirect_to licitacao_documentos_do_processo_path, mensagem
			else
				if params[:redirecionar] == "processo"
					redirect_to @documento_do_processo.processo
				else
					redirect_to redireciona_para_projeto_ou_processo(@documento_do_processo), mensagem
				end
			end
		end

		def retorna_modelo
			@modelo = Licitacao::ModeloDeDocumento.find(params[:modelo_id])
			@configuracao = Configuracao.last
			@pedido = @processo.pedido

			respond_to do |format|
				format.js
			end
		end

		def modelos
			@projeto = Licitacao::Projeto.find(params[:projeto_id])
			@modelos = Licitacao::ModeloDeDocumento.all

			# if params[:id] == 'personalizado'
			# 	render json: @modelos
			# else
			# 	render json: @modelos.send(params[:id])
			# end
			if params[:lei].present?
				@modelos = @modelos.where(lei: params[:lei])
			end

			respond_to do |format|
				format.json {render json: @modelos}
			end
		end

		private
		def set_documento_do_processo
			@documento_do_processo = Licitacao::DocumentoDoProcesso.find( params[:id] )
		end

		def set_processo
			if params[:action] == "update" || params[:action] == "edit"
				@processo = Licitacao::DocumentoDoProcesso.find(params[:id]).processo
			else
				@processo = Licitacao::Processo.find(params[:projeto_id])
			end
		end

		def set_projeto id = nil
			unless params[:projeto_id].nil?
				@projeto = Licitacao::Projeto.find(params[:projeto_id])
			else
				@projeto = Licitacao::Projeto.find(id) unless id.nil?
			end
		end

		def redireciona_para_projeto_ou_processo documento_do_processo
			documento_do_processo.documento_do_projeto ? set_projeto(documento_do_processo.processo.id) : documento_do_processo.processo
		end

		def disponibiliza_dependencias
			if params[:documento] == 'projeto' || (@documento_do_processo.documento_do_projeto && !(params[:documento] == "termo_de_referencia") && !(params[:documento] == "autorizacao"))
				@tipos_de_documentos_dos_processos = Licitacao::DocumentoDoProcesso.tipos_de_documento.select {|t| t == "outros_documentos" || t == "personalizado" || t == "termo_de_referencia" || t == "autorizacao"}
				@modelos_de_documentos = []
			else
				@tipo_de_documento ||= params[:documento]
				if @tipo_de_documento
					@tipos_de_documentos_dos_processos = Licitacao::DocumentoDoProcesso.tipos_de_documento
					@modelos_de_documentos = Licitacao::ModeloDeDocumento.where(modalidade: Licitacao::ModeloDeDocumento.modalidade_parse(@documento_do_processo.processo.modalidade_do_processo, @documento_do_processo.processo.modalidade_de_licitacao), tipo: Licitacao::DocumentoDoProcesso.tipos_de_documento[@tipo_de_documento])
				else

					if Configuracao.last.envia_parecer_inicial? || Configuracao.last.envia_parecer_final?
						@tipos_de_documentos_dos_processos = Licitacao::DocumentoDoProcesso.tipos_de_documento.reject {|t| t == "parecer"}
					else
							@tipos_de_documentos_dos_processos = Licitacao::DocumentoDoProcesso.tipos_de_documento
							@agentes_publicos_municipais = Base::AgentePublicoMunicipal.all
					end

					@modelos_de_documentos = []
				end
			end

			@leis = Licitacao::ModeloDeDocumento.leis
		end

		def disponibiliza_agentes_publicos_municipais
			@agentes_publicos_municipais = Base::AgentePublicoMunicipal.all
		end

		def disponibiliza_dependencias_do_parecer
			@tipo_de_documento = "parecer"
			@modelos_de_documentos = []
			@processos = Licitacao::Processo.where(status: [2,3,4,95,96])
			disponibiliza_agentes_publicos_municipais
		end

		# Permite apenas os parâmetros específicos
		def documento_do_processo_params
			params.require(:licitacao_documento_do_processo).permit(:tipo_de_documento, :numero,
				:titulo_personalizado, :projeto_id, :data_do_documento, :texto, :usuario_id, :documento,
				:modelo_do_documento_id, :agente_publico_municipal_id, :documento_do_projeto)
		end
	end
end
