Przejdź do zawartości

Moduł:Rekordy sezon

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:Rekordy sezon/opis

local p = {}

-- =========================================================
-- Moduł:Rekordy_sezon
--
-- Jeden moduł dla różnych dyscyplin.
--
-- Wywołanie:
--
-- {{#invoke:Rekordy_sezon|main
--  |sezon=2026/2027
--  |druzyna=Lech Poznań
--  |dyscyplina=piłka nożna
-- }}
--
-- lub:
--
-- {{#invoke:Rekordy_sezon|main
--  |sezon=2026/2027
--  |druzyna=Enea Basket Poznań
--  |dyscyplina=koszykówka
-- }}
-- =========================================================


-- =========================================================
-- FUNKCJE WSPÓLNE
-- =========================================================

local function liczba(value)

    if value == nil or value == "" then
        return 0
    end

    value = tostring(value)

    value = mw.ustring.gsub(
        value,
        "%s+",
        ""
    )

    return tonumber(value) or 0

end


-- =========================================================
-- MINUTY
--
-- Obsługuje:
-- 32
-- 32.0
-- 32:15
-- 32:15.5
--
-- Do porównywania rekordów używamy sekund.
-- =========================================================

local function minutyNaSekundy(value)

    if value == nil or value == "" then
        return 0
    end

    value = tostring(value)

    value = mw.ustring.gsub(
        value,
        "%s+",
        ""
    )

    local minuty, sekundy =
        mw.ustring.match(
            value,
            "^(%d+):(%d+)$"
        )

    if minuty and sekundy then

        return
            tonumber(minuty) * 60 +
            tonumber(sekundy)

    end

    local liczbaMinut =
        tonumber(value)

    if liczbaMinut then
        return liczbaMinut * 60
    end

    return 0

end


-- =========================================================
-- FORMAT MINUT
-- =========================================================

local function formatMinut(sekundy)

    sekundy = tonumber(sekundy) or 0

    local minuty =
        math.floor(
            sekundy / 60
        )

    local sek =
        sekundy % 60

    if sek == 0 then
        return tostring(minuty) .. " min"
    end

    return
        tostring(minuty) ..
        ":" ..
        string.format(
            "%02d",
            sek
        ) ..
        " min"

end


local function escapeSQL(value)

    value = tostring(value or "")

    return mw.ustring.gsub(
        value,
        "'",
        "''"
    )

end


-- =========================================================
-- ROZPOZNANIE MIEJSCA MECZU
-- =========================================================

local function miejsceMeczu(row, druzyna)

    local d1 =
        tostring(row.druzyna1 or "")

    local d2 =
        tostring(row.druzyna2 or "")

    if d1 == druzyna then
        return "dom"
    end

    if d2 == druzyna then
        return "wyjazd"
    end

    return nil

end


-- =========================================================
-- WYNIK MECZU
-- =========================================================

local function wynikMeczu(row)

    local g1 =
        tonumber(row.gole1 or "")

    local g2 =
        tonumber(row.gole2 or "")

    if g1 ~= nil and g2 ~= nil then
        return g1, g2
    end


    local wynik =
        tostring(row.wynik or "")

    local a, b =
        mw.ustring.match(
            wynik,
            "(%d+)%s*:%s*(%d+)"
        )

    if a and b then

        return
            tonumber(a),
            tonumber(b)

    end


    return nil, nil

end


-- =========================================================
-- WYNIK Z PERSPEKTYWY DRUŻYNY
-- =========================================================

local function wynikZPerspektywy(row, druzyna)

    local g1, g2 =
        wynikMeczu(row)

    if g1 == nil or g2 == nil then
        return nil, nil
    end

    local miejsce =
        miejsceMeczu(
            row,
            druzyna
        )

    if miejsce == "dom" then

        return g1, g2

    elseif miejsce == "wyjazd" then

        return g2, g1

    end

    return nil, nil

end


-- =========================================================
-- NAZWA MECZU
-- =========================================================

