module Projecao
	class CalculoDeProjecoesController < ApplicationController
		include ControllerConcern
		before_action :authenticate_usuario!
		before_action :autoriza_usuario!
		before_action :set_calculo_de_projecao, only: [:show, :edit, :update, :destroy, :remover_receitas_do_calculo, :recalcular_valor_das_receitas]
		before_action :verifica_se_receitas_importadas, only: [:new, :create, :edit, :update]

		# GET /projecao/calculo_de_projecoes/1
		def show
		end

		# GET /projecao/calculo_de_projecoes/new
		def new
			disponibiliza_dependencias( projecao_atual )
			@calculo_de_projecao = projecao_atual.calculo_de_projecoes.new
		end

		# GET /projecao/calculo_de_projecoes/1/edit
		def edit
			if @calculo_de_projecao.receitas_dos_calculos_de_projecao.present?
				redirect_to @calculo_de_projecao, alert: 'Já existem receitas calculadas com o exercício base e exercício destino, então não é mais possível editar o cálculo de projeção.'
			else
				disponibiliza_dependencias( @calculo_de_projecao.projecao_de_receita )
			end
		end

		# POST /projecao/calculo_de_projecoes
		def create
			@calculo_de_projecao = projecao_atual.calculo_de_projecoes.new(calculo_de_projecao_params)
			if @calculo_de_projecao.save
				redirect_to @calculo_de_projecao, notice: 'Cálculo de Projeção foi criado(a) com sucesso.'
			else
				disponibiliza_dependencias( projecao_atual )
				render :new
			end
		end

		# PATCH/PUT /projecao/calculo_de_projecoes/1
		def update
			if @calculo_de_projecao.update( calculo_de_projecao_params )
				redirect_to @calculo_de_projecao, notice: 'Cálculo de projeção foi atualizado(a) com sucesso.'
			else
				disponibiliza_dependencias( @calculo_de_projecao.projecao_de_receita )
				render :edit
			end
		end
		# DELETE /projecao/calculo_de_projecoes/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@calculo_de_projecao)
			redirect_to projecao_projecao_de_receita_path( anchor: "tab_calculo"), mensagem

		end

		def remover_receitas_do_calculo
			respond_to do |format|
				if @calculo_de_projecao.receitas_dos_calculos_de_projecao.present?
					@calculo_de_projecao.receitas_dos_calculos_de_projecao.destroy_all
					format.html { redirect_to @calculo_de_projecao,  notice: 'Receita(s) removida(s) com sucesso.' }
				else
					format.html { redirect_to :back, notice: 'Não há receita(s) para ser(em) removida(s).' }
				end
			end
		end

		def recalcular_valor_das_receitas
			respond_to do |format|
				if @calculo_de_projecao.recalcula_valor_das_receitas
					@calculo_de_projecao.update(recalcular_valor: false)
					format.html { redirect_to @calculo_de_projecao, notice: 'Valor(es) da(s) receita(s) recalculado(s) com sucesso.' }
					format.json { render json: @calculo_de_projecao.receitas_dos_calculos_de_projecao, status: :updated, location: @calculo_de_projecao }
				else
					flash.now[:alert] = 'Não foi possível recalcular os valores, tente novamente.'
					format.html { render :show }
					format.json { render json: @calculo_de_projecao.errors, status: :unprocessable_entity }
				end
			end
		end

		private
		def set_calculo_de_projecao
			@calculo_de_projecao = CalculoDeProjecao.find( params[:id] )
		end

		def disponibiliza_dependencias projecao
			@exercicios_base = projecao.pertence_a_orcamento? ? projecao.exercicios_destino : projecao.exercicios
			@exercicios_destino = projecao.exercicios_destino
			@exercicios_destino = projecao.exercicios_destino.to_a.drop(1) if projecao.pertence_a_orcamento?
		end

		# Permite apenas os parâmetros específicos
		def calculo_de_projecao_params
			params.require(:projecao_calculo_de_projecao).permit(:exercicio_projecao, :exercicio_destino, :exercicio_base,:memoria_de_calculo)
		end

		def projecao_atual
			@calculo_de_projecao ? @calculo_de_projecao.projecao_de_receita : contexto_atual.projecao_de_receita
		end

		def verifica_se_receitas_importadas
			redirect_to projecao_projecao_de_receita_path, alert: 'Primeiro importe as receitas da base de cálculo.' unless projecao_atual.receitas_importadas
		end
	end
end
