class Contabilidade::ContasPorEventosContabeisController < ApplicationController
	include ContabilidadeControllerConcern
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action do
		autoriza_usuario!(action_name, "contabilidade/eventos_contabeis")
	end
	before_action :disponibiliza_contas, except: :destroy
	before_action :set_evento_contabil, except: :destroy

	def new
		@conta_debito = @evento_contabil.contas_por_eventos_contabeis.new
		@conta_credito = @evento_contabil.contas_por_eventos_contabeis.new
	end

	def create
		Contabilidade::ContaPorEventoContabil.transaction do
			contas_debito_params = conta_por_evento_contabil_params.select {|cpec| cpec[:tipo_de_lancamento] == "debito"}
			contas_credito_params = conta_por_evento_contabil_params.select {|cpec| cpec[:tipo_de_lancamento] == "credito"}
			salvou = false
			error_mensagem = []
			(0..2).each do |index|
				@conta_debito = Contabilidade::ContaPorEventoContabil.new( contas_debito_params[index].merge({evento_contabil_id: @evento_contabil.id, gerar_conta_par: false}) )
				@conta_credito = Contabilidade::ContaPorEventoContabil.new( contas_credito_params[index].merge({evento_contabil_id: @evento_contabil.id, gerar_conta_par: false}) )
				if !@conta_debito.nil? && !@conta_credito.nil?
					atualiza_pares_das_contas( @conta_debito, @conta_credito )
					@conta_debito.gerar_conta_par = false
					if @conta_debito.save && @conta_credito.save && @conta_debito.pertence_ao_mesmo_grupo_de_conta?(@conta_credito)
						salvou = true
					else
						error_mensagem << mensagem_de_erro(@conta_debito, @conta_credito)
					end
				end
			end

			if salvou
				redirect_to @evento_contabil, notice: 'Contas adicionadas com sucesso.'
			else
				redirect_to contabilidade_conta_por_evento_contabil_new_path(evento_contabil_id: @evento_contabil.id), alert: error_mensagem.uniq.join(" ")
				raise ActiveRecord::Rollback
			end
		end
	end

	def destroy
		@conta = Contabilidade::ContaPorEventoContabil.find( params[:id] )
		@conta_par = Contabilidade::ContaPorEventoContabil.find_by( conta_par_id: @conta.conta_id, conta_id: @conta.conta_par_id)

		begin
			@conta.destroy && @conta_par.destroy
			redirect_to @conta.evento_contabil, notice: 'Contas removidas com sucesso.'
		rescue ActiveRecord::DeleteRestrictionError => e
			redirect_to @conta.evento_contabil, alert: 'Não é possível excluir esse par de contas, pois já foram realizadas movimentações nesse evento contábil'
		end
	end

	private
	def conta_por_evento_contabil_params
		params.permit( contas_por_eventos_contabeis: [:conta_id, :tipo_de_lancamento] ).require(:contas_por_eventos_contabeis)
	end

	def set_evento_contabil
		@evento_contabil = Contabilidade::EventoContabil.find( params[:evento_contabil_id] )
	end

	def disponibiliza_contas
		@contas_patrimoniais = contabilidade_atual.contas.analiticas.joins(:grupo_de_conta).where(contabilidade_grupo_de_contas: {codigo: 1}).order(:codigo)
		@contas_orcamentarias = contabilidade_atual.contas.analiticas.joins(:grupo_de_conta).where(contabilidade_grupo_de_contas: {codigo: 2}).order(:codigo)
		@contas_controle = contabilidade_atual.contas.analiticas.joins(:grupo_de_conta).where(contabilidade_grupo_de_contas: {codigo: 3}).order(:codigo)
	end

	def atualiza_pares_das_contas conta_debito, conta_credito
		conta_debito.conta_par_id = conta_credito.conta_id
		conta_credito.conta_par_id = conta_debito.conta_id
	end

	def mensagem_de_erro conta_debito, conta_credito
		mensagem = ''
		if conta_debito.conta_id.blank? && conta_credito.conta_id.blank?
			mensagem = "Selecione as contas para débito e crédito."
		elsif conta_debito.conta_id.blank?
			mensagem = "Selecione uma conta débito para cada conta crédito."
		elsif conta_credito.conta_id.blank?
			mensagem = "Selecione uma conta crédito para cada conta débito."
		elsif conta_debito.conta.codigo.eql?(conta_credito.conta.codigo)
			mensagem = "Não é possível selecionar duas contas iguais."
		elsif conta_debito.errors[:base].present?
			mensagem = "#{conta_debito.errors[:base][0]}"
		elsif conta_debito.errors[:conta_id].present?
			mensagem = "Conta de débito #{conta_debito.errors[:conta_id][0]}."
		elsif conta_credito.errors[:conta_id].present?
			mensagem = "Conta de crédito #{conta_credito.errors[:conta_id][0]}."
		else
			mensagem = "#{conta_debito.errors[:base][0]}."
		end

		return mensagem
	end
end
