module Base
	class NaturezasDaReceitaController < ApplicationController
		include LoaControllersConcern
		include ControllerConcern
		before_action :authenticate_usuario!
		before_action :bloquear_orcamento, only: [:new, :edit, :destroy]#natureza das receitas configt
		before_action :autoriza_usuario!, except: [:configurar_natureza_da_receita_update]
		before_action :disponibiliza_dependencias
		before_action :set_natureza_da_receita, only: [:show, :edit, :update, :destroy, :configurar_natureza_da_receita, :configurar_natureza_da_receita_update, :alterar_previsao_da_receita, :alterar_previsao]
		before_action :disponibiliza_receitas_que_podem_ter_detalhamento_optativo, only: [:new, :edit]
		before_action :disponibiliza_dependencias, only: [:new, :edit]

		# GET /base/naturezas_da_receita
		def index
			orcamento = logado_no_planejamento? ? orcamento_atual : contexto_atual
			session[:todas_as_receitas] = params[:todas_as_receitas] unless params[:todas_as_receitas].nil?
			exibir_todas_receitas = session[:todas_as_receitas]

			@unidades_orcamentarias = orcamento.unidades_orcamentarias

			if exibir_todas_receitas == "1"
				@q = contexto_atual.naturezas_da_receita.order(:codigo).ransack(query_params)
			else
				@q = contexto_atual.naturezas_da_receita.where("padrao = false OR (analitica = true AND exibir is true)").order(:codigo).ransack(query_params)
			end

			@naturezas_da_receita = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)

			if orcamento.utiliza_novo_tipo_para_receita?
				@categorias_economicas = orcamento.naturezas_da_receita.categorias_economicas(true)
				@origens =  orcamento.naturezas_da_receita.origens(true)
				@especies = orcamento.naturezas_da_receita.especies(true)
			else
				@categorias_economicas = orcamento.naturezas_da_receita.categorias_economicas(false)
				@origens =  orcamento.naturezas_da_receita.origens(false)
				@especies = orcamento.naturezas_da_receita.especies(false)
			end

			respond_to do |format|
				format.html
				format.json
			end
		end

		# GET /naturezas_da_receita/1/show
		def show
			respond_to do |format|
				# format.json { render json: {receita: @natureza_da_receita} }
				format.json
				format.html
			end
		end

		# GET /base/naturezas_da_receita/new
		def new
			@natureza_da_receita = NaturezaDaReceita.new
			@possivel_pai_selecionado = params[:id]
		end

		# # GET /base/naturezas_da_receita/1/edit
		def edit
			@natureza_da_receita.codigo = @natureza_da_receita.codigo_da_classificacao
		end

		# POST /base/naturezas_da_receita
		def create
			if params[:possivel_pai].empty?
				@natureza_da_receita = NaturezaDaReceita.new
				render :new && return
			end

			natureza_da_receita_pai = NaturezaDaReceita.find(params[:possivel_pai])
			@natureza_da_receita = natureza_da_receita_pai.dup
			@natureza_da_receita.analitica = true
			@natureza_da_receita.padrao = false
			@natureza_da_receita.receita_stn_id = nil
			@natureza_da_receita.descricao = natureza_da_receita_params[:descricao]
			@natureza_da_receita.codigo = natureza_da_receita_pai.gerar_codigo_para_filho(natureza_da_receita_params[:codigo])
			@natureza_da_receita.aplicacao_financeira_do_fundeb = true if natureza_da_receita_params[:aplicacao_financeira_do_fundeb].eql? "1"

			if @natureza_da_receita.save
				if manter_form_apos_cadastro?
					disponibiliza_receitas_que_podem_ter_detalhamento_optativo
					redirect_path = { action: :new }
				else
					redirect_path =  base_naturezas_da_receita_path(contexto_atual.class.to_s.downcase, contexto_atual.exercicio)
				end
				redirect_to redirect_path, notice: 'Classificação da receita foi criada com sucesso.'
			else
				disponibiliza_receitas_que_podem_ter_detalhamento_optativo
				disponibiliza_dependencias

				@natureza_da_receita.codigo = formata_parametro_codigo(natureza_da_receita_params[:codigo])
				@possivel_pai_selecionado = natureza_da_receita_pai.id
				render :new
			end
		end

		# PATCH/PUT /base/naturezas_da_receita/1
		def update
			natureza_da_receita_alterada = @natureza_da_receita.classificacao_com_niveis_utilizados

			if @natureza_da_receita.padrao.present?
				natureza_da_receita_alterada[ natureza_da_receita_alterada.keys.last ] = formata_parametro_codigo(natureza_da_receita_params[:codigo])
				natureza_da_receita_alterada[:codigo] = NaturezaDaReceita.completar_codigo_com_zeros(natureza_da_receita_alterada.values.join, true)
			end

			natureza_da_receita_alterada[:descricao] = natureza_da_receita_params[:descricao]


			if @natureza_da_receita.update( natureza_da_receita_alterada )
				redirect_to base_naturezas_da_receita_path(contexto_atual.class.to_s.downcase, contexto_atual.exercicio) + session[:filtros_natureza_da_receita].to_s, notice: 'Classificação da receita foi atualizada com sucesso.'
			else
				disponibiliza_receitas_que_podem_ter_detalhamento_optativo
				disponibiliza_dependencias
				@natureza_da_receita.codigo = formata_parametro_codigo(natureza_da_receita_params[:codigo])
				render :edit
			end
		end

		# DELETE /base/naturezas_da_receita/1
		def destroy
			mensagem = apaga_e_retorna_mensagem(@natureza_da_receita)
			redirect_to base_naturezas_da_receita_path(contexto_atual.class.to_s.downcase, contexto_atual.exercicio) + session[:filtros_natureza_da_receita].to_s, mensagem
		end

		def detalhar_nova_classificacao
			natureza_da_receita = NaturezaDaReceita.find( params[:id] )

			classificacao_detalhada = natureza_da_receita.detalhar_classificacao
			classificacao_niveis_utilizados = natureza_da_receita.classificacao_com_niveis_utilizados_e_obrigatorios_em_string
			classificacao_niveis_nao_utilizados = natureza_da_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': natureza_da_receita.tipo_de_orcamento.id,
				'descricao_tipo_de_orcamento': natureza_da_receita.tipo_de_orcamento.descricao,
				'tipo_de_receita': natureza_da_receita.tipo_de_receita,
				'descricao_tipo_de_receita': natureza_da_receita.tipo_de_receita.try(:capitalize)
			}
		end

		def configurar_natureza_da_receita
			@contas_extras_orcamentarias = orcamento_atual.contas_extra_orcamentarias
			if @natureza_da_receita.categoria_economica[2] == '7'
				@sub_contas = contexto_atual.sub_contas_pcasp.rpps
			else
				@sub_contas = contexto_atual.sub_contas_pcasp.divida_ativa
			end
			if @natureza_da_receita.percentuais_mensais == nil
				@natureza_da_receita.create_percentuais_mensais
			end
		end

		def configurar_natureza_da_receita_update
			if @natureza_da_receita.update( config_natureza_da_receita_params )
				redirect_to base_naturezas_da_receita_path(modulo: @contexto.class.to_s.downcase, exercicio: @contexto.exercicio) + session[:filtros_natureza_da_receita].to_s, notice: "Natureza da receita configurada com sucesso."
			else
				flash[:alert] = "Ocorreu um erro. Por favor, tente novamente."
				@contas_extras_orcamentarias = orcamento_atual.contas_extra_orcamentarias
				if @natureza_da_receita.categoria_economica[2] == '7'
					@sub_contas = contexto_atual.sub_contas_pcasp.rpps
				else
					@sub_contas = contexto_atual.sub_contas_pcasp.divida_ativa
				end
				render :configurar_natureza_da_receita
			end
		end

		def alterar_previsao_da_receita
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(is_unidade_arrecadadora: true).order(:codigo)
			@fontes_de_recursos = contexto_atual.fontes_de_recursos.where("base_fontes_stn.codigo_tipo_exercicio = 1")

			if @natureza_da_receita.unidades_orcamentarias_por_natureza_da_receita.empty?
				@natureza_da_receita.unidades_orcamentarias_por_natureza_da_receita.build
			end
		end

		def alterar_previsao
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.where(is_unidade_arrecadadora: true).order(:codigo)
			@fontes_de_recursos = contexto_atual.fontes_de_recursos.where("base_fontes_stn.codigo_tipo_exercicio = 1")

			if @natureza_da_receita.update( alterar_params )
				@natureza_da_receita.unidades_orcamentarias_por_natureza_da_receita.each do |unidade|
					unidade.update_attribute(:forma_de_adicao, :revisado) if unidade.forma_de_adicao.nil?
					unidade.orcamentos_da_receita.each do |fonte|
						fonte.update_attribute(:forma_de_adicao, :revisado) if fonte.forma_de_adicao.nil?
					end
				end
				redirect_to base_natureza_da_receita_path(@natureza_da_receita), notice: "Previsão da receita alterada com sucesso."
			else
				render :alterar_previsao_da_receita
			end
		end

		private
		def set_natureza_da_receita
			@natureza_da_receita = NaturezaDaReceita.find( params[:id] )
			@natureza_da_receita_pai = @natureza_da_receita.nivel_pai
		end

		def disponibiliza_receitas_que_podem_ter_detalhamento_optativo
			@naturezas_que_podem_ter_detalhamento_optativo = contexto_atual.naturezas_da_receita.order(:codigo).podem_ter_filhos

			array_naturezas_que_podem_ter_detalhamento_optativo = []

			@naturezas_que_podem_ter_detalhamento_optativo.each_with_index do |natureza, index|
				array_naturezas_que_podem_ter_detalhamento_optativo[index] = [natureza.codigo_formatado_e_descricao, natureza.id]
			end

			@naturezas_que_podem_ter_detalhamento_optativo = array_naturezas_que_podem_ter_detalhamento_optativo
		end

		# Permite apenas os parâmetros específicos
		def config_natureza_da_receita_params
			params.require(:base_natureza_da_receita).permit(
			:tipo_de_orcamento_id, :tipo_de_receita,
			:percentual_de_aplicacao_na_educacao, :percentual_de_aplicacao_na_saude, :sub_conta_pcasp_id,
			:pedir_cadastro_de_convenio, :pedir_cadastro_de_operacao_de_credito, :percentual_para_legislativo, :evento_contabil_obrigatorio,
			:historico_padrao, :legislacao_da_receita, percentuais_mensais_attributes: [:percentual_janeiro,:percentual_fevereiro,:percentual_marco,
			:percentual_abril,:percentual_maio,:percentual_junho,:percentual_julho,:percentual_agosto,:percentual_setembro,:percentual_outubro,
			:percentual_novembro,:percentual_dezembro, :natureza_da_receita_id])
		end

		# Permite apenas os parâmetros específicos
		def natureza_da_receita_params
			params.require(:base_natureza_da_receita).permit(:codigo, :descricao, :aplicacao_financeira_do_fundeb)
		end

		# Permite apenas os parâmetros específicos
		def alterar_params
			params.require(:base_natureza_da_receita).permit(
				:valor_previsto, :valor_disponivel, :valor_alteracao_da_previsao, :tipo_de_alteracao, :sub_conta_pcasp_id,
				unidades_orcamentarias_por_natureza_da_receita_attributes:[
					:id, :unidade_orcamentaria_id, :ativo, :forma_de_adicao, :_destroy,
					orcamentos_da_receita_attributes: [
						:id, :fonte_de_recursos_id, :valor, :valor_atual, :porcentagem, :ativo, :forma_de_adicao, :valor_antigo, :_destroy
					]
				]
			)
		end

		def disponibiliza_dependencias
			@contas_extras_orcamentarias = orcamento_atual.contas_extra_orcamentarias
			@sub_contas = contexto_atual.sub_contas_pcasp.divida_ativa.where(data_de_inativacao: nil)
			@tipos_de_orcamento = contexto_atual.tipos_de_orcamento.order( :codigo )
			@tipos_de_receita = Base::NaturezaDaReceita.tipo_de_receitas
		end

		def formata_parametro_codigo codigo
			codigo.present? ? codigo.rjust(2, '0') : codigo
		end
	end
end
