local Lobby = luiglobals.Lobby
local SystemLinkJoinMenu = LUI.mp_menus.SystemLinkJoinMenu

if (not SystemLinkJoinMenu) then
	return
end

game:addlocalizedstring("MENU_NUMPLAYERS", "Players")
game:addlocalizedstring("MENU_PING", "Ping")

local offsets = {
	10,
	500,
	950,
	700,
	1100,
}

local columns = {
	"@MENU_HOST_NAME",
	"@MENU_MAP",
	"@MENU_NUMPLAYERS",
	"@MENU_TYPE1",
	"@MENU_PING",
}

SystemLinkJoinMenu.AddHeaderButton = function(menu, f12_arg1, width)
	local state = CoD.CreateState(0, f12_arg1, nil, nil, CoD.AnchorTypes.TopLeft)
	state.width = width
	local element = LUI.UIElement.new(state)
	local button = SystemLinkJoinMenu.CreateButton("header", 24)

	button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.TopLeftRight), 40, LUI.Divider.Grey))
	button:makeNotFocusable()
	button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.BottomLeftRight), 40, LUI.Divider.Grey))
	
	local gettext = function(i)
		return Engine.Localize(columns[i])
	end
	
	for i = 1, #offsets do
		SystemLinkJoinMenu.MakeText(button.textHolder, offsets[i], gettext(i), nil)
	end

	element:addElement(button)
	menu:addElement(element)
end

SystemLinkJoinMenu.AddServerButton = function(menu, controller, index)
	local button = SystemLinkJoinMenu.CreateButton(index or "header", 24)
	button:makeFocusable()
	button.index = index
	button:addEventHandler("button_action", SystemLinkJoinMenu.OnJoinGame)

	local gettext = function(i)
		return Lobby.GetServerData(controller, index, i - 1)
	end
	
	for i = 1, #offsets do
		SystemLinkJoinMenu.MakeText(button.textHolder, offsets[i], gettext(i), luiglobals.Colors.h1.medium_grey)
	end

	menu.list:addElement(button)
	return button
end

SystemLinkJoinMenu.MakeText = function(menu, f5_arg1, text, color)
	local state = CoD.CreateState(f5_arg1, nil, f5_arg1 + 200, nil, CoD.AnchorTypes.Left)
	state.font = CoD.TextSettings.TitleFontSmall.Font
	state.top = -6
	state.height = 14
	state.alignment = LUI.Alignment.Left
	state.glow = LUI.GlowState.None
	state.color = color

	local el = LUI.UIText.new(state)
	el:registerAnimationState("focused", {
		color = luiglobals.Colors.white
	})

	el:registerEventHandler("focused", function(element, event)
		element:animateToState("focused", 0)
	end)

	el:registerEventHandler("unfocused", function(element, event)
		element:animateToState("default", 0)
	end)

	el:setText(text)
	menu:addElement(el)
end

function menu_systemlink_join(f19_arg0, f19_arg1)
	local width = 1145

	local menu = LUI.MenuTemplate.new(f19_arg0, {
		menu_title = "@PLATFORM_SYSTEM_LINK_TITLE",
		menu_width = width,
		menu_top_indent = 20,
		disableDeco = true,
		spacing = 1
	})

	SystemLinkJoinMenu.AddHeaderButton(menu, 80, width)
	SystemLinkJoinMenu.AddLowerCounter(menu, width)
	SystemLinkJoinMenu.UpdateCounterText(menu, nil)
	Lobby.BuildServerList(Engine.GetFirstActiveController())

	menu.list:registerEventHandler(LUI.UIScrollIndicator.UpdateEvent, function(element, event)
		SystemLinkJoinMenu.UpdateCounterText(menu, event)
	end)

	SystemLinkJoinMenu.UpdateGameList(menu)
	menu:registerEventHandler("updateGameList", SystemLinkJoinMenu.UpdateGameList)
	menu:addElement(LUI.UITimer.new(250, "updateGameList"))

	LUI.ButtonHelperText.ClearHelperTextObjects(menu.help, {
		side = "all"
	})

	menu:AddHelp({
		name = "add_button_helper_text",
		button_ref = "button_alt1",
		helper_text = Engine.Localize("@MENU_SB_TOOLTIP_BTN_REFRESH"),
		side = "right",
		clickable = true,
		priority = -1000
	}, function(f21_arg0, f21_arg1)
		SystemLinkJoinMenu.RefreshServers(f21_arg0, f21_arg1, menu)
	end)

	menu:AddHelp({
		name = "add_button_helper_text",
		button_ref = "button_action",
		helper_text = Engine.Localize("@MENU_JOIN_GAME1"),
		side = "left",
		clickable = false,
		priority = -1000
	}, nil, nil, true)

	menu:AddBackButton()

	Lobby.RefreshServerList(Engine.GetFirstActiveController())

	return menu
end

LUI.MenuBuilder.m_types_build["menu_systemlink_join"] = menu_systemlink_join