local locals = KC_ITEMS_LOCALS.modules.common

function KC_Common:Median(values)
	local num = getn(values)
	if (not values or num == 0) then return end
	sort(values)
	return (math.mod(num,2) == 1) and values[num/2 +.5] or self:Round((values[num/2] + values[num/2 +1]) / 2,3)
end

function KC_Common:WeightedAvg(new, old, nWeight, oWeight)
	if (old == 0) then return new end
	if (new == 0) then return old end
	return self:Round(new * nWeight + old * oWeight,3)
end

function KC_Common:Round(x, y)
	return floor(x * (10^(y or 0))) / (10^y) 
end

function KC_Common:Avg(values)
	local total = 0
	for i, v in ipairs(values) do total = total + v end
	return (total > 0) and self:Round(total / getn(values),3) or nil;
end

function KC_Common:ToHex(num)
	num = floor(num)
	return locals.hex[floor(num/16)+1]..locals.hex[mod(num,16)+1]
end

function KC_Common:GetHexCode(r, g, b, dec)
	r = dec and r * 255 or r
	g = dec and g * 255 or g
	b = dec and b * 255 or b
	return format("|cff%s%s%s", self:ToHex(r), self:ToHex(g), self:ToHex(b))
end

function KC_Common:BellCurve(values)
	if (not values or getn(values) == 0) then return; end
	if (getn(values) == 1) then return values[1]; end

	local avg = self:Avg(values)	
	local sd = self:StdDev(values, avg);

	sort(values);
	
	local lLimit = avg - (sd * 1.5);
	local hLimit = avg + (sd * 1.5);
	
	local lPass, hPass

	while (not lPass or not hPass) do
		lPass = (tonumber(values[1]) >= lLimit) and true or tremove(values,1)
		hPass = (tonumber(values[getn(values)]) <= hLimit) and true or tremove(values)
	end

	local median = self:Median(values)
	return median and floor(median) or nil;
end

function KC_Common:StdDev(values, avg)
	local num = 0

	for i,v in pairs(values) do
		num = num + ((v - avg)^2)	
	end

	num = num / getn(values);

	return floor(math.sqrt(num));
end