local function nazwaMeczu(row)

    local d1 =
        tostring(row.druzyna1 or "")

    local d2 =
        tostring(row.druzyna2 or "")

    local strona =
        tostring(row.strona_meczu or "")

    local tekst =
        d1 ..
        " – " ..
        d2


    if strona ~= "" then

        return
            "[[" ..
            strona ..
            "|" ..
            tekst ..
            "]]"

    end

    return tekst

end


-- =========================================================
-- DODAWANIE REKORDU
--
-- KLUCZOWA POPRAWKA:
--
-- zapisujemy wartość rekordu bezpośrednio w item.wartosc.
--
-- Dzięki temu nie ma już:
-- attempt to compare nil with number
-- =========================================================

local function dodajRekord(
    tabela,
    miejsce,
    wartosc,
    item
)

    if wartosc == nil then
        return
    end

    wartosc =
        tonumber(wartosc)

    if wartosc == nil then
        return
    end

    item.wartosc =
        wartosc

    local lista =
        tabela[miejsce]

    if #lista == 0 then

        table.insert(
            lista,
            item
        )

        return

    end


    local obecna =
        tonumber(
            lista[1].wartosc
        ) or 0


    if wartosc > obecna then

        tabela[miejsce] = {
            item
        }

    elseif wartosc == obecna then

        table.insert(
            lista,
            item
        )

    end

end


-- =========================================================
-- FORMAT REKORDÓW MECZOWYCH
-- =========================================================

local function tekstMeczow(lista)

    if not lista or #lista == 0 then
        return "—"
    end

    local wynik = {}

    for _, item in ipairs(lista) do

        local roznica =
            tonumber(
                item.roznica or 0
            ) or 0

        local roznicaTekst

        if roznica >= 0 then

            roznicaTekst =
                "+" ..
                tostring(roznica)

        else

            roznicaTekst =
                tostring(roznica)

        end


        table.insert(
            wynik,

            item.tekst ..
            " (" ..
            item.wynik ..
            ", " ..
            roznicaTekst ..
            ")"

        )

    end


    return table.concat(
        wynik,
        "<br>"
    )

end


-- =========================================================
-- FORMAT REKORDÓW ZAWODNIKÓW
-- =========================================================

local function tekstZawodnikow(
    lista,
    typ
)

    if not lista or #lista == 0 then
        return "—"
    end

    local wynik = {}


    for _, item in ipairs(lista) do

        local zawodnik =
            tostring(
                item.zawodnik or ""
            )

        local zawodnikLink =
            "[[" ..
            zawodnik ..
            "]]"


        local wartosc = ""


        if typ == "punkty" then

            wartosc =
                tostring(
                    item.punkty or 0
                ) ..
                " pkt"


        elseif typ == "minuty" then

            if item.minuty_format
                and item.minuty_format ~= "" then

                wartosc =
                    tostring(
                        item.minuty_format
                    )

            else

                wartosc =
                    formatMinut(
                        item.minuty_sekundy or 0
                    )

            end

            wartosc =
                wartosc ..
                " min"

        elseif typ == "asysty" then

            wartosc =
                tostring(
                    item.asysty or 0
                ) ..
                " as."


        elseif typ == "zbiorki" then

            wartosc =
                tostring(
                    item.zbiorki or 0
                ) ..
                " zb."


        elseif typ == "eval" then

            wartosc =
                tostring(
                    item.eval or 0
                ) ..
                " EVAL"


        elseif typ == "plusminus" then

            local pm =
                tonumber(
                    item.plusminus or 0
                ) or 0

            if pm >= 0 then

                wartosc =
                    "+" ..
                    tostring(pm)

            else

                wartosc =
                    tostring(pm)

            end

            wartosc =
                wartosc ..
                " +/-"

        end


        table.insert(
            wynik,

            zawodnikLink ..
            " — " ..
            wartosc ..
            "<br>" ..
            tostring(
                item.tekst or ""
            ) ..
            " ("