class Base::PessoaContaBancaria < ApplicationRecord
	has_paper_trail

	belongs_to :pessoa, required: true, inverse_of: :pessoas_contas_bancarias
	belongs_to :banco, required: true, inverse_of: :pessoas_contas_bancarias

	# O vínculo direto com conta bancaria deixou de ser usado. A Pedido da consultoria as contas da pessoa, são
	# apenas a título de informação e não deve ser usado o cadastro da conta bancária em si para ser vinculado.
	# belongs_to :conta_bancaria, required: true, inverse_of: :pessoas_contas_bancarias

	has_many :empenhos, class_name: 'Contabilidade::Empenho', dependent: :restrict_with_exception
	has_many :pagamentos, class_name: 'Contabilidade::Pagamento', dependent: :restrict_with_exception

	validates_length_of :numero_da_conta, maximum: 11
	validates_length_of :operacao, maximum: 4, allow_blank: true
	validates_length_of :agencia, minimum: 4, maximum: 4
	validates_length_of :digito_agencia, minimum: 1, maximum: 1, allow_blank: true
	validates_length_of :chave_pix, minimum: 4, maximum: 50, allow_blank: true

	def descricao
		self.to_s
	end

	def to_s
		conta_info = "#{self.banco.sigla} / Agência: #{self.agencia.to_s} / Conta: #{self.numero_da_conta.to_s}"
		
		if self.operacao.present?
			conta_info += " / Op.: #{self.operacao.to_s}"
		end
	
		if self.chave_pix.present?
			conta_info += " / Chave PIX: #{self.chave_pix.to_s}"
		end
	
		conta_info
	end

	def digito_da_agencia
		if self.banco.present? && self.banco.numero_do_banco == 1
			a1 = self[:agencia].strip[3].to_i * 2
			b1 = self[:agencia].strip[2].to_i * 3
			c1 = self[:agencia].strip[1].to_i * 4
			d1 = self[:agencia].strip[0].to_i * 5
			soma = a1 + b1 + c1 + d1
			resto = soma % 11
			digito = 11 - resto

			digito = "X" if digito.to_i == 10
			digito = "0" if digito.to_i == 11

			digito
		elsif self.banco.present? && self.banco.numero_do_banco == 237

			peso = [5, 4, 3, 2]
			soma = 0

			self[:agencia].each_char.with_index do |digito, i|
				soma += digito.to_i * peso[i]
			end

			resto = soma % 11
			digito_verificador = resto.in?([0, 1]) ? 0 : 11 - resto

			digito_verificador
		elsif self.banco.present? && self.banco.numero_do_banco.to_i == 33 # santander
			agencia = self[:agencia].to_s.rjust(4, '0') # Garante que a agência tenha 4 dígitos

			multiplicadores = [9, 7, 3, 1]
			soma = 0

			agencia.chars.each_with_index do |digito, index|
				soma += digito.to_i * multiplicadores[index % 4]
			end

			digito = 11 - (soma % 11)
			digito = 0 if digito >= 10

			digito
		elsif self.banco.present? && self.banco.numero_do_banco == 341 # itau
			multiplicadores = [2, 1, 2, 1, 2, 1, 2]
			soma = 0
			agencia = self[:agencia].to_s.rjust(4, '0') # Garante que a agência terá 4 dígitos

			0.upto(6) do |i|
				produto = agencia[i].to_i * multiplicadores[i]
				soma += produto > 9 ? produto - 9 : produto
			end

			resto = soma % 10
			digito = 10 - resto
			digito = 0 if digito == 10
			
			digito
		elsif self.banco.present? && self.banco.numero_do_banco == 104 # caixa econômica
			multiplicadores = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5]
			soma = 0

			agencia = agencia.to_s.rjust(4, '0') # Garante que a agência tenha 4 dígitos

			for i in 0..11
				soma += agencia[i].to_i * multiplicadores[i]
			end

			digito = 11 - (soma % 11)
			digito = 0 if digito >= 10

			digito
		else
			# bancos que calculam pelo modulo 11
			if self.banco.present? && [3, 4, 12, 17, 21, 25, 29, 36, 37, 37, 40, 41, 41, 47, 47, 63, 65, 66, 69, 70, 74, 77, 82, 83, 83, 94, 95, 96, 107, 119, 120, 125, 169, 184, 208, 212, 217, 218, 233, 246, 250, 260, 263, 274, 320, 366, 370, 389, 394, 422, 456, 473, 634, 653, 655, 719, 747, 748, 755].include?(self.banco.numero_do_banco)
				digito = self.calcular_digito_verificador_modulo_11(self[:agencia])
			# bancos que calculam pelo modulo 10
			elsif self.banco.present? && [24, 75, 222, 248, 249, 265, 376, 399, 477, 505, 600, 604, 611, 612, 623, 633, 641, 643, 707, 707, 739, 740, 745, 746, 752, 756, 479].include?(self.banco.numero_do_banco)
				digito = self.calcular_digito_verificador_modulo_10(self[:agencia])
			else
				"0"
			end
		end
	end

	def calcular_digito_verificador_modulo_10(agencia)
		multiplicadores = [2, 1, 2, 1, 2, 1, 2]
		soma = 0

		agencia = agencia.to_s.rjust(4, '0')  # Garante que a agência terá 4 dígitos

		0.upto(6) do |i|
			produto = agencia[i].to_i * multiplicadores[i]
			soma += produto > 9 ? produto - 9 : produto
		end

		resto = soma % 10
		digito_verificador = 10 - resto
		digito_verificador = 0 if digito_verificador == 10

		digito_verificador
	end

	def calcular_digito_verificador_modulo_11(agencia)
		multiplicadores = [2, 3, 4, 5, 6, 7]
		soma = 0

		agencia = agencia.to_s.rjust(4, '0')  # Garante que a agência terá 4 dígitos

		0.upto(5) do |i|
			soma += agencia[i].to_i * multiplicadores[i]
		end

		resto = soma % 11
		digito_verificador = 11 - resto
		digito_verificador = 0 if digito_verificador == 10 || digito_verificador == 11

		digito_verificador
	end

	def agencia_com_digito
		"#{self.agencia}#{self.digito_da_agencia}"
	end

	def agencia_e_digito
		if self.digito_agencia.present?
			"#{self.agencia}-#{self.digito_agencia}"
		else
			"#{self.agencia}"
		end
	end

	private
	def verifica_se_conta_possui_empenhos
		if empenhos.any?
			raise "Essa conta não pode ser apagada pois possui empenhos"
		end
	end

end
