module Base
	class ContasBancariasPorUnidadeOrcamentariaController < ApplicationController
		include ControllerConcern
		before_action :authenticate_usuario!
		before_action :autoriza_usuario!, except: [:atualizar_valor_da_conta]
		before_action :set_conta_bancaria_por_unidade_orcamentaria, only: [:show, :edit, :update, :destroy, :definir_como_principal]
		before_action :set_conta_bancaria, only: [:new, :create]
		before_action :verifica_se_conta_bancaria_eh_de_unidade, only:  [:new, :create]
		before_action :disponibiliza_dependencias, only: [:new, :edit]

		def new
			@conta_bancaria_por_unidade_orcamentaria = @conta_bancaria.contas_bancarias_por_unidade_orcamentaria.new
		end

		def create
			if @conta_bancaria.contas_bancarias_por_unidade_orcamentaria.present?
				@conta_bancaria_por_unidade_orcamentaria = @conta_bancaria.contas_bancarias_por_unidade_orcamentaria.new(conta_bancaria_por_unidade_orcamentaria_params)
				mensagem = 'Unidade Gestora foi vinculada à conta bancária com sucesso.'
			else
				@conta_bancaria_por_unidade_orcamentaria = @conta_bancaria.contas_bancarias_por_unidade_orcamentaria.new(conta_bancaria_por_unidade_orcamentaria_params)
				mensagem = 'Unidade Gestora foi vinculada à conta bancária com sucesso e definida como principal.'
			end

			if @conta_bancaria_por_unidade_orcamentaria.save
				redirect_to @conta_bancaria_por_unidade_orcamentaria.conta_bancaria, notice: mensagem
			else
				disponibiliza_dependencias
				render :new
			end
		end

		def destroy
			mensagem = apaga_e_retorna_mensagem(@conta_bancaria_por_unidade_orcamentaria)
			redirect_to @conta_bancaria_por_unidade_orcamentaria.conta_bancaria, mensagem
		end

		def movimentacoes
			@conta_bancaria_por_unidade_orcamentaria = Base::ContaBancariaPorUnidadeOrcamentaria.find(params[:id])

			@q = Contabilidade::MovimentacaoDaContaBancaria.where(conta_bancaria_por_unidade_orcamentaria_id: params[:id]).order("data_da_movimentacao ASC").search(params[:q])
			@movimentacoes_da_conta_bancaria = @q.result(distinct: false)
		end

		def definir_como_principal
			ActiveRecord::Base.transaction do
				begin
					if @conta_bancaria_por_unidade_orcamentaria.definir_como_principal
						@conta_bancaria_por_unidade_orcamentaria.conta_bancaria.send(:atualiza_saldo_inicial)
						mensagem = {notice: 'Foi definida uma nova unidade gestora padrão para essa conta bancária'}
						redirect_to @conta_bancaria_por_unidade_orcamentaria.conta_bancaria, mensagem
					else
						redirect_to @conta_bancaria_por_unidade_orcamentaria.conta_bancaria, alert: "Ocorreu um erro ao definir nova unidade gestora"
					end
				rescue => exception
					redirect_to @conta_bancaria_por_unidade_orcamentaria.conta_bancaria, alert: "Ocorreu um erro ao definir nova unidade gestora"
					raise ActiveRecord::Rollback
				end
			end
		end

		private
		def set_conta_bancaria_por_unidade_orcamentaria
			@conta_bancaria_por_unidade_orcamentaria = ContaBancariaPorUnidadeOrcamentaria.find( params[:id] )
		end

		def set_conta_bancaria
			@conta_bancaria = ContaBancaria.find( params[:conta_bancaria_id]  )
		end

		def disponibiliza_dependencias
			@unidades_orcamentarias = contexto_atual.unidades_orcamentarias
		end

		def verifica_se_conta_bancaria_eh_de_unidade
			redirect_to @conta_bancaria, alert: "Essa conta já está sendo utilizada por uma pessoa física ou jurídica" if @conta_bancaria.pessoa?
		end

		# Permite apenas os parâmetros específicos
		def conta_bancaria_por_unidade_orcamentaria_params
			params.require(:base_conta_bancaria_por_unidade_orcamentaria).permit(:conta_bancaria_id, :unidade_orcamentaria_id, :saldo_atual)
		end

	end
end
