class Projecao::ReceitasDosCalculosDeProjecaoController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!
	before_action :set_calculo_de_projecao, only: [:new, :create]

	def new
		if @calculo_de_projecao.projecao_de_receita.receitas_importadas?
			if @calculo_de_projecao.indices_do_calculo_de_projecao.present?
				disponibiliza_dependencias( @calculo_de_projecao )
			else
				redirect_to projecao_calculo_de_projecao_path( id: @calculo_de_projecao.id, tab: 'indices' ), notice: 'Primeiro adicione o(s) índice(s) que serão utilizado(s) para o cálculo da projeção da(s) receita(s) selecionada(s).'
			end
		else
			redirect_to @calculo_de_projecao.projecao_de_receita, notice: 'Primeiro realize a importação das receitas na projeção de receita.'
		end
	end

	def create
		respond_to do |format|
			unless params.has_key?(:receitas)
				format.html { redirect_to @calculo_de_projecao, notice: 'Nenhuma receita foi selecionada.' }
			else
				receitas_ids = []
				@receitas_criadas = []
				@receitas_com_erro = []
				params[:receitas].values.each { |receita_id| receitas_ids << { receita_id: receita_id } }

				@calculo_de_projecao.receitas_dos_calculos_de_projecao.create( receitas_ids ).each { |rc|
					rc.persisted? ? @receitas_criadas << rc : @receitas_com_erro << rc
				}

				if @receitas_criadas.size == receitas_ids.size
					format.html { redirect_to @calculo_de_projecao, notice: 'Receita(s) selecionada(s) com sucesso.' }
					format.json { render json: @calculo_de_projecao.receitas_dos_calculos_de_projecao, status: :created, location: @calculo_de_projecao }
				else
					format.html { render :resultado }
				end
			end
		end
	end

	def destroy
		receita_do_calculo_de_projecao = Projecao::ReceitaDoCalculoDeProjecao.find( params[:id] )
		mensagem = apaga_e_retorna_mensagem( receita_do_calculo_de_projecao )
		redirect_to projecao_calculo_de_projecao_path( id: receita_do_calculo_de_projecao.calculo_de_projecao.id, tab: 'receitas' ), mensagem
	end

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

	def disponibiliza_dependencias calculo_de_projecao, lista_de_receitas=nil
		receitas_disponiveis = @calculo_de_projecao.projecao_de_receita.receitas_disponiveis(@calculo_de_projecao.exercicio_destino)
		unless lista_de_receitas
			lista_de_receitas = receitas_disponiveis.map(&:id)
		end
		@q = @calculo_de_projecao.projecao_de_receita.receitas.where( id: lista_de_receitas ).order(:codigo).search(params[:q])
		@receitas = @q.result(distinct: false)
	end

end
