module Projecao
class ProjecoesDeReceitasController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!
	before_action :verifica_se_tem_contexto_valido_na_sessao!
	before_action :set_projecao_de_receita, only: [:notas_explicativas, :show,:update_notas_explicativas, :destroy, :importar_receitas_para_projecao, :new_copiar_calculos_de_projecoes, :copiar_calculos_de_projecoes]

	# GET /projecao/projecoes_de_receitas

	# GET /projecao/projecoes_de_receitas/1
	def show
			@calculos_de_projecoes = @projecao_de_receita.calculo_de_projecoes.group_by{|e| [e.exercicio_base, e.exercicio_destino]}
			@exercicios_destino = contexto_atual.projecao_de_receita.exercicios_destino.to_a
			@exercicios_destino.shift if contexto_atual.is_a? Orcamento
	end

	# PATCH/PUT /projecao/projecoes_de_receitas/1
	def update_notas_explicativas
		params_notas = notas_explicativas_params
		unless params_notas
			params_notas = {notas_explicativas: [""]}
		end

		params_notas[:notas_explicativas] = params_notas[:notas_explicativas].delete_if(&:blank?)
		if @projecao_de_receita.update(notas_explicativas: params_notas[:notas_explicativas])
			redirect_to @projecao_de_receita, notice: 'Notas Explicativas Atualizadas com sucesso'
		else
			render :edit
		end
	end

	def notas_explicativas
	end

	def importar_receitas_para_projecao
		respond_to do |format|
			if Projecao::Receita.importar_receitas_dos_orcamentos_anteriores( @projecao_de_receita )
				@projecao_de_receita.update( receitas_importadas: true )
				format.html { redirect_to @projecao_de_receita, notice: 'Receitas importadas com sucesso.' }
				format.json { render json: @projecao_de_receita, status: :updated, location: @projecao_de_receita }
			else
				@projecao_de_receita.update( receitas_importadas: false )
				@calculos_de_projecoes = @projecao_de_receita.calculo_de_projecoes.group_by{|e| [e.exercicio_base, e.exercicio_destino]}
				flash.now[:alert] = 'Não foi possível importar as receitas, tente novamente.'
				format.html { render :show }
				format.html { render json: { error: 'Não foi possível importar as receitas, tente novamente.' }, status: :unprocessable_entity }
			end
		end
	end

	def new_copiar_calculos_de_projecoes
		disponibiliza_lista_de_calculos
		render :form_copiar_calculo_de_projecoes
	end

	def copiar_calculos_de_projecoes
		respond_to do |format|
			if params[:exercicio_para_copia].present?
				calculos_copiados = []
				if params[:replicar_para_anos_subsequentes].eql?('true')
					if params[:exercicio_para_copia].eql?(@projecao_de_receita.exercicio_projecao_final.to_s)
						calculos_copiados << {exercicio_destino_fora_do_limite: true}
					else
						(params[:exercicio_para_copia].to_i..(@projecao_de_receita.exercicio_projecao_final-1)).each { |exercicio_base|
							calculos_copiados = @projecao_de_receita.copiar_calculos_de_projecoes(exercicio_base.to_s)
						}
					end
				else
					calculos_copiados = @projecao_de_receita.copiar_calculos_de_projecoes( params[:exercicio_para_copia])
				end

				if calculos_copiados[0][:sem_receitas].present?
					disponibiliza_lista_de_calculos
					format.html { redirect_to copiar_calculo_de_projecoes_path( id: @projecao_de_receita.id ), flash: {mensagem: "Receita(s) projetada(s) para #{params[:exercicio_para_copia]} não econtrada(s)."} }
					format.json { render json: {erro: "Receita(s) projetada(s) para #{params[:exercicio_para_copia]} não econtrada(s)."}, status: :unprocessable_entity }

				elsif calculos_copiados[0][:exercicio_destino_fora_do_limite].present?
					disponibiliza_lista_de_calculos
					format.html { redirect_to copiar_calculo_de_projecoes_path( id: @projecao_de_receita.id ), flash: {mensagem: "Não é possível realizar a cópia de #{params[:exercicio_para_copia]} para #{params[:exercicio_para_copia].to_i + 1}, pois ultrapassa o limite de exercícios de projeção da #{@projecao_de_receita.descricao.to_s}."} }
					format.json { render json: {erro: "Não é possível realizar a cópia de #{params[:exercicio_para_copia]} para #{params[:exercicio_para_copia].to_i + 1}, pois ultrapassa o limite de exercícios de projeção da #{@projecao_de_receita.descricao.to_s}."}, status: :unprocessable_entity }
				elsif calculos_copiados[0][:nao_ha_indice_projetado].present?
					disponibiliza_lista_de_calculos
					mensagem = "Não é possivel realizar a cópia pois não há índice definido na projeção de receita"
					format.html { redirect_to copiar_calculo_de_projecoes_path( id: @projecao_de_receita.id ), flash: {mensagem: mensagem} }
					format.json { render json: {erro: mensagem}, status: :unprocessable_entity }
				else
					format.html { redirect_to @projecao_de_receita, notice: 'Metodologia de cálculo replicada para o(s) ano(s) subesequente(s) com sucesso.' }
					format.json { render json: @projecao_de_receita.calculo_de_projecoes, status: :created }
				end
			else
				format.html {
					disponibiliza_lista_de_calculos
					flash.now[:alert] = "Por favor, selecione o exercicio que será replicado para o(s) exercício(s) subesequente(s)."
					render :form_copiar_calculo_de_projecoes
				}
				format.json { render json: "Informe os anos base e destino", status: :unprocessable_entity }
			end
		end
	end

	private
	def set_projecao_de_receita
		@projecao_de_receita = contexto_atual.projecao_de_receita
	end

	# Permite apenas os parâmetros específicos
	def projecao_de_receita_params
		params.require(:projecao_de_receita).permit(:descricao, :exercicio_base_inicial, :exercicio_base_final, :exercicio_corrente, :exercicio_projecao_inicial, :exercicio_projecao_final)
	end
	# Permite apenas notas explicativas
	def notas_explicativas_params
		params[:projecao_de_receita] ? params.require(:projecao_de_receita).permit(notas_explicativas: []) : nil
	end

	def disponibiliza_lista_de_calculos
		@lista_de_calculos = @projecao_de_receita.calculo_de_projecoes.where.not(exercicio_destino: @projecao_de_receita.exercicio_projecao_final).order(:exercicio_destino).map {|calculo|
			{
				exercicio_para_copia: calculo.exercicio_destino
			}
		}.uniq
	end
end
end
