module CoreExtensions
	module String
		require 'amatch'
		include Amatch

		def numeric?
			return true if self =~ /\A\d+\Z/
		end

		def to_underscore
			self.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').gsub(/([a-z\d])([A-Z])/,'\1_\2').
			tr("- ", "_").tr("çÇ", "c").tr("ãÃáÁàÀ", "a").
			downcase
		end

		def formatado_como_classificacao_da_despesa
			self.gsub(/(\d{1})(\d{1})(\d{2})(\d{2})(\d{2})/, '\1.\2.\3.\4.\5')
		end

		def titulo_com_conectivo_em_minusculo
			conectivos = { "E" => "e", "Da" => "da", "De" => "de", "Do" => "do" }
			texto = self.titleize
			texto.gsub(/\w+/) { |g| conectivos.fetch(g,g) }
		end

		def sim_txt
			self.upcase
		end

		def sim_limite(numero, apendice="")
			if self.strip.length > numero.to_i
				texto = '"' + I18n.transliterate(self.strip[0..(numero - 1)]) + apendice + '"'
			else
				texto = '"' + I18n.transliterate(self) + apendice + '"'
			end
			
			return texto.delete('?')
		end

		def sim_limite_sem_aspas(numero, apendice="")
			if self.strip.length > numero.to_i
				texto = I18n.transliterate(self.strip[0..(numero - 1)]).to_s + apendice
			else
				texto = I18n.transliterate(self).to_s + apendice
			end

			return texto.delete('?')
		end

		def sim_preenche(numero)
			if self.strip.length > numero.to_i
				'"' + I18n.transliterate(self.strip[0..(numero - 1)]) + '"'
			elsif self.strip.length < numero.to_i
				'"' + I18n.transliterate(self.strip.rjust(numero, '0')) + '"'
			else
				'"' + I18n.transliterate(self) + '"'
			end
		end

		def sim_preenche_a_direita(numero)
			if self.strip.length > numero.to_i
				'"' + I18n.transliterate(self.strip[0..(numero - 1)]) + '"'
			elsif self.strip.length < numero.to_i
				'"' + I18n.transliterate(self.strip.ljust(numero, '0')) + '"'
			else
				'"' + I18n.transliterate(self) + '"'
			end
		end

		def codigo_uo_to_sim
			if self.length < 2
				'"' + I18n.transliterate(self.strip.rjust(2, '0')) + '"'
			elsif self.length > 4
				'"' + I18n.transliterate(self.strip[0..3]) + '"'
			else
				'"' + I18n.transliterate(self) + '"'
			end
		end

		def sim_valor
			format("%.2f", self) unless self.empty?
		end

		def sim_valor_maior
			format("%.6f", self) unless self.empty?
		end

		def sim_descricao
			self.split.reject(&:empty?).join(' ').delete('"')
		end
		
		def as_cpf
			if self.to_s.strip.length == 11
				p1, p2, p3, p4 = self.match(/(\d{3})\.?(\d{3})\.?(\d{3})-?(\d{2})/i).captures
				formatado = "#{p1}.#{p2}.#{p3}-#{p4}"
			else
				formatado = self
			end
		end

		def as_cpf_mascarado
			if self.to_s.strip.length == 11
				p1, p2, p3, p4 = self.match(/(\d{3})\.?(\d{3})\.?(\d{3})-?(\d{2})/i).captures
				formatado = "#{p1}.***.***-#{p4}"  # Mantém os 3 primeiros e os 2 últimos, com pontuação
			else
				formatado = self
			end
			formatado
		end

		def as_cnpj
			if self.to_s.strip.length == 14
				p1, p2, p3, p4, p5 = self.match(/(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})-?(\d{2})/i).captures
				formatado = "#{p1}.#{p2}.#{p3}/#{p4}-#{p5}"
			else
				formatado = self
			end
		end

		def as_telefone
			if self.to_s.strip.length == 10
				p1, p2, p3 = self.match(/(\d{2})\.?(\d{4})\.?(\d{4})/i).captures
				formatado = "(#{p1}) #{p2}-#{p3}"
			elsif self.to_s.strip.length == 11
				p1, p2, p3 = self.match(/(\d{2})\.?(\d{5})\.?(\d{4})/i).captures
				formatado = "(#{p1}) #{p2}-#{p3}"
			else
				formatado = self
			end
		end

		def as_cep
			if self.to_s.strip.length == 8
				p1, p2 = self.match(/(\d{5})\-?(\d{3})/i).captures
				formatado = "#{p1}-#{p2}"
			else
				formatado = self
			end
		end

		def mes_pelo_numero
			case self.to_i
			when 1
				"Janeiro"
			when 2
				"Fevereiro"
			when 3
				"Março"
			when 4
				"Abril"
			when 5
				"Maio"
			when 6
				"Junho"
			when 7
				"Julho"
			when 8
				"Agosto"
			when 9
				"Setembro"
			when 10
				"Outubro"
			when 11
				"Novembro"
			when 12
				"Dezembro"
			end
		end

		def similar?(string, porcentagem)
			JaroWinkler.new(self.upcase).match(string.upcase) >= porcentagem
		end
	end
end
