--EVERY FRAME (Throttled)
function()
	if aura_env.lastscan < GetTime() then
		if UnitExists("focus") then
			if UnitInParty("focus") then
				--Get MapID for both
				local myMapID = C_Map.GetBestMapForUnit("player")
				local focusMapID = C_Map.GetBestMapForUnit("focus")

				--Get Coordinates for both within same map
				local pX, pY, fX, fY = 0, 0, 0, 0
				if myMapID == focusMapID then
					pX, pY = aura_env.round(C_Map.GetPlayerMapPosition(myMapID, "player").x, 4) * 10000, aura_env.round(C_Map.GetPlayerMapPosition(myMapID, "player").y, 4) * 10000
					fX, fY = aura_env.round(C_Map.GetPlayerMapPosition(myMapID, "focus").x, 4) * 10000, aura_env.round(C_Map.GetPlayerMapPosition(myMapID, "focus").y, 4) * 10000
				end

				if pX > 0 and pY > 0 and fX > 0 and fY > 0 then
					--Get player direction facing and convert to angle
					local playerFace = GetPlayerFacing() or 0
					local playerA = math.floor(playerFace * 100)
					playerA = aura_env.range(playerA, 0, 630, 360) - 1
					playerA = - playerA
					playerA = math.floor(playerA)
					playerA = playerA - 90
					if playerA < 0 then playerA = playerA + 360 end

					--Get relative Coordinates
					local X = fX - pX
					local Y = fY - pY
					local hyp = math.sqrt((X ^ 2) + (Y ^ 2))
					local a = math.atan2(Y, X)
					a = a - math.rad(playerA)
					local Y2, X2 = hyp * math.cos(a), hyp * math.sin(a)
					local zoomout, zoomin = 100, 50
					if (math.abs((X2 * aura_env.zoom)) > zoomout or math.abs((Y2 * aura_env.zoom)) > zoomout) and aura_env.zoom > 0.3 then
						aura_env.zoom = aura_env.zoom - 0.2
					elseif (math.abs((X2 * aura_env.zoom)) > zoomout or math.abs((Y2 * aura_env.zoom)) > zoomout) and aura_env.zoom <= 0.3 and aura_env.zoom > 0.1 then
						aura_env.zoom = aura_env.zoom - 0.05
					elseif (math.abs((X2 * aura_env.zoom)) > zoomout or math.abs((Y2 * aura_env.zoom)) > zoomout) and aura_env.zoom <= 0.1 and aura_env.zoom > 0.0005 then
						aura_env.zoom = aura_env.zoom - 0.0005
					elseif (math.abs((X2 * aura_env.zoom)) > zoomout or math.abs((Y2 * aura_env.zoom)) > zoomout) and aura_env.zoom < 0.001 then
						aura_env.zoom = 1
					end
					if (math.abs((X2 * aura_env.zoom)) < zoomin and math.abs((Y2 * aura_env.zoom)) < zoomin) and aura_env.zoom < 50 then
						aura_env.zoom = aura_env.zoom + 0.2
					end 
					aura_env.region.text:SetText("Zoom: " .. aura_env.zoom .. "\nDistance: " .. aura_env.round(hyp, 0))
					aura_env.region.playerTexture:SetPoint("CENTER", aura_env.region, "CENTER", 0, 0)
					aura_env.region.focusTexture:SetPoint("CENTER", aura_env.region, "CENTER", X2 * aura_env.zoom, Y2 * aura_env.zoom)
					
					--Get class to color
					local pclass, fclass = select(3, UnitClass("player")), select(3, UnitClass("focus"))
					aura_env.region.playerTexture:SetVertexColor(aura_env.classColor(pclass))
					aura_env.region.focusTexture:SetVertexColor(aura_env.classColor(fclass))
					return true
				else
					print("Focus not in map!")
				end
				aura_env.lastscan = GetTime() + aura_env.throttle / 1000
			else print("Focus not in party!"); aura_env.region.playerTexture:Hide(); aura_env.region.focusTexture:Hide(); aura_env.lastscan = GetTime() + 5 end
		else print("No focus found!"); aura_env.region.playerTexture:Hide(); aura_env.region.focusTexture:Hide(); aura_env.lastscan = GetTime() + 5 end
	end
end

--INIT
aura_env.throttle = 250
aura_env.lastscan = 0
aura_env.zoom = 1	
aura_env.range = function(val, min, max, max2)
	val = 1 - (((max - val) / (max - min)) * max2)
	return val
end
aura_env.round = function(var, n)
	if (n) then
		var = math.floor((var * 10^n) + 0.5) / (10^n)
	else
		var = math.floor(var+0.5)
	end
	return var
end
aura_env.classColor = function(class)
	  if class == 1 then return 0.78, 0.61, 0.43, 0.75 elseif
	  class == 2 then return 0.96, 0.55, 0.73, 0.75 elseif
	  class == 3 then return 0.67, 0.83, 0.45, 0.75 elseif
	  class == 4 then return 1, 0.96, 0.41, 0.75 elseif
	  class == 5 then return 1, 1, 1, 0.75 elseif
	  class == 6 then return 0.77, 0.12, 0.23, 0.75 elseif
	  class == 7 then return 0, 0.44, 0.87, 0.75 elseif
	  class == 8 then return 0.25, 0.78, 0.92, 0.75 elseif
	  class == 9 then return 0.53, 0.53, 0.93, 0.75 elseif
	  class == 10 then return 0, 1, 0.59, 0.75 elseif
	  class == 11 then return 1, 0.49, 0.04, 0.75 elseif
	  class == 12 then return 0.64, 0.19, 0.79, 0.75 else
	  return 1, 1, 1, 1 end
end

if not aura_env.region.playerTexture then
	local playerTexture = aura_env.region:CreateTexture(nil, "OVERLAY")
	aura_env.region.playerTexture = playerTexture
end
aura_env.region.playerTexture:SetTexture("Interface\\Addons\\WeakAuras\\PowerAurasMedia\\Auras\\Aura72")
aura_env.region.playerTexture:SetHeight(16)
aura_env.region.playerTexture:SetWidth(16)
aura_env.region.playerTexture:Show()
if not aura_env.region.focusTexture then
	local focusTexture = aura_env.region:CreateTexture(nil, "OVERLAY")
	aura_env.region.focusTexture = focusTexture
end
aura_env.region.focusTexture:SetTexture("Interface\\Addons\\WeakAuras\\PowerAurasMedia\\Auras\\Aura72")
aura_env.region.focusTexture:SetHeight(16)
aura_env.region.focusTexture:SetWidth(16)
aura_env.region.focusTexture:Show()
if not aura_env.region.text then
	local text = aura_env.region:CreateFontString(nil, aura_env.region)
	aura_env.region.text = text
end
aura_env.region.text:ClearAllPoints()
aura_env.region.text:SetPoint("CENTER", aura_env.region, "CENTER", 0, 500)
aura_env.region.text:SetFont("Interface\\AddOns\\SharedMedia_MyMedia\\font\\FiraCode-Medium.ttf", 16, "OUTLINE")
aura_env.region.text:SetJustifyH("CENTER")
aura_env.region.text:Show()