module Controladoria
	class DocumentosDoProcessoController < ApplicationController
		include ControllerConcern
		include ControladoriaControllersConcern
		include Licitacao::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]

		# GET /controladoria/documentos_do_processo
		def index
		end

		# GET /controladoria/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
		end

		# GET /controladoria/documentos_do_processo/1/edit
		def edit
			disponibiliza_dependencias
		end

		# GET /controladoria/documentos_do_processo/1
		def show
		end

		# POST /controladoria/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
				redireciona_para_projeto_ou_processo(@documento_do_processo)
			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)
				redireciona_para_projeto_ou_processo(@documento_do_processo)
			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 controladoria_documentos_do_processo_path, mensagem
			else
				if params[:redirecionar] == "processo"
					redirect_to @documento_do_processo.processo
				else
					redireciona_para_projeto_ou_processo(@documento_do_processo)
				end
			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
		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

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

		def set_processo
			@processo = Licitacao::Processo.find(params[:projeto_id])
		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
			if documento_do_processo.documento_do_projeto || documento_do_processo.processo.numero_do_processo.nil?
				projeto = set_projeto(documento_do_processo.processo.id)

				if request.params[:action] == "create"
					redirect_to controladoria_projeto_path(projeto), notice: 'Documento do projeto foi criado com sucesso.'
				elsif request.params[:action] == "update"
					redirect_to controladoria_projeto_path(projeto), notice: 'Documento do projeto foi atualizado com sucesso.'
				elsif request.params[:action] == "destroy"
					redirect_to controladoria_projeto_path(projeto), notice: 'Documento do projeto foi apagado com sucesso.'
				end
			else
				processo = documento_do_processo.processo

				if request.params[:action] == "create"
					redirect_to controladoria_processo_path(processo), notice: 'Documento do processo foi criado com sucesso.'
				elsif request.params[:action] == "update"
					redirect_to controladoria_processo_path(processo), notice: 'Documento do processo foi atualizado com sucesso.'
				elsif request.params[:action] == "destroy"
					redirect_to controladoria_processo_path(processo), notice: 'Documento do processo foi apagado com sucesso.'
				end
			end
		end

		def disponibiliza_dependencias
			if params[:documento] == 'projeto' || (!params[:documento].present? && @documento_do_processo.processo.numero_do_processo.nil?)
				@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
					@tipos_de_documentos_dos_processos = Licitacao::DocumentoDoProcesso.tipos_de_documento.reject {|t| t == "parecer"}
					@modelos_de_documentos = []
				end
			end
		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
