module Projecao
class ReceitasController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:atualizar_calculos_por_exercicio]
	before_action :set_receita, only: [:show, :edit, :update, :destroy, :atualizar_calculos_por_exercicio, :atualizar_calculos_por_exercicio_projecao]
	before_action :set_projecao, only: [:index, :new, :quadro_de_projecao, :quadro_de_projecao_por_categoria_economica]
	# before_action :set_possiveis_pais, only: [:new, :edit]
	before_action :disponibiliza_dependencias, only: [:new, :edit]
	before_action :verifica_se_receitas_importadas, only: [:new, :create]
	before_action :verifica_se_editavel, only: [:edit, :update]

	# GET /projecao/receitas
	def index
		@exibir_todas_receitas = params[:todas_as_receitas]
		if @exibir_todas_receitas.present?
			@q = projecao_atual.receitas.order(:codigo).search(params[:q])
		else
			@q = projecao_atual.receitas.analiticas.order(:codigo).search(params[:q])
		end
		@receitas = @q.result.paginate(page: params[:page], per_page: 10)
		@receitas_hash = view_context.receitas_com_e_sem_calculo_de_projecao_identificadas_em_hash(@receitas, projecao_atual).compact

		if params[:quadro_de_projecao].present?
			respond_to do |format|
				format.html { render :quadro_de_projecao }
			end
		end
	end

	# GET /projecao/receitas/1
	def show
		@exercicio_corrente = @receita.projecao_de_receita.exercicio_corrente

		respond_to do |format|
			format.json { render json: @receita }
			format.html { redirect_to projecao_receitas_path, alert: "Essa receita não pode receber valores." unless @receita.analitica? }
		end
	end

	#
	# # GET /projecao/receitas/new
	# def new
	# 	@receita = projecao_atual.receitas.new
	# 	@possivel_pai_selecionado = [ params[:receita_id] ]
	# end
	#
	# # GET /projecao/receitas/1/edit
	# def edit
	# 	@possivel_pai_selecionado = [params[:receita_id] ]
	# 	@receita.codigo = @receita.codigo_da_classificacao
	# end
	#
	# # POST /projecao/receitas
	# def create
	# 	if (params[:possivel_pai].empty?)
	# 		@receita = Receita.new
	# 		render :new && return
	# 	end
	#
	# 	@receita_pai = Receita.find( params[:possivel_pai] )
	# 	codigo_da_receita = @receita_pai.classificacao_com_niveis_utilizados_e_obrigatorios_em_string.delete! '.'
	#
	# 	if (receita_params[:codigo].present?)
	# 		codigo_da_receita = codigo_da_receita + receita_params[:codigo].rjust(2, '0')
	# 		codigo_da_receita_completo = Receita.completar_codigo_com_zeros(codigo_da_receita)
	# 	else
	# 		codigo_da_receita_completo = ''
	# 	end
	#
	# 	classificacao_receita = Receita.classificacao_por_codigo(codigo_da_receita_completo)
	#
	# 	@receita = Receita.new(classificacao_receita)
	# 	@receita.codigo = codigo_da_receita_completo
	# 	@receita.descricao = receita_params[:descricao]
	# 	@receita.projecao_de_receita_id = projecao_atual.id
	# 	@receita.tipo_de_orcamento = receita_params[:tipo_de_orcamento]
	# 	@receita.importada = false
	# 	@receita.tipo_de_receita = receita_params[:tipo_de_receita]
	#
	# 	if @receita.save
	# 		if manter_form_apos_cadastro?
	# 			set_possiveis_pais
	# 			redirect_path = { action: :new }
	# 		else
	# 			redirect_path =  @receita
	# 		end
	# 		@receita.criar_calculos_por_exercicios
	# 		redirect_to redirect_path, notice: 'Receita foi criada com sucesso.'
	# 	else
	# 		set_possiveis_pais
	# 		disponibiliza_dependencias
	# 		@receita.codigo = formata_parametro_codigo(receita_params[:codigo])
	# 		@possivel_pai_selecionado = [@receita_pai.id]
	# 		render :new
	# 	end
	# end
	#
	# # PATCH/PUT /projecao/receitas/1
	# def update
	#
	# 	receita_alterada = @receita.classificacao_com_niveis_utilizados
	#
	# 	receita_alterada[ receita_alterada.keys.last ] = formata_parametro_codigo(receita_params[:codigo])
	#
	# 	receita_alterada[:codigo] = Receita.completar_codigo_com_zeros(receita_alterada.values.join)
	#
	# 	receita_alterada[:descricao] = receita_params[:descricao]
	#
	# 	receita_alterada[:tipo_de_receita] = receita_params[:tipo_de_receita]
	#
	# 	if @receita.update( receita_alterada )
	# 		redirect_to @receita, notice: 'Receita foi atualizada com sucesso.'
	# 	else
	# 		# set_possiveis_pais
	# 		disponibiliza_dependencias
	# 		@receita.codigo = formata_parametro_codigo(receita_params[:codigo])
	# 		render :edit
	# 	end
	# end
	#
	# # DELETE /projecao/receitas/1
	# def destroy
	# 	mensagem = apaga_e_retorna_mensagem(@receita)
	# 	redirect_to projecao_receitas_url(projecao_id: @receita.projecao_de_receita.id), mensagem
	# end

	def detalhar_classificacao
		receita = Receita.find( params[:receita_id] )

		classificacao_detalhada = receita.detalhar_classificacao
		classificacao_niveis_utilizados = receita.classificacao_com_niveis_utilizados_e_obrigatorios_em_string[0..-4]
		classificacao_niveis_nao_utilizados = receita.classificacao_com_niveis_nao_utilizados.formatar || ''
		render :json => {'classificacao_detalhada': classificacao_detalhada, 'classificacao_niveis_utilizados': classificacao_niveis_utilizados, 'classificacao_niveis_nao_utilizados': classificacao_niveis_nao_utilizados, 'tipo_de_orcamento': receita.tipo_de_orcamento, 'tipo_de_receita': receita.tipo_de_receita}
	end

	def detalhar_nova_classificacao
		receita = Receita.find( params[:receita_id] )

		classificacao_detalhada = receita.detalhar_classificacao
		classificacao_niveis_utilizados = receita.classificacao_com_niveis_utilizados_e_obrigatorios_em_string
		classificacao_niveis_nao_utilizados = receita.classificacao_com_niveis_nao_utilizados.formatar[0..-4] || ''
		render :json => {
			'classificacao_detalhada': classificacao_detalhada,
			'classificacao_niveis_utilizados': classificacao_niveis_utilizados,
			'classificacao_niveis_nao_utilizados': classificacao_niveis_nao_utilizados,
			'tipo_de_orcamento': receita.tipo_de_orcamento,
			'descricao_tipo_de_orcamento': receita.tipo_de_orcamento,
			'tipo_de_receita': receita.tipo_de_receita,
			'descricao_tipo_de_receita': receita.tipo_de_receita.try(:capitalize)
		}
	end

	def atualizar_calculos_por_exercicio
		parametros = calculo_por_exercicio_params

		unless current_usuario.administrador?
			calculo_por_exercicio_revisado = parametros["calculo_por_exercicios_attributes"]['4']
			parametros["calculo_por_exercicios_attributes"] = {'0': calculo_por_exercicio_revisado}
		end

		if @receita.update( parametros )
			@receita.receitas_dos_calculos_de_projecao.each { |receita_do_calculo| receita_do_calculo.atualiza_total_do_calculo_por_exercicio }
			redirect_to @receita, notice: 'Valores atualizados com sucesso.'
		else
			render :show
		end

	end

	def atualizar_calculos_por_exercicio_projecao
		redirect = @receita

		if @receita.de_convenio.present?
			redirect_to redirect , notice: 'Essa receita pertence a um convênio, seus valores projetados só podem ser editados na tela do convênio'
		elsif params[:projecao_receita] && @receita.update( calculo_por_exercicio_projecao_params )
			redirect_to redirect , notice: 'Valores atualizados com sucesso.'
		else
			render :show
		end
	end

	def quadro_de_projecao
		respond_to do |format|
			if params[:format].eql?('xlsx')
				@receitas = @projecao.receitas.where.not(codigo: nil).order(:codigo)
				format.xlsx { render xlsx: 'quadro_de_projecao', template: 'projecao/receitas/relatorios/quadro_de_projecao', filename: 'quadro_de_projecao.xlsx' }
			else
				@dados_do_relatorio = Projecao::Relatorios::QuadroDeProjecaoDasReceitas.dados_do_relatorio( @projecao )
				format.js { render file: 'projecao/receitas/relatorios/quadro_de_projecao.js.erb'}
			end
		end
	end

	def quadro_de_projecao_por_categoria_economica
		@dados_do_relatorio = Projecao::Relatorios::QuadroDeProjecaoDasReceitasPorCategoriaEconomica.dados_do_relatorio( @projecao )

		respond_to do |format|
			format.js { render file: 'projecao/receitas/relatorios/quadro_de_projecao_por_categoria_economica.js.erb'}
			format.xlsx { render xlsx: 'quadro_de_projecao_por_categoria_economica', template: 'projecao/receitas/relatorios/quadro_de_projecao_por_categoria_economica', filename: 'quadro_de_projecao_por_categoria_economica.xlsx' }
		end
	end

	private
	def set_receita
		@receita = Projecao::Receita.find_by( id: params[:id] )
		@receita_pai = @receita.nivel_pai
	end

	def set_projecao
		@projecao = projecao_atual
	end

	def receita_params
		params.require(:projecao_receita).permit(:codigo, :descricao, :tipo_de_orcamento, :tipo_de_receita)
	end

	def calculo_por_exercicio_params
		params.require(:projecao_receita).permit(calculo_por_exercicios_attributes: [:id, :exercicio, :total])
	end

	def calculo_por_exercicio_projecao_params
		params.require(:projecao_receita).permit(calculo_por_exercicios_projecao_attributes: [:id, :exercicio, :total], calculo_por_exercicios_attributes: [:id, :total ,:exercicio, :tipo])
	end

	def projecao_atual
		contexto_atual.projecao_de_receita
	end

	# def set_possiveis_pais

	# 	@naturezas_possiveis_pais = projecao_atual.receitas.order(:codigo).all

	# 	array_naturezas_possiveis_pais = []
	# 	@naturezas_possiveis_pais.each_with_index do |natureza, index|
	# 		if natureza.pode_ter_filho? && !natureza.tem_calculo_preenchido?
	# 			array_naturezas_possiveis_pais[index] = [natureza.codigo_formatado_e_descricao, natureza.id]
	# 		else
	# 			array_naturezas_possiveis_pais[index] = ["#{natureza.codigo_formatado_e_descricao}***", natureza.id]
	# 		end
	# 	end
	# 	@naturezas_possiveis_pais = array_naturezas_possiveis_pais
	# end

	def disponibiliza_dependencias
		@tipos_de_orcamento = Projecao::Receita.tipos_de_orcamento
		@tipos_de_receita = Projecao::Receita.tipo_de_receitas
	end

	def formata_parametro_codigo(codigo)
		if (codigo.present?)
			codigo = codigo.rjust(2, '0')
		else
			codigo = ''
		end

		codigo
	end

	def verifica_se_receitas_importadas
		redirect_to projecao_atual, alert: 'Primeiro importe as receitas da projeção.' unless projecao_atual.receitas_importadas
	end

	def verifica_se_editavel
		if @receita.padrao?
			redirect_to projecao_receitas_path, alert: "Essa receita não pode ser alterada."
		end
	end

	def busca_params
		if params[:q]
			return params[:q]
		elsif params[:categoria]
			return { codigo_start: params[:categoria] }
		end
	end
end
end
