-- created by Gerkiz for ComfyFactorio
local Server = require 'utils.server'
local Event = require 'utils.event'
local Gui = require 'utils.gui'
local Commands = require 'utils.commands'

local ups_label = 'ups_label'

local function set_location(player)
    local gui = player.gui
    local label = gui.screen[ups_label]
    if not label or not label.valid then
        return
    end
    local res = player.display_resolution
    local uis = player.display_scale
    label.location = { x = res.width - 423 * uis, y = 30 * uis }
end

local function create_label(player)
    local ups = Server.get_ups()
    local sUPS = 'SUPS = ' .. ups

    local label =
        player.gui.screen.add(
            {
                type = 'label',
                name = ups_label,
                caption = sUPS
            }
        )
    local style = label.style
    style.font = 'default-game'
    return label
end

Event.add(
    defines.events.on_player_joined_game,
    function (event)
        local player = game.get_player(event.player_index)

        local label = player.gui.screen[ups_label]

        if not label or not label.valid then
            label = create_label(player)
        end
        set_location(player)
        label.visible = false
    end
)

-- Update the value each second
Event.on_nth_tick(
    60,
    function ()
        local ups = Server.get_ups()
        local caption = 'SUPS = ' .. ups
        local players = game.connected_players
        for i = 1, #players do
            local player = players[i]
            local label = player.gui.screen[ups_label]
            if label and label.valid then
                label.caption = caption
                set_location(player)
            end
        end
    end
)

Commands.new('server-ups', 'Toggle the server UPS display!')
    :require_backend()
    :callback(
        function (player)
            local label = player.gui.screen[ups_label]
            if not label or not label.valid then
                label = create_label(player)
            end

            if label.visible then
                label.visible = false
                player.print('Removed Server-UPS label.')
            else
                label.visible = true
                set_location(player)
                player.print('Added Server-UPS label.')
            end
        end
    )

Gui.screen_to_bypass(ups_label)

Event.add(
    defines.events.on_player_display_resolution_changed,
    function (event)
        local player = game.get_player(event.player_index)
        set_location(player)
    end
)

Event.add(
    defines.events.on_player_display_scale_changed,
    function (event)
        local player = game.get_player(event.player_index)
        set_location(player)
    end
)