module Contabilidade
class BloqueioDeDotacoesController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!
	before_action :set_bloqueio_de_dotacao, except: [:index, :new, :create]
	before_action :disponibiliza_dependencias, only: [:new, :create, :edit, :update]
	# before_action -> {verifica_mes_bloqueado(@bloqueio_de_dotacao)}, only: [:edit, :destroy]

	# GET /contabilidade/bloqueio_de_dotacoes
	def index
		@fontes_de_recursos_do_relatorio = contexto_atual.fontes_de_recursos.order(:codigo)
		@acoes_do_relatorio = current_usuario.acoes.do_exercicio(exercicio_atual).includes(:natureza_da_acao).order('base_naturezas_das_acoes.codigo, loa_acoes.codigo')
		@elementos_de_despesa_do_relatorio = contexto_atual.elementos_de_despesa.order(:codigo)
		#@unidades_gestoras = current_usuario.unidades_gestoras_do_exercicio(exercicio_atual).order("loa_unidades_gestoras.codigo::integer")
		@unidades_orcamentarias = contexto_atual.unidades_orcamentarias

		@q = BloqueioDeDotacao.order(:id).search(params[:q])
		@bloqueio_de_dotacoes = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	end

	# GET /contabilidade/bloqueio_de_dotacoes/1
	def show
	end

	# GET /contabilidade/bloqueio_de_dotacoes/1/edit
	def edit
		disponibiliza_subacao
		carrega_select_box
	end

	# PUT/PATCH /contabilidade/bloqueio_de_dotacoes/1
	def update
		if @bloqueio_de_dotacao.update( bloqueio_de_dotacao_params )
			redirect_to contabilidade_bloqueio_de_dotacao_path(@bloqueio_de_dotacao), notice: 'Bloqueio de dotacao foi atualizado com sucesso.'
		else
			disponibiliza_dependencias
			carrega_select_box
			render :edit
		end
	end

	# GET /contabilidade/bloqueio_de_dotacoes/new
	def new
		@bloqueio_de_dotacao = BloqueioDeDotacao.new
	end

	# POST /contabilidade/bloqueio_de_dotacoes
	def create
		@bloqueio_de_dotacao = BloqueioDeDotacao.new(bloqueio_de_dotacao_params)

		if @bloqueio_de_dotacao.save
			redirect_to contabilidade_bloqueio_de_dotacao_path(@bloqueio_de_dotacao), notice: 'Bloqueio de dotacao foi criado(a) com sucesso.'
		else
			disponibiliza_subacao
			disponibiliza_dependencias
			carrega_select_box
			render :new
		end
	end

	# DELETE /contabilidade/bloqueio_de_dotacoes/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@bloqueio_de_dotacao)
		redirect_to contabilidade_bloqueio_de_dotacoes_url, mensagem
	end

	# PATCH /contabilidade/bloqueio_de_dotacoes/1/desbloquear
	def desbloquear
		begin
			if @bloqueio_de_dotacao.desbloquear!
				redirect_to contabilidade_bloqueio_de_dotacao_path(@bloqueio_de_dotacao), success: 'O Crédito foi desbloqueado com sucesso.'
			else
				err_messages =@bloqueio_de_dotacao.try(:errors).try(:messages).any? ? @bloqueio_de_dotacao.try(:errors).try(:messages).values.flatten.join : "Entre em contato com o suporte"
				redirect_to contabilidade_bloqueio_de_dotacao_path(@bloqueio_de_dotacao), alert: "Não foi possível desbloquear o crédito. Por favor, confira se ele contém erros: #{err_messages}"
			end
		rescue => e
			flash.now[:alert] = e.message
			render :show
		end
	end

	def disponibiliza_subacao
		@bloqueio_de_dotacao.elemento_de_despesa_por_subacao_id = @bloqueio_de_dotacao.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao_id)
		@bloqueio_de_dotacao.subacao_id = @bloqueio_de_dotacao.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao).try(:subacao_id)
	end

	def carrega_select_box
		if @bloqueio_de_dotacao.orcamento_da_despesa_id.present?
			@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).where(subacao_id: @bloqueio_de_dotacao.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao).try(:subacao_id) ).order('base_elementos_de_despesa.codigo').all
			@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.where( elemento_de_despesa_por_subacao_id: @bloqueio_de_dotacao.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao_id) ).order(:fonte_de_recursos_id)

			elemento_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.where( id: @bloqueio_de_dotacao.try(:orcamento_da_despesa).try(:elemento_de_despesa_por_subacao_id) ).first
			@sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.ativos.where( elemento_de_despesa_id: elemento_de_despesa_por_subacao.try(:elemento_de_despesa_id) )

		else
			if @bloqueio_de_dotacao.elemento_de_despesa_por_subacao_id.present?
				@elementos_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.includes(:elemento_de_despesa).where(subacao_id: @bloqueio_de_dotacao.subacao_id ).order('base_elementos_de_despesa.codigo').all
				@orcamentos_da_despesa = Loa::OrcamentoDaDespesa.where( elemento_de_despesa_por_subacao_id: @bloqueio_de_dotacao.elemento_de_despesa_por_subacao_id ).order(:fonte_de_recursos_id)

				elemento_de_despesa_por_subacao = Loa::ElementoDeDespesaPorSubacao.find( @bloqueio_de_dotacao.elemento_de_despesa_por_subacao_id )
				@sub_elementos_de_despesa = Contabilidade::SubElementoDeDespesa.ativos.where( elemento_de_despesa_id: elemento_de_despesa_por_subacao.elemento_de_despesa_id )

			else
				@elementos_de_despesa_por_subacao = Array.new
				@orcamentos_da_despesa = Array.new
				@sub_elementos_de_despesa = []
			end
		end
	end

	def disponibiliza_dependencias
		@elementos_de_despesa_por_subacao = Array.new
		@orcamentos_da_despesa = Array.new
		@sub_elementos_de_despesa = []
		@projetos = current_usuario.projetos.do_exercicio(exercicio_atual).where(status: 99).where.not(numero_do_processo: nil)
		@contratos = contexto_atual.contratos
		@modalidades = Contabilidade::Empenho.modalidades
		@subacoes = current_usuario.subacoes.do_exercicio(exercicio_atual).includes(acao: :natureza_da_acao).order('base_naturezas_das_acoes.codigo, loa_acoes.codigo')
	end

	private
	def set_bloqueio_de_dotacao
		@bloqueio_de_dotacao = BloqueioDeDotacao.find( params[:id] )
	end

	# Permite apenas os parâmetros específicos
	def bloqueio_de_dotacao_params
		params.require(:contabilidade_bloqueio_de_dotacao).permit(:orcamento_da_despesa_id, :data_do_bloqueio, :sub_elemento_de_despesa_id, :valor, :justificativa)
	end
end
end
