class Contabilidade::SubElementosDeDespesaController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:new, :edit, :adicionar_novo, :criar_novo, :contas_por_subelemento]

	before_action :set_contexto, except: [:contas_por_subelemento, :destroy]
	before_action :set_sub_elemento_de_despesa, only: [:edit, :update, :destroy]
	before_action :disponibiliza_elementos, only: [:index, :new, :create, :edit, :update, :adicionar_novo, :criar_novo]
	before_action :disponibiliza_dependencias, only: [:new, :create, :edit, :update]
	before_action :bloquear_orcamento, only: [:new, :destroy, :adicionar_novo]

	def index
		@q = contexto_atual.elementos_de_despesa.where(exibir_elemento_de_despesa: true).search(params[:q])
		@elementos_de_despesa_filtro = contexto_atual.elementos_de_despesa.where(exibir_elemento_de_despesa: true).order(:codigo)
		@elementos_de_despesa = @q.result(distinct: true).order(:codigo)
	end

	def new
		return if bloqueia_usuario_com_base_em 'create'
		@tableless_sub_elemento_de_despesa = Tableless::SubElementoDeDespesa.new
	end

	def create
		@tableless_sub_elemento_de_despesa = Tableless::SubElementoDeDespesa.new(tableless_sub_elemento_de_despesa_params)

		if @tableless_sub_elemento_de_despesa.valid? && @tableless_sub_elemento_de_despesa.gerar_sub_elemento_de_despesa(@contexto)
			redirect_to contabilidade_sub_elementos_de_despesa_path(modulo: @contexto.class.to_s.downcase, exercicio: @contexto.exercicio), notice: "Subelemento de Despesa foi criado com sucesso."
		else
			flash.now[:alert] = 'Não foi possível criar o Subelemento de Despesa, verifique as informações.'
			render :new
		end
	end

	def edit
		return if bloqueia_usuario_com_base_em 'update'
	end

	def update
		if @sub_elemento_de_despesa.update(update_sub_elemento_de_despesa_params)
			redirect_to contabilidade_sub_elementos_de_despesa_path(modulo: @contexto.class.to_s.downcase, exercicio: @contexto.exercicio), notice: "Subelemento de Despesa foi alterado com sucesso."
		else
			flash.now[:alert] = 'Não foi possível alterar o Subelemento de Despesa, verifique as informações.'
			render :edit
		end
	end

	def adicionar_novo
		return if bloqueia_usuario_com_base_em 'create'
		@sub_elemento_de_despesa = Contabilidade::SubElementoDeDespesa.new
	end

	def criar_novo
		return if bloqueia_usuario_com_base_em 'create'
		@sub_elemento_de_despesa = Contabilidade::SubElementoDeDespesa.new(novo_sub_elemento_de_despesa_params)
		if @sub_elemento_de_despesa.valid? && @sub_elemento_de_despesa.save
			redirect_to contabilidade_sub_elementos_de_despesa_path(modulo: @contexto.class.to_s.downcase, exercicio: @contexto.exercicio), notice: "O novo Subelemento de Despesa foi adicionado com sucesso."
		else
			flash.now[:alert] = 'Não foi possível adicionar o novo Subelemento de Despesa, verifique as informações.'
			render :adicionar_novo
		end
	end

	def destroy
		mensagem = apaga_e_retorna_mensagem(@sub_elemento_de_despesa)
		redirect_to contabilidade_sub_elementos_de_despesa_path(modulo: @contexto.class.to_s.downcase, exercicio: @contexto.exercicio), mensagem
	end

	def contas_por_subelemento
		if params[:sub_elemento_de_despesa_codigo] == "31900101"
			codigos = ["321110101","321110102","321110103","321110104","321110105","321110106","321110107","321110199", "321119900"]
		elsif params[:sub_elemento_de_despesa_codigo] == "31900451"
			codigos = ["311210402","311210403","311210404","311210405","311210408"]
		elsif params[:sub_elemento_de_despesa_codigo] == "31900106"
			codigos = ["321110101","321110102","321110103","321110104","321110105","321110106","321110107","321110199","211210100"]
		elsif params[:sub_elemento_de_despesa_codigo] == "33900801"
			codigos = ["329110100","329110200","329110700"]
		elsif params[:sub_elemento_de_despesa_codigo] == "33900805"
			codigos = ["329110300","329110400","329110900"]
		elsif params[:sub_elemento_de_despesa_codigo] == "33900853"
			codigos = ["329110500","329110600","329110800"]
		elsif params[:sub_elemento_de_despesa_codigo] == "33900856"
			codigos = ["329111201","329111202", "329111203"]
		elsif params[:sub_elemento_de_despesa_codigo] == "33900809" || params[:sub_elemento_de_despesa_codigo] == "33900811" || params[:sub_elemento_de_despesa_codigo] == "33900813" || params[:sub_elemento_de_despesa_codigo] == "33900814" || params[:sub_elemento_de_despesa_codigo] == "33900815" || params[:sub_elemento_de_despesa_codigo] == "33900846" || params[:sub_elemento_de_despesa_codigo] == "33900847" || params[:sub_elemento_de_despesa_codigo] == "33900848"
			codigos = ["329119900"]
		elsif params[:sub_elemento_de_despesa_codigo] == "31900410"
			codigos = ["311210410","311210411"]
		elsif params[:sub_elemento_de_despesa_codigo] == "31901151" && params[:regime] == 'rpps'
			codigos = ["311110112", "311110113", "311110119", "311110120", "311110128", "311110129", "311110130", "311110132", "311110199", "311110202", "311110206", "311110208"]
		elsif params[:sub_elemento_de_despesa_codigo] == "31901151" && params[:regime] == 'rgps'
			codigos = ["311210112", "311210113", "311210119", "311210120", "311210128", "311210129", "311210130", "311210132", "311210199", "311210202", "311210208", "311210209", "311210109", "311210111", "311210205"]
		elsif params[:sub_elemento_de_despesa_codigo][0..5] == "319094"
				codigos = ["311110211", "311110212"]
		elsif params[:sub_elemento_de_despesa_codigo] == "31900410"
			codigos = ["311210410", "311210411"]
		end

		@contas = contexto_atual.contas.select {|conta| codigos.include?(conta.codigo)}
		respond_to do |format|
			format.json { render json: @contas }
			format.js
		end
	end

	private
	def set_contexto
		@contexto = params[:modulo].capitalize.constantize.find_by!(exercicio: params[:exercicio])
	end

	def set_sub_elemento_de_despesa
		@sub_elemento_de_despesa = Contabilidade::SubElementoDeDespesa.find(params[:id])
	end

	def disponibiliza_dependencias
		@topicos_da_subconta = Contabilidade::SubContaPcasp.topico_da_contas_i18n
		@sub_contas = contexto_atual.sub_contas_pcasp.where(data_de_inativacao: nil).order(:topico_da_conta)
		@categorias_economicas = NaturezaDaDespesa::CategoriaEconomica.where.not(codigo: '9').order(:codigo)
		@grupos_de_natureza_da_despesa = []
		@modalidades_de_aplicacao = NaturezaDaDespesa::ModalidadeDeAplicacao.where.not(codigo: '99').order(:codigo)
		@sub_elementos_de_despesa = []
		@sub_elementos_tce = NaturezaDaDespesa::SubElementoDeDespesa.joins(:elemento_de_despesa).where("natureza_da_despesa_sub_elementos_de_despesa.codigo != ?", @sub_elemento_de_despesa.codigo).where('natureza_da_despesa_elementos_de_despesa.codigo = ?', @sub_elemento_de_despesa.elemento_de_despesa.codigo[4..5]).order(:codigo)
	end

	def disponibiliza_elementos
		@elementos_de_despesa = contexto_atual.elementos_de_despesa.where.not(codigo: '99').where(exibir_elemento_de_despesa: true).includes(:sub_elementos_de_despesa).order(:codigo)
	end

	def tableless_sub_elemento_de_despesa_params
		params.require(:tableless_sub_elemento_de_despesa).permit(
			:categoria_economica_id, :grupo_de_natureza_da_despesa_id, :modalidade_de_aplicacao_id, :elemento_de_despesa_id,
			:sub_elemento_de_despesa_id
		)
	end

	def novo_sub_elemento_de_despesa_params
		params.require(:contabilidade_sub_elemento_de_despesa).permit(:elemento_de_despesa_id, :codigo, :descricao, :sub_conta_pcasp_id, :topico_da_subconta, :sub_elemento_origem_tce_id, :uso_na_msc)
	end

	def update_sub_elemento_de_despesa_params
		params.require(:contabilidade_sub_elemento_de_despesa).permit(:elemento_de_despesa_id, :codigo, :descricao, :sub_conta_pcasp_id, :topico_da_subconta, :sub_elemento_origem_tce_id, :uso_na_msc)
	end
end
