--[[

	LEMBRANDO QUE esse module não está 100% pronto para usar, pois
	você caso as funções sejam chamadas várias vezes, ele irá bugar.
	Faça alguma forma de evitar isso, pois a ideia do module é apenas
	de dar as base das funções que envolvem uma parte mais "complexa"!

]]


local module = {}

local TweenService = game:GetService("TweenService")

local Sufixes = {'K','M','B','T','qd','Qn','sx','Sp','O','N','de','Ud','DD','tdD','qdD','QnD','sxD','SpD','OcD','NvD','Vgn','UVg','DVg','TVg','qtV','QnV','SeV','SPG','OVG','NVG','TGN','UTG','DTG','tsTG','qtTG','QnTG','ssTG','SpTG','OcTG','NoAG','UnAG','DuAG','TeAG','QdAG','QnAG','SxAG','SpAG','OcAG','NvAG','CT'}
local digitsProgression = 3

local defaultInfo = {
	Duration = .7,
	EasingStyle = Enum.EasingStyle.Exponential,
	EasingDirection = Enum.EasingDirection.Out
}

function module.formatNumber(number)
	
	local digits = math.floor(math.log10(math.abs(number)))
	
	local level = math.floor(digits/digitsProgression)
	
	if level >= 1 then
		level = math.clamp(level, 1, #Sufixes)
		
		local sufix = Sufixes[level]
		local divNumber = number / (10^digits)
		return string.format("%.2f %s", divNumber, sufix)
	end
	return string.format("%.2f", number)
end

function module.updateNumber(Label, oldValue, newValue, Info)
	Info = typeof(Info) == table and Info or defaultInfo
	
	local diference = newValue - oldValue
	local startTick = tick() 
	local endTick = startTick + Info.Duration
	repeat
		local currentTick = tick()
		local tickRatio = (currentTick-startTick)/(endTick-startTick)
		local tweenMultiplier = TweenService:GetValue(tickRatio, Info.EasingStyle, Info.EasingDirection)
		
		local nextNumber = oldValue + diference*tweenMultiplier
		Label.Text = module.formatNumber(nextNumber)
		
		task.wait()
	until tick() >= endTick
	Label.Text = module.formatNumber(newValue)
end

return module
