local k=import("\046\046\047\097\115\115\105\103\110")local K=import("\046\046\047\116\121\112\101\075\101\121")local V=import("\046\046\047\102\117\110\099\116\105\111\110\115\047\116\121\112\101\111\102")local O=import("\046\047\085\068\105\109")local function x(k,K,V)return(1-V)*k+K*V end local T={}setmetatable(T,{__tostring=function()return"\085\068\105\109\050"end})local M={}function M.Lerp(V,k,K)return T.new(x(V.X.Scale,k.X.Scale,K),x(V.X.Offset,k.X.Offset,K),x(V.Y.Scale,k.Y.Scale,K),x(V.Y.Offset,k.Y.Offset,K))end local u={}u[K]="\085\068\105\109\050"function u.__index(K,k)local V=(getmetatable(K)).internal if V[k]~=nil then return V[k]end if M[k]~=nil then return M[k]end error(string.format("\037\115 \105\115 \110\111\116 \097 \118\097\108\105\100 \109\101\109\098\101\114 \111\102 \085\068\105\109\050",tostring(k)),2)end function u.__eq(K,k)return K.X==k.X and K.Y==k.Y end function u.__add(K,k)return T.new(K.X+k.X,K.Y+k.Y)end function T.new(...)if select("\035",...)==0 then return T.new(O.new(0,0),O.new(0,0))end if select("\035",...)==4 then local k,K,V,x=...if type(k)~="\110\117\109\098\101\114"or type(K)~="\110\117\109\098\101\114"or type(V)~="\110\117\109\098\101\114"or type(x)~="\110\117\109\098\101\114"then error("\085\068\105\109\050\046\110\101\119\040\120\083\099\097\108\101\044 \120\079\102\102\115\101\116\044 \121\083\099\097\108\101\044 \121\079\102\102\115\101\116\041 \116\097\107\101\115 \105\110 \052 \110\117\109\098\101\114\115",2)end return T.new(O.new(k,K),O.new(V,x))end local K,x=...if V(K)~="\085\068\105\109"or V(x)~="\085\068\105\109"then error("\085\068\105\109\050\046\110\101\119\040\120\068\105\109\044 \121\068\105\109\041 \116\097\107\101\115 \105\110 \050 \085\068\105\109\115",2)end local M={X=K,Y=x,Width=K,Height=x}local q=newproxy(true)k(getmetatable(q),u);(getmetatable(q)).internal=M return q end return T
local assign = import("../assign")
local typeKey = import("../typeKey")
local typeof = import("../functions/typeof")
local UDim = import("./UDim")

local function lerpNumber(a, b, alpha)
	return (1 - alpha) * a + b * alpha
end

local UDim2 = {}

setmetatable(UDim2, {
	__tostring = function()
		return "UDim2"
	end,
})

local prototype = {}

function prototype:Lerp(goal, alpha)
	return UDim2.new(
		lerpNumber(self.X.Scale, goal.X.Scale, alpha),
		lerpNumber(self.X.Offset, goal.X.Offset, alpha),
		lerpNumber(self.Y.Scale, goal.Y.Scale, alpha),
		lerpNumber(self.Y.Offset, goal.Y.Offset, alpha)
	)
end

local metatable = {}
metatable[typeKey] = "UDim2"

function metatable:__index(key)
	local internal = getmetatable(self).internal

	if internal[key] ~= nil then
		return internal[key]
	end

	if prototype[key] ~= nil then
		return prototype[key]
	end

	error(string.format("%s is not a valid member of UDim2", tostring(key)), 2)
end

function metatable:__eq(other)
	return self.X == other.X and self.Y == other.Y
end

function metatable:__add(other)
	return UDim2.new(self.X + other.X, self.Y + other.Y)
end

function UDim2.new(...)
	if select("#", ...) == 0 then
		return UDim2.new(
			UDim.new(0, 0),
			UDim.new(0, 0)
		)
	end

	if select("#", ...) == 4 then
		local xScale, xOffset, yScale, yOffset = ...
		if type(xScale) ~= "number" or type(xOffset) ~= "number" or
			type(yScale) ~= "number" or type(yOffset) ~= "number" then
			error("UDim2.new(xScale, xOffset, yScale, yOffset) takes in 4 numbers", 2)
		end

		return UDim2.new(
			UDim.new(xScale, xOffset),
			UDim.new(yScale, yOffset)
		)
	end

	local xDim, yDim = ...

	if typeof(xDim) ~= "UDim" or typeof(yDim) ~= "UDim" then
		error("UDim2.new(xDim, yDim) takes in 2 UDims", 2)
	end

	local internalInstance = {
		X = xDim,
		Y = yDim,
		Width = xDim,
		Height = yDim,
	}
	local instance = newproxy(true)

	assign(getmetatable(instance), metatable)
	getmetatable(instance).internal = internalInstance

	return instance
end

return UDim2
