module Licitacao
class ImportacoesTcmProcessosController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: %i[marcar_para_importacao desmarcar_para_importacao importar_tudo]
	before_action :set_importacao_tcm_processo, only: [:show, :edit, :update, :destroy, :editar_contratos, :atualizar_contratos, :marcar_para_importacao, :desmarcar_para_importacao]

	# GET /licitacao/importacoes_tcm_processos
	def index
		@q = Licitacao::ImportacaoTcmProcesso.order(id: :desc).search(params[:q])
		@importacoes_tcm_processos = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	end

	# GET /licitacao/importacoes_tcm_processos/1
	def show
	end

	# GET /licitacao/importacoes_tcm_processos/new
	def new
		@importacao_tcm_processo = Licitacao::ImportacaoTcmProcesso.new()
		@unidades_orcamentarias = []
		@categorias = []
	end

	# GET /licitacao/importacoes_tcm_processos/1/edit
	def edit
		orcamento = Orcamento.find_by_exercicio(@importacao_tcm_processo.exercicio)
		@unidades_orcamentarias = []
		@unidades_orcamentarias = orcamento.unidades_orcamentarias unless orcamento.nil?
		@categorias = Base::Categoria.all.select(&:pode_ter_itens?).sort_by {|categoria| categoria.titulo}
	end

	# POST /licitacao/importacoes_tcm_processos
	def create
		@importacao_tcm_processo = Licitacao::ImportacaoTcmProcesso.new(importacao_tcm_processo_params)
		if @importacao_tcm_processo.save
			redirect_to @importacao_tcm_processo, notice: 'Importacao tcm processo foi criado(a) com sucesso.'
		else
			orcamento = Orcamento.find_by_exercicio(@importacao_tcm_processo.exercicio)
			@unidades_orcamentarias = []
			@unidades_orcamentarias = orcamento.unidades_orcamentarias unless orcamento.nil?
			@categorias = Base::Categoria.all.select(&:pode_ter_itens?).sort_by {|categoria| categoria.titulo}
			render :new
		end
	end

	# PATCH/PUT /licitacao/importacoes_tcm_processos/1
	def update
		if @importacao_tcm_processo.update( importacao_tcm_processo_params )
			redirect_to @importacao_tcm_processo, notice: 'Importacao tcm processo foi atualizado(a) com sucesso.'
		else
			orcamento = Orcamento.find_by_exercicio(@importacao_tcm_processo.exercicio)
			@unidades_orcamentarias = []
			@unidades_orcamentarias = orcamento.unidades_orcamentarias unless orcamento.nil?
			@categorias = Base::Categoria.all.select(&:pode_ter_itens?).sort_by {|categoria| categoria.titulo}
			render :edit
		end
	end

	# DELETE /licitacao/importacoes_tcm_processos/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@importacao_tcm_processo)
		redirect_to licitacao_importacoes_tcm_processos_url, mensagem
	end

	#GET	/licitacao/importacoes_tcm_processos/1/editar_contratos
	def editar_contratos
		return if bloqueia_usuario_com_base_em 'create'
		@importacao_tcm_processo.importacoes_tcm_contratos.build if @importacao_tcm_processo.importacoes_tcm_contratos.empty?
		@unidades_orcamentarias_do_processo = @importacao_tcm_processo.projeto.unidades_orcamentarias
	end

	#PATCH /licitacao/importacoes_tcm_processos/1/atualizar_contratos
	def atualizar_contratos
		return if bloqueia_usuario_com_base_em 'create'

		if @importacao_tcm_processo.update(importacao_tcm_contrato_params)
			redirect_to licitacao_importacao_tcm_processo_path(@importacao_tcm_processo) + "?tab=contratos_importados", notice: 'Contratos importados com sucesso.'
		else
			@unidades_orcamentarias_do_processo = @importacao_tcm_processo.projeto.unidades_orcamentarias
			render :editar_contratos
		end
	end

	def marcar_para_importacao
		if @importacao_tcm_processo.present? && @importacao_tcm_processo.pendente?
			@importacao_tcm_processo.status = :selecionado
			@importacao_tcm_processo.save(validate: false)

			redirect_to request.referrer || licitacao_importacoes_tcm_processos_path, notice: 'Processo marcado para importação.'
		else
			redirect_to request.referrer || licitacao_importacoes_tcm_processos_path, alert: 'Processo não encontrado ou com pendências para importação.'
		end
	end

	def desmarcar_para_importacao
		if @importacao_tcm_processo.present? && @importacao_tcm_processo.selecionado?
			@importacao_tcm_processo.status = :pendente
			@importacao_tcm_processo.save(validate: false)

			redirect_to request.referrer || licitacao_importacoes_tcm_processos_path, notice: 'Processo desmarcado do processo de importação.'
		else
			redirect_to request.referrer || licitacao_importacoes_tcm_processos_path, alert: 'Processo não encontrado ou não selecionado para importação.'
		end
	end

	def importar_tudo
		quantidade_importada = 0

		Licitacao::ImportacaoTcmProcesso.selecionado.each do |tcm_processo|
			tcm_processo.gera_processo_com_suas_dependecias
			unless tcm_processo.errors.size > 0
				tcm_processo.status = :importado
				tcm_processo.save(validate: false)
				quantidade_importada += 1
			end
		end

		render json: {quantidade: quantidade_importada}
	end

	private
	def set_importacao_tcm_processo
		@importacao_tcm_processo = Licitacao::ImportacaoTcmProcesso.find( params[:id] )
	end

	# Permite apenas os parâmetros específicos
	def importacao_tcm_processo_params
		params.require(:licitacao_importacao_tcm_processo).permit(:numero_do_processo, :exercicio, :importar_contratos, :categoria_id, :unidade_orcamentaria_id, :cria_apenas_pedido, :cria_processo_completo)
	end

	def importacao_tcm_contrato_params
		params.require(:licitacao_importacao_tcm_processo).permit(importacoes_tcm_contratos_attributes: [:id, :importacao_tcm_processo_id, :numero_do_contrato, :exercicio, :unidade_orcamentaria_id, :_destroy])
	end

end
end
