class Contabilidade::SubContasPcaspController < ApplicationController
	include ContabilidadeControllerConcern
	include ControllerConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!
	before_action :set_sub_conta_pcasp, only: [:show, :edit, :update, :destroy]
	before_action :set_dependencias, only: [:new, :create, :edit, :update]

  def index
    @q = contexto_atual.sub_contas_pcasp.ransack(query_params)
		if request.format.json?
			@q = contexto_atual.sub_contas_pcasp.ransack(query_params)
			natureza_da_receita = Base::NaturezaDaReceita.find(params[:natureza_da_receita_id]) if params[:natureza_da_receita_id].present?
			elemento_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.find(params[:elemento_de_despesa_por_subacao_id]) if params[:elemento_de_despesa_por_subacao_id].present?
			topico_da_subconta = params[:topico_da_subconta] if params[:topico_da_subconta].present?

			if natureza_da_receita.present? && natureza_da_receita.sub_conta_pcasp.present?
				@sub_contas_pcasp = @q.result(distinct: true).where(id: natureza_da_receita.sub_conta_pcasp_id).where(data_de_inativacao: nil)
			elsif topico_da_subconta.present?
				@sub_contas_pcasp = @q.result(distinct: true).where(topico_da_conta: Contabilidade::SubContaPcasp.topico_da_contas[topico_da_subconta]).where(data_de_inativacao: nil)
			else
				if natureza_da_receita.present?
					if natureza_da_receita.try(:detalhamento_optativo).to_s == "3"
						@sub_contas_pcasp = @q.result(distinct: true).divida_ativa.where(data_de_inativacao: nil)
					elsif natureza_da_receita.try(:codigo).to_s == '0012150111000000' || natureza_da_receita.try(:codigo).to_s == '0072150211000000'
						@sub_contas_pcasp = @q.result(distinct: true).rpps.where(data_de_inativacao: nil)
					end
				end

				if elemento_de_despesa_por_subacao.present?
					elementos_precatorios = ['67', '91']
					elementos_obrigacoes = ['71', '72', '73', '74', '75', '76', '77']

					if elementos_precatorios.include?(elemento_de_despesa_por_subacao.elemento_de_despesa.codigo[4..5])
						@sub_contas_pcasp = @q.result(distinct: true).precatorio.where(data_de_inativacao: nil).joins(:movimentacoes_do_plano_de_contas).where('contabilidade_movimentacoes_do_plano_de_contas.unidade_orcamentaria_id = ?', elemento_de_despesa_por_subacao.subacao.unidade_orcamentaria_id)
					elsif elementos_obrigacoes.include?(elemento_de_despesa_por_subacao.elemento_de_despesa.codigo[4..5])
						ids_unidades_orcamentarias = elemento_de_despesa_por_subacao.subacao.unidade_orcamentaria.unidade_gestora.unidades_orcamentarias.pluck(:id)
						subcontas_relacionadas_as_unidades_por_movimento = Contabilidade::SubContaPcasp.joins(:movimentacoes_do_plano_de_contas).where('contabilidade_movimentacoes_do_plano_de_contas.unidade_orcamentaria_id in (?)', ids_unidades_orcamentarias).uniq.pluck(:codigo)
						@sub_contas_pcasp = @q.result(distinct: true).obrigacoes.where(data_de_inativacao: nil).where('codigo in (?)', subcontas_relacionadas_as_unidades_por_movimento)
						#@sub_contas_pcasp = @q.result(distinct: true).obrigacoes.where(data_de_inativacao: nil).joins(:movimentacoes_do_plano_de_contas).where('contabilidade_movimentacoes_do_plano_de_contas.unidade_orcamentaria_id in (?)', ids_unidades_orcamentarias)
					else
						@sub_contas_pcasp = @q.result(distinct: true).obrigacoes.where(data_de_inativacao: nil).joins(:movimentacoes_do_plano_de_contas).where('contabilidade_movimentacoes_do_plano_de_contas.unidade_orcamentaria_id = ?', elemento_de_despesa_por_subacao.subacao.unidade_orcamentaria_id)
					end
				end
			end
		else
			@sub_contas_pcasp = @q.result(distinct: true).order(:topico_da_conta,:codigo).paginate(page: params[:page], per_page: 15)
		end

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

	def show
		@exibir_alerta_contexto = self.send(:exibir_alerta_de_contexto?, nil, nil, @sub_conta_pcasp.orcamento)
	end

	def new
    @sub_conta_pcasp = Contabilidade::SubContaPcasp.new
	end

	def create
    @sub_conta_pcasp = Contabilidade::SubContaPcasp.new(sub_conta_pcasp_params)

    if @sub_conta_pcasp.save
      redirect_to contabilidade_sub_contas_pcasp_path, notice: 'Sub Conta do PCASP foi criado(a) com sucesso.'
    else
      render :new
    end
	end

	def edit
	end

	def update
		if @sub_conta_pcasp.update( sub_conta_pcasp_params )
			if sub_conta_pcasp_params[:data_de_inativacao].present?
					redirect_to contabilidade_sub_conta_pcasp_path(@sub_conta_pcasp), notice: 'Sub Conta do PCASP foi inativada com sucesso.'
			else
				redirect_to contabilidade_sub_conta_pcasp_path(@sub_conta_pcasp), notice: 'Sub Conta do PCASP foi atualizado(a) com sucesso.'
			end
		else
			if sub_conta_pcasp_params[:data_de_inativacao].present?
				params[:inativacao] = true
				flash.now[:alert] = @sub_conta_pcasp.errors.messages.values.join(", ")
				render :edit
			else
				flash.now[:alert] = @sub_conta_pcasp.errors.messages.values.join(", ")
				render :edit
			end
		end
	end

	def destroy
		if @sub_conta_pcasp.movimentacoes_do_plano_de_contas.any?
			redirect_to contabilidade_sub_contas_pcasp_path, notice: 'A sub conta PCASP possui movimentos e não pode ser excluinda'
		else
			mensagem = apaga_e_retorna_mensagem(@sub_conta_pcasp)
			redirect_to contabilidade_sub_contas_pcasp_path, mensagem
		end
	end

	def inativar_subconta_pcasp
		
	end

	private
	def set_dependencias
		# issac pediu pra desativar, chamado #2811
		@centros_de_custo = [] #Controladoria::CentroDeCusto.all rescue []
	end

	def set_sub_conta_pcasp
		@sub_conta_pcasp= Contabilidade::SubContaPcasp.find(params[:id])
	end

	def sub_conta_pcasp_params
		params.require(:contabilidade_sub_conta_pcasp).permit(:id, :topico_da_conta, :titulo, :codigo, :descricao, :centro_de_custo_id, :data_de_inativacao, :divida_consolidada)
	end

end
