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

if (not SystemLinkJoinMenu) then
    return
end

local columns = {{
    offset = 40,
    text = "@MENU_HOST_NAME",
    dataindex = 0
}, {
    offset = 500,
    text = "@MENU_MAP",
    dataindex = 1
}, {
    offset = 725,
    text = "@MENU_TYPE1",
    dataindex = 3
}, {
    offset = 920,
    text = "@MENU_NUMPLAYERS",
    dataindex = 2
}, {
    offset = 1070,
    text = "@MENU_PING",
    dataindex = 4
}, {
    offset = 10,
    image = "s1_icon_locked",
    customelement = function(value, offset)
        return LUI.UIImage.new({
            leftAnchor = true,
            topAnchor = true,
            height = 20,
            width = 20,
            left = offset,
            top = 2,
            material = RegisterMaterial(CoD.Material.RestrictedIcon),
            alpha = value == "1" and 1 or 0,
            color = {
                r = 1,
                b = 1,
                g = 1
            }
        })
    end,
    dataindex = 5
}}

function textlength(text, font, height)
    local _, _, width = luiglobals.GetTextDimensions(text, font, height)
    return width
end

function trimtext(text, font, height, maxwidth)
    if (maxwidth < 0) then
        return text
    end

    while (textlength(text, font, height) > maxwidth) do
        text = text:sub(1, #text - 1)
    end

    return text
end

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))

    button.m_eventHandlers = {}

    for i = 1, #columns do
        if (columns[i].text) then
            SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, Engine.Localize(columns[i].text), nil)
        elseif (columns[i].image) then
            local image = LUI.UIImage.new({
                leftAnchor = true,
                topAnchor = true,
                height = 20,
                width = 20,
                top = 2,
                left = columns[i].offset,
                material = RegisterMaterial(columns[i].image)
            })
            button.textHolder:addElement(image)
        end
    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)
        local text = Lobby.GetServerData(controller, index, columns[i].dataindex)
        if (columns[i].customelement) then
            text = columns[i].customelement(text)
        end

        local islast = not columns[i + 1]
        local end_ = islast and 1130 or columns[i + 1].offset
        local maxlength = end_ - columns[i].offset

        if (maxlength < 0) then
            maxlength = columns[i].offset - end_
        end

        if (not islast) then
            maxlength = maxlength - 50
        end

        return trimtext(text, CoD.TextSettings.TitleFontSmall.Font, 14, maxlength)
    end

    for i = 1, #columns do
        if (columns[i].customelement) then
            local value = Lobby.GetServerData(controller, index, columns[i].dataindex)
            local element = columns[i].customelement(value, columns[i].offset)
            button.textHolder:addElement(element)
        else
            SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, gettext(i),
                luiglobals.Colors.h1.medium_grey)
        end
    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 = nil
    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)

    return 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())

    local playercount = LUI.UIText.new({
        rightAnchor = true,
        topAnchor = true,
        height = 18,
        bottom = 58,
        font = CoD.TextSettings.BodyFont.Font,
        width = 300,
        alignment = LUI.Alignment.Right
    })
    menu:addElement(playercount)

    local servercount = LUI.UIText.new({
        rightAnchor = true,
        topAnchor = true,
        height = 18,
        bottom = 58 - 25,
        font = CoD.TextSettings.BodyFont.Font,
        width = 300,
        alignment = LUI.Alignment.Right
    })
    menu:addElement(servercount)

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

        playercount:setText(Engine.Localize("@SERVERLIST_PLAYER_COUNT", serverlist:getplayercount()))
        servercount:setText(Engine.Localize("@SERVERLIST_SERVER_COUNT", serverlist:getservercount()))
    end)

    SystemLinkJoinMenu.UpdateGameList(menu)
    menu:registerEventHandler("updateGameList", SystemLinkJoinMenu.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