class Contabilidade::LancamentosManuaisEmUnidadesOrcamentariasController < ApplicationController
	include ContabilidadeControllerConcern
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!
	before_action :disponibiliza_dados_edit, only: [:edit]
	before_action :disponibiliza_dados_update, only: [:update]
	before_action :disponibiliza_dados_para_quando_utilizar_contas, only: [:edit, :update]

	# GET /base/contas_bancarias/1/edit_entre_contas
	def edit
	end

	# PATCH/PUT /base/contas_bancarias/1
	def update
		@conta_para = Base::ContaBancaria.find_by(id: params[:conta_para]) || Base::ContaBancaria.new
		@transferir_para = @conta_para.contas_bancarias_por_unidade_orcamentaria.find_by(unidade_orcamentaria_id: params[:transferir_para]) || Base::ContaBancariaPorUnidadeOrcamentaria.new
		@descricao = params[:descricao]

		if valida_params_para_update(params) == false
			render :edit
			return false
		end

		if realizar_transferencia
			redirect_to base_movimentacoes_das_contas_bancarias_por_unidade_orcamentaria_path(@transferir_para), notice: 'Transferência realizada com sucesso.'
		else
			flash.now[:alert] = 'Não foi possível realizar a transferência.'
			render :edit
		end
	end

	private
	def valida_params_para_update(params)
		validado = true

		unless params[:transferir_para].present?
			@transferir_para.errors[:unidade_orcamentaria_id] = 'Não pode ficar em branco'
			validado = false
		end

		unless params[:valor].present?
			@valor_mensagem_de_obrigatorio = 'Não pode ficar em branco'
			validado = false
		end

		unless params[:descricao].present?
			@descricao_mensagem_de_obrigatorio = 'Não pode ficar em branco'
			validado = false
		end

		unless params[:conta_para].present?
			@conta_para.errors[:id] = 'Não pode ficar em branco'
			validado = false
		end

		if params[:valor].present? && params[:valor].to_f <= 0
			@valor_mensagem_de_obrigatorio = 'Preencha um valor maior que zero'
			validado = false
		end

		return validado
	end

	def disponibiliza_dados_edit
		@transferir_para = nil
	end

	def disponibiliza_dados_update
		params = lancamentos_manuais_em_unidades_orcamentarias_params
		@valor = params[:valor].to_f
		@valor_mensagem_de_obrigatorio = ''
		@descricao_mensagem_de_obrigatorio = ''
	end

	def disponibiliza_dados_para_quando_utilizar_contas
		@contas_bancarias = Base::ContaBancaria.includes(:agencia).all
		@unidades_orcamentarias_da_conta = []
	end

	def realizar_transferencia
		ActiveRecord::Base.transaction do
			begin
				@transferir_para.movimentacoes_da_conta_bancaria.create!(
					valor: @valor.to_f,
					historico: @descricao + "(conta #{@transferir_para.numero_agencia_e_banco})",
					modulo: @transferir_para,
					data_da_movimentacao: Date.today
				)

				return true
			rescue Exception
				return false
			end
		end
	end

	def lancamentos_manuais_em_unidades_orcamentarias_params
		params.permit(:transferir_para, :valor, :unidade_orcamentaria_id, :id, :conta_para, :descricao)
	end
end
