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 ""
            ) ..
            " (" ..
            tostring(
                item.wynik or ""
            ) ..
            ")"

        )

    end


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

end


-- =========================================================
-- KOSZYKÓWKA
-- =========================================================

local function koszykowka(
    frame,
    sezon,
    druzyna
)

    local sezonSQL =
        escapeSQL(sezon)

    local druzynaSQL =
        escapeSQL(druzyna)


    -- =====================================================
    -- MECZE
    -- =====================================================

    local fieldsMecze =
        table.concat({

            "Mecze.id=mecz",
            "Mecze.data=data",
            "Mecze.sezon=sezon",
            "Mecze.rozgrywki=rozgrywki",
            "Mecze.druzyna1=druzyna1",
            "Mecze.druzyna2=druzyna2",
            "Mecze.gole1=gole1",
            "Mecze.gole2=gole2",
            "Mecze.wynik=wynik",
            "Mecze.strona_meczu=strona_meczu"

        }, ",")


    local mecze =
        mw.ext.cargo.query(

            "Mecze",

            fieldsMecze,

            {
                where =
                    "(" ..
                    "Mecze.druzyna1='" ..
                    druzynaSQL ..
                    "'" ..
                    " OR " ..
                    "Mecze.druzyna2='" ..
                    druzynaSQL ..
                    "'" ..
                    ")" ..
                    " AND Mecze.sezon='" ..
                    sezonSQL ..
                    "'",

                orderBy =
                    "Mecze.data ASC",

                limit = 5000
            }

        )


    if not mecze or #mecze == 0 then

        return
            "''Brak wprowadzonych meczów dla tej drużyny w podanym sezonie.''"

    end


    -- =====================================================
    -- REKORDY MECZOWE
    -- =====================================================

    local najwyzszeZwyciestwo = {
        dom = {},
        wyjazd = {}
    }

    local najwyzszaPorazka = {
        dom = {},
        wyjazd = {}
    }


    -- =====================================================
    -- PRZETWARZANIE MECZÓW
    -- =====================================================

    for _, row in ipairs(mecze) do

        local miejsce =
            miejsceMeczu(
                row,
                druzyna
            )

        local zdobyte,
            stracone =
                wynikZPerspektywy(
                    row,
                    druzyna
                )


        if miejsce
            and zdobyte ~= nil
            and stracone ~= nil then


            local roznica =
                zdobyte - stracone


            local item = {

                mecz =
                    row.mecz or "",

                data =
                    row.data or "",

                miejsce =
                    miejsce,

                zdobyte =
                    zdobyte,

                stracone =
                    stracone,

                roznica =
                    roznica,

                tekst =
                    nazwaMeczu(row),

                wynik =
                    tostring(
                        zdobyte
                    ) ..
                    ":" ..
                    tostring(
                        stracone
                    )

            }


            if roznica > 0 then

                dodajRekord(
                    najwyzszeZwyciestwo,
                    miejsce,
                    roznica,
                    item
                )

            end


            if roznica < 0 then

                item.przegrana =
                    math.abs(
                        roznica
                    )


                dodajRekord(
                    najwyzszaPorazka,
                    miejsce,
                    item.przegrana,
                    item
                )

            end

        end

    end


    -- =====================================================
    -- STATYSTYKI ZAWODNIKÓW
    -- =====================================================

    local fieldsZawodnicy =
        table.concat({

            "UdzialZawodnika.zawodnik=zawodnik",
            "UdzialZawodnika.druzyna=druzyna_zawodnika",
            "UdzialZawodnika.gol=gol",
            "UdzialZawodnika.minuty=minuty",
            "UdzialZawodnika.minuty_format=minuty_format",
            "UdzialZawodnika.asysta=asysta",
            "UdzialZawodnika.zbiorka=zbiorka",
            "UdzialZawodnika.eval=eval",
            "UdzialZawodnika.plusminus=plusminus",

            "Mecze.id=mecz",
            "Mecze.data=data",
            "Mecze.druzyna1=druzyna1",
            "Mecze.druzyna2=druzyna2",
            "Mecze.gole1=gole1",
            "Mecze.gole2=gole2",
            "Mecze.wynik=wynik",
            "Mecze.strona_meczu=strona_meczu"

        }, ",")


    local zawodnicy =
        mw.ext.cargo.query(

            "UdzialZawodnika,Mecze",

            fieldsZawodnicy,

            {
                join =
                    "UdzialZawodnika.mecz=Mecze.id",

                where =
                    "UdzialZawodnika.druzyna='" ..
                    druzynaSQL ..
                    "'" ..
                    " AND Mecze.sezon='" ..
                    sezonSQL ..
                    "'" ..
                    " AND UdzialZawodnika.minuty > 0",

                orderBy =
                    "Mecze.data ASC",

                limit = 10000
            }

        )


    -- =====================================================
    -- STRUKTURA REKORDÓW
    -- =====================================================

    local rekordy = {

        punkty = {
            dom = {},
            wyjazd = {}
        },

        minuty = {
            dom = {},
            wyjazd = {}
        },

        asysty = {
            dom = {},
            wyjazd = {}
        },

        zbiorki = {
            dom = {},
            wyjazd = {}
        },

        eval = {
            dom = {},
            wyjazd = {}
        },

        plusminus = {
            dom = {},
            wyjazd = {}
        }

    }


    -- =====================================================
    -- PRZETWARZANIE ZAWODNIKÓW
    -- =====================================================

    if zawodnicy then

        for _, row in ipairs(zawodnicy) do

            local miejsce =
                miejsceMeczu(
                    row,
                    druzyna
                )


            if miejsce then

                -- -----------------------------------------
                -- MINUTY
                -- -----------------------------------------

                local minutySekundy =
                    minutyNaSekundy(
                        row.minuty_format
                    )

                if minutySekundy == 0 then

                    minutySekundy =
                        minutyNaSekundy(
                            row.minuty
                        )

                end


                -- -----------------------------------------
                -- POZOSTAŁE STATYSTYKI
                -- -----------------------------------------

                local punkty =
                    liczba(row.gol)

                local asysty =
                    liczba(row.asysta)

                local zbiorki =
                    liczba(row.zbiorka)

                local eval =
                    liczba(row.eval)

                local plusminus =
                    liczba(row.plusminus)


                local item = {

                    zawodnik =
                        row.zawodnik or "",

                    mecz =
                        row.mecz or "",

                    data =
                        row.data or "",

                    miejsce =
                        miejsce,

                    tekst =
                        nazwaMeczu(row),

                    wynik =
                        row.wynik or "",

                    minuty_format =
                        row.minuty_format or "",

                    minuty_sekundy =
                        minutySekundy,

                    punkty =
                        punkty,

                    minuty =
                        minutySekundy,

                    asysty =
                        asysty,

                    zbiorki =
                        zbiorki,

                    eval =
                        eval,

                    plusminus =
                        plusminus

                }


                -- -----------------------------------------
                -- NAJWIĘCEJ PUNKTÓW
                -- -----------------------------------------

                dodajRekord(
                    rekordy.punkty,
                    miejsce,
                    punkty,
                    item
                )


                -- -----------------------------------------
                -- NAJWIĘCEJ MINUT
                -- -----------------------------------------

                dodajRekord(
                    rekordy.minuty,
                    miejsce,
                    minutySekundy,
                    item
                )


                -- -----------------------------------------
                -- NAJWIĘCEJ ASYST
                -- -----------------------------------------

                dodajRekord(
                    rekordy.asysty,
                    miejsce,
                    asysty,
                    item
                )


                -- -----------------------------------------
                -- NAJWIĘCEJ ZBIÓREK
                -- -----------------------------------------

                dodajRekord(
                    rekordy.zbiorki,
                    miejsce,
                    zbiorki,
                    item
                )


                -- -----------------------------------------
                -- NAJWYŻSZY EVAL
                -- -----------------------------------------

                dodajRekord(
                    rekordy.eval,
                    miejsce,
                    eval,
                    item
                )


                -- -----------------------------------------
                -- NAJWYŻSZY +/-
                -- -----------------------------------------

                dodajRekord(
                    rekordy.plusminus,
                    miejsce,
                    plusminus,
                    item
                )

            end

        end

    end


    -- =====================================================
    -- SERIE
    -- =====================================================

    local serie = {

        wszystkie = {
            wygrane = 0,
            przegrane = 0
        },

        dom = {
            wygrane = 0,
            przegrane = 0
        },

        wyjazd = {
            wygrane = 0,
            przegrane = 0
        }

    }


    local aktualna = {

        wszystkie = {
            W = 0,
            P = 0
        },

        dom = {
            W = 0,
            P = 0
        },

        wyjazd = {
            W = 0,
            P = 0
        }

    }


    for _, row in ipairs(mecze) do

        local miejsce =
            miejsceMeczu(
                row,
                druzyna
            )

        local zdobyte,
            stracone =
                wynikZPerspektywy(
                    row,
                    druzyna
                )


        if miejsce
            and zdobyte ~= nil
            and stracone ~= nil then


            local wynik


            if zdobyte > stracone then

                wynik = "W"

            elseif zdobyte < stracone then

                wynik = "P"

            else

                wynik = "R"

            end


            -- OGÓŁEM

            if wynik == "W" then

                aktualna.wszystkie.W =
                    aktualna.wszystkie.W + 1

                aktualna.wszystkie.P = 0

                serie.wszystkie.wygrane =
                    math.max(
                        serie.wszystkie.wygrane,
                        aktualna.wszystkie.W
                    )

            elseif wynik == "P" then

                aktualna.wszystkie.P =
                    aktualna.wszystkie.P + 1

                aktualna.wszystkie.W = 0

                serie.wszystkie.przegrane =
                    math.max(
                        serie.wszystkie.przegrane,
                        aktualna.wszystkie.P
                    )

            else

                aktualna.wszystkie.W = 0
                aktualna.wszystkie.P = 0

            end


            -- DOM

            if miejsce == "dom" then

                if wynik == "W" then

                    aktualna.dom.W =
                        aktualna.dom.W + 1

                    aktualna.dom.P = 0

                    serie.dom.wygrane =
                        math.max(
                            serie.dom.wygrane,
                            aktualna.dom.W
                        )

                elseif wynik == "P" then

                    aktualna.dom.P =
                        aktualna.dom.P + 1

                    aktualna.dom.W = 0

                    serie.dom.przegrane =
                        math.max(
                            serie.dom.przegrane,
                            aktualna.dom.P
                        )

                else

                    aktualna.dom.W = 0
                    aktualna.dom.P = 0

                end

            end


            -- WYJAZD

            if miejsce == "wyjazd" then

                if wynik == "W" then

                    aktualna.wyjazd.W =
                        aktualna.wyjazd.W + 1

                    aktualna.wyjazd.P = 0

                    serie.wyjazd.wygrane =
                        math.max(
                            serie.wyjazd.wygrane,
                            aktualna.wyjazd.W
                        )

                elseif wynik == "P" then

                    aktualna.wyjazd.P =
                        aktualna.wyjazd.P + 1

                    aktualna.wyjazd.W = 0

                    serie.wyjazd.przegrane =
                        math.max(
                            serie.wyjazd.przegrane,
                            aktualna.wyjazd.P
                        )

                else

                    aktualna.wyjazd.W = 0
                    aktualna.wyjazd.P = 0

                end

            end

        end

    end


    -- =====================================================
    -- WYNIK
    -- =====================================================

    local wynik = {}


    table.insert(
        wynik,
        "=== Rekordy sezonu ==="
    )

    table.insert(
        wynik,
        ""
    )


    -- =====================================================
    -- REKORDY MECZOWE
    -- =====================================================

    table.insert(
        wynik,
        "==== Rekordy meczowe ===="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable" style="width:100%; text-align:center;"'
    )

    table.insert(
        wynik,
        "! Rekord !! 🏠 Dom !! ✈️ Wyjazd"
    )


    table.insert(wynik, "|-")

    table.insert(
        wynik,
        "! 🏆 Najwyższe zwycięstwo"
    )

    table.insert(
        wynik,
        "| " ..
        tekstMeczow(
            najwyzszeZwyciestwo.dom
        )
    )

    table.insert(
        wynik,
        "| " ..
        tekstMeczow(
            najwyzszeZwyciestwo.wyjazd
        )
    )


    table.insert(wynik, "|-")

    table.insert(
        wynik,
        "! ❌ Najwyższa porażka"
    )

    table.insert(
        wynik,
        "| " ..
        tekstMeczow(
            najwyzszaPorazka.dom
        )
    )

    table.insert(
        wynik,
        "| " ..
        tekstMeczow(
            najwyzszaPorazka.wyjazd
        )
    )


    table.insert(
        wynik,
        "|}"
    )


    -- =====================================================
    -- REKORDY INDYWIDUALNE
    -- =====================================================

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        "==== Rekordy indywidualne ===="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable" style="width:100%; text-align:center;"'
    )

    table.insert(
        wynik,
        "! Rekord !! 🏠 Dom !! ✈️ Wyjazd"
    )


    local rekordyLista = {

        {
            nazwa = "🏀 Najwięcej punktów",
            tabela = rekordy.punkty,
            typ = "punkty"
        },

        {
            nazwa = "⏱️ Najwięcej minut",
            tabela = rekordy.minuty,
            typ = "minuty"
        },

        {
            nazwa = "🎯 Najwięcej asyst",
            tabela = rekordy.asysty,
            typ = "asysty"
        },

        {
            nazwa = "🏀 Najwięcej zbiórek",
            tabela = rekordy.zbiorki,
            typ = "zbiorki"
        },

        {
            nazwa = "⭐ Najwyższy EVAL",
            tabela = rekordy.eval,
            typ = "eval"
        },

        {
            nazwa = "➕ Najwyższy +/-",
            tabela = rekordy.plusminus,
            typ = "plusminus"
        }

    }


    for _, rekord in ipairs(rekordyLista) do

        table.insert(
            wynik,
            "|-"
        )

        table.insert(
            wynik,
            "! " ..
            rekord.nazwa
        )

        table.insert(
            wynik,
            "| " ..
            tekstZawodnikow(
                rekord.tabela.dom,
                rekord.typ
            )
        )

        table.insert(
            wynik,
            "| " ..
            tekstZawodnikow(
                rekord.tabela.wyjazd,
                rekord.typ
            )
        )

    end


    table.insert(
        wynik,
        "|}"
    )


    -- =====================================================
    -- SERIE
    -- =====================================================

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        "==== Serie ===="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable" style="width:100%; text-align:center;"'
    )

    table.insert(
        wynik,
        "! Seria !! Wszystkie mecze !! 🏠 Dom !! ✈️ Wyjazd"
    )


    table.insert(
        wynik,
        "|-"
    )

    table.insert(
        wynik,
        "! 🔥 Najdłuższa seria zwycięstw"
    )

    table.insert(
        wynik,
        "| " ..
        tostring(
            serie.wszystkie.wygrane
        )
    )

    table.insert(
        wynik,
        "| " ..
        tostring(
            serie.dom.wygrane
        )
    )

    table.insert(
        wynik,
        "| " ..
        tostring(
            serie.wyjazd.wygrane
        )
    )


    table.insert(
        wynik,
        "|-"
    )

    table.insert(
        wynik,
        "! 📉 Najdłuższa seria porażek"
    )

    table.insert(
        wynik,
        "| " ..
        tostring(
            serie.wszystkie.przegrane
        )
    )

    table.insert(
        wynik,
        "| " ..
        tostring(
            serie.dom.przegrane
        )
    )

    table.insert(
        wynik,
        "| " ..
        tostring(
            serie.wyjazd.przegrane
        )
    )


    table.insert(
        wynik,
        "|}"
    )


    return table.concat(
        wynik,
        "\n"
    )

end


-- =========================================================
-- PIŁKA NOŻNA
-- =========================================================

local function pilkaNozna(
    frame,
    sezon,
    druzyna
)

    local sezonSQL =
        escapeSQL(sezon)

    local druzynaSQL =
        escapeSQL(druzyna)


    -- =====================================================
    -- MECZE
    -- =====================================================

    local fieldsMecze =
        table.concat({

            "Mecze.id=mecz",
            "Mecze.data=data",
            "Mecze.sezon=sezon",
            "Mecze.rozgrywki=rozgrywki",
            "Mecze.etap=etap",
            "Mecze.kolejka=kolejka",
            "Mecze.druzyna1=druzyna1",
            "Mecze.druzyna2=druzyna2",
            "Mecze.gole1=gole1",
            "Mecze.gole2=gole2",
            "Mecze.wynik=wynik",
            "Mecze.strona_meczu=strona_meczu"

        }, ",")


    local mecze =
        mw.ext.cargo.query(

            "Mecze",

            fieldsMecze,

            {
                where =
                    "(" ..
                    "Mecze.druzyna1='" ..
                    druzynaSQL ..
                    "'" ..
                    " OR " ..
                    "Mecze.druzyna2='" ..
                    druzynaSQL ..
                    "'" ..
                    ")" ..
                    " AND Mecze.sezon='" ..
                    sezonSQL ..
                    "'",

                orderBy =
                    "Mecze.data ASC",

                limit = 5000
            }

        )


    if not mecze or #mecze == 0 then

        return
            "''Brak wprowadzonych meczów dla tej drużyny w podanym sezonie.''"

    end


    -- =====================================================
    -- STRUKTURA REKORDÓW
    -- =====================================================

    local najwyzszeZwyciestwo = {
        dom = {},
        wyjazd = {}
    }

    local najwyzszaPorazka = {
        dom = {},
        wyjazd = {}
    }


    local najczestszeWyniki = {}

    local wynikiRozgrywek = {}


    local serieBezPorazki = {
        wszystkie = 0,
        dom = 0,
        wyjazd = 0
    }


    local aktualnaBezPorazki = {
        wszystkie = 0,
        dom = 0,
        wyjazd = 0
    }


    local serie = {

        wszystkie = {
            wygrane = 0,
            remisy = 0,
            bezWygranej = 0,
            porazki = 0
        },

        dom = {
            wygrane = 0,
            remisy = 0,
            bezWygranej = 0,
            porazki = 0
        },

        wyjazd = {
            wygrane = 0,
            remisy = 0,
            bezWygranej = 0,
            porazki = 0
        }

    }


    -- =====================================================
    -- PRZETWARZANIE MECZÓW
    -- =====================================================

    for _, row in ipairs(mecze) do

        local miejsce =
            miejsceMeczu(
                row,
                druzyna
            )

        local zdobyte,
            stracone =
                wynikZPerspektywy(
                    row,
                    druzyna
                )


        if miejsce
            and zdobyte ~= nil
            and stracone ~= nil then


            local roznica =
                zdobyte - stracone


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

            local wynikPerspektywa =
                tostring(
                    zdobyte
                ) ..
                ":" ..
                tostring(
                    stracone
                )


            -- =================================================
            -- NAJCZĘSTSZE WYNIKI
            -- =================================================

            najczestszeWyniki[
                wynikPerspektywa
            ] =
                (
                    najczestszeWyniki[
                        wynikPerspektywa
                    ] or 0
                ) + 1


            -- =================================================
            -- ROZGRYWKI
            -- =================================================

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

            if rozgrywki == "" then
                rozgrywki = "Pozostałe"
            end


            if not wynikiRozgrywek[rozgrywki] then

                wynikiRozgrywek[rozgrywki] = {

                    wszystkie = {
                        mecze = 0,
                        wygrane = 0,
                        remisy = 0,
                        porazki = 0,
                        bezWygranej = 0
                    },

                    dom = {
                        mecze = 0,
                        wygrane = 0,
                        remisy = 0,
                        porazki = 0,
                        bezWygranej = 0
                    },

                    wyjazd = {
                        mecze = 0,
                        wygrane = 0,
                        remisy = 0,
                        porazki = 0,
                        bezWygranej = 0
                    }

                }

            end


            local dane =
                wynikiRozgrywek[rozgrywki]


            dane.wszystkie.mecze =
                dane.wszystkie.mecze + 1

            dane[miejsce].mecze =
                dane[miejsce].mecze + 1


            -- =================================================
            -- REZULTAT
            -- =================================================

            local rezultat


            if zdobyte > stracone then

                rezultat = "W"

            elseif zdobyte < stracone then

                rezultat = "P"

            else

                rezultat = "R"

            end


            if rezultat == "W" then

                dane.wszystkie.wygrane =
                    dane.wszystkie.wygrane + 1

                dane[miejsce].wygrane =
                    dane[miejsce].wygrane + 1


            elseif rezultat == "R" then

                dane.wszystkie.remisy =
                    dane.wszystkie.remisy + 1

                dane[miejsce].remisy =
                    dane[miejsce].remisy + 1


            else

                dane.wszystkie.porazki =
                    dane.wszystkie.porazki + 1

                dane[miejsce].porazki =
                    dane[miejsce].porazki + 1

            end


            if rezultat ~= "W" then

                dane.wszystkie.bezWygranej =
                    dane.wszystkie.bezWygranej + 1

                dane[miejsce].bezWygranej =
                    dane[miejsce].bezWygranej + 1

            end


            -- =================================================
            -- NAJWYŻSZE ZWYCIĘSTWO
            -- =================================================

            if rezultat == "W" then

                local item = {

                    mecz =
                        row.mecz or "",

                    data =
                        row.data or "",

                    miejsce =
                        miejsce,

                    zdobyte =
                        zdobyte,

                    stracone =
                        stracone,

                    roznica =
                        roznica,

                    wartosc =
                        roznica,

                    tekst =
                        nazwaMeczu(row),

                    wynik =
                        wynikPerspektywa

                }


                dodajRekord(
                    najwyzszeZwyciestwo,
                    miejsce,
                    roznica,
                    item
                )

            end


            -- =================================================
            -- NAJWYŻSZA PORAŻKA
            -- =================================================

            if rezultat == "P" then

                local przegrana =
                    math.abs(
                        roznica
                    )


                local item = {

                    mecz =
                        row.mecz or "",

                    data =
                        row.data or "",

                    miejsce =
                        miejsce,

                    zdobyte =
                        zdobyte,

                    stracone =
                        stracone,

                    roznica =
                        roznica,

                    wartosc =
                        przegrana,

                    przegrana =
                        przegrana,

                    tekst =
                        nazwaMeczu(row),

                    wynik =
                        wynikPerspektywa

                }


                dodajRekord(
                    najwyzszaPorazka,
                    miejsce,
                    przegrana,
                    item
                )

            end


            -- =================================================
            -- SERIA BEZ PORAŻKI
            -- =================================================

            if rezultat == "W"
                or rezultat == "R" then

                aktualnaBezPorazki.wszystkie =
                    aktualnaBezPorazki.wszystkie + 1

                serieBezPorazki.wszystkie =
                    math.max(
                        serieBezPorazki.wszystkie,
                        aktualnaBezPorazki.wszystkie
                    )


                aktualnaBezPorazki[miejsce] =
                    aktualnaBezPorazki[miejsce] + 1

                serieBezPorazki[miejsce] =
                    math.max(
                        serieBezPorazki[miejsce],
                        aktualnaBezPorazki[miejsce]
                    )

            else

                aktualnaBezPorazki.wszystkie = 0
                aktualnaBezPorazki[miejsce] = 0

            end


            -- =================================================
            -- SERIE
            -- =================================================

            local obszary = {
                "wszystkie",
                miejsce
            }


            for _, obszar in ipairs(obszary) do

                if rezultat == "W" then

                    serie[obszar].wygrane =
                        serie[obszar].wygrane + 1

                    serie[obszar].remisy = 0
                    serie[obszar].porazki = 0
                    serie[obszar].bezWygranej = 0


                elseif rezultat == "R" then

                    serie[obszar].remisy =
                        serie[obszar].remisy + 1

                    serie[obszar].wygrane = 0
                    serie[obszar].porazki = 0

                    serie[obszar].bezWygranej =
                        serie[obszar].bezWygranej + 1


                else

                    serie[obszar].porazki =
                        serie[obszar].porazki + 1

                    serie[obszar].wygrane = 0
                    serie[obszar].remisy = 0

                    serie[obszar].bezWygranej =
                        serie[obszar].bezWygranej + 1

                end

            end

        end

    end


    -- =====================================================
    -- NAJCZĘSTSZY WYNIK
    -- =====================================================

    local listaWynikow = {}


    for wynik, licznik in pairs(
        najczestszeWyniki
    ) do

        table.insert(
            listaWynikow,
            {
                wynik = wynik,
                liczba = licznik
            }
        )

    end


    table.sort(
        listaWynikow,
        function(a, b)

            if a.liczba ~= b.liczba then

                return
                    a.liczba >
                    b.liczba

            end

            return
                a.wynik <
                b.wynik

        end
    )


    -- =====================================================
    -- GENEROWANIE WYNIKU
    -- =====================================================

    local wynik = {}


    table.insert(
        wynik,
        "=== Rekordy sezonu ==="
    )

    table.insert(
        wynik,
        ""
    )


    -- =====================================================
    -- REKORDY MECZOWE
    -- =====================================================

    table.insert(
        wynik,
        "==== Rekordy meczowe ===="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable" style="width:100%; text-align:center;"'
    )

    table.insert(
        wynik,
        "! Rekord !! 🏠 Dom !! ✈️ Wyjazd"
    )


    table.insert(
        wynik,
        "|-"
    )

    table.insert(
        wynik,
        "! 🏆 Najwyższe zwycięstwo"
    )

    table.insert(
        wynik,
        "| " ..
        tekstMeczow(
            najwyzszeZwyciestwo.dom
        )
    )

    table.insert(
        wynik,
        "| " ..
        tekstMeczow(
            najwyzszeZwyciestwo.wyjazd
        )
    )


    table.insert(
        wynik,
        "|-"
    )

    table.insert(
        wynik,
        "! ❌ Najwyższa porażka"
    )

    table.insert(
        wynik,
        "| " ..
        tekstMeczow(
            najwyzszaPorazka.dom
        )
    )

    table.insert(
        wynik,
        "| " ..
        tekstMeczow(
            najwyzszaPorazka.wyjazd
        )
    )


    table.insert(
        wynik,
        "|}"
    )


    -- =====================================================
    -- SERIE
    -- =====================================================

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        "==== Serie ===="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable" style="width:100%; text-align:center;"'
    )

    table.insert(
        wynik,
        "! Rekord !! Wszystkie mecze !! 🏠 Dom !! ✈️ Wyjazd"
    )


    table.insert(
        wynik,
        "|-"
    )

    table.insert(
        wynik,
        "! 🔥 Najdłuższa seria bez porażki"
    )

    table.insert(
        wynik,
        "| " ..
        tostring(
            serieBezPorazki.wszystkie
        )
    )

    table.insert(
        wynik,
        "| " ..
        tostring(
            serieBezPorazki.dom
        )
    )

    table.insert(
        wynik,
        "| " ..
        tostring(
            serieBezPorazki.wyjazd
        )
    )


    table.insert(
        wynik,
        "|}"
    )


    -- =====================================================
    -- NAJCZĘSTSZE WYNIKI
    -- =====================================================

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        "==== Najczęstsze wyniki ===="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable" style="text-align:center;"'
    )

    table.insert(
        wynik,
        "! Wynik !! Liczba"
    )


    for _, item in ipairs(
        listaWynikow
    ) do

        table.insert(
            wynik,
            "|-"
        )

        table.insert(
            wynik,
            "| '''" ..
            item.wynik ..
            "'''"
        )

        table.insert(
            wynik,
            "| " ..
            tostring(
                item.liczba
            )
        )

    end


    table.insert(
        wynik,
        "|}"
    )


    -- =====================================================
    -- WYNIKI WEDŁUG ROZGRYWEK
    -- =====================================================

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        "==== Wyniki według rozgrywek ===="
    )

    table.insert(
        wynik,
        ""
    )

    table.insert(
        wynik,
        '{| class="wikitable" style="width:100%; text-align:center;"'
    )

    table.insert(
        wynik,
        "! Rozgrywki !! Mecze !! 🏆 Wygrane !! 🤝 Remisy !! ❌ Porażki !! ⚪ Bez wygranej"
    )


    local listaRozgrywek = {}


    for nazwa, dane in pairs(
        wynikiRozgrywek
    ) do

        table.insert(
            listaRozgrywek,
            {
                nazwa = nazwa,
                dane = dane
            }
        )

    end


    table.sort(
        listaRozgrywek,
        function(a, b)

            return
                a.nazwa <
                b.nazwa

        end
    )


    for _, pozycja in ipairs(
        listaRozgrywek
    ) do

        local dane =
            pozycja.dane.wszystkie


        table.insert(
            wynik,
            "|-"
        )

        table.insert(
            wynik,
            "! " ..
            pozycja.nazwa
        )

        table.insert(
            wynik,
            "| " ..
            tostring(dane.mecze)
        )

        table.insert(
            wynik,
            "| " ..
            tostring(dane.wygrane)
        )

        table.insert(
            wynik,
            "| " ..
            tostring(dane.remisy)
        )

        table.insert(
            wynik,
            "| " ..
            tostring(dane.porazki)
        )

        table.insert(
            wynik,
            "| " ..
            tostring(dane.bezWygranej)
        )

    end


    table.insert(
        wynik,
        "|}"
    )


    return table.concat(
        wynik,
        "\n"
    )

end


-- =========================================================
-- GŁÓWNA FUNKCJA
-- =========================================================

function p.main(frame)

    local sezon =
        tostring(
            frame.args.sezon or ""
        )

    local druzyna =
        tostring(
            frame.args.druzyna or ""
        )

    local dyscyplina =
        mw.ustring.lower(
            tostring(
                frame.args.dyscyplina or ""
            )
        )


    if sezon == "" then

        return
            "'''Błąd:''' nie podano sezonu."

    end


    if druzyna == "" then

        return
            "'''Błąd:''' nie podano drużyny."

    end


    -- =====================================================
    -- PIŁKA NOŻNA
    -- =====================================================

    if dyscyplina == "piłka nożna"
        or dyscyplina == "pilka nozna"
        or dyscyplina == "piłka nozna"
        or dyscyplina == "football" then

        return
            pilkaNozna(
                frame,
                sezon,
                druzyna
            )

    end


    -- =====================================================
    -- KOSZYKÓWKA
    -- =====================================================

    if dyscyplina == "koszykówka"
        or dyscyplina == "koszykowka"
        or dyscyplina == "basketball" then

        return
            koszykowka(
                frame,
                sezon,
                druzyna
            )

    end


    -- =====================================================
    -- BRAK ROZPOZNANIA
    -- =====================================================

    return
        "'''Błąd:''' nie rozpoznano dyscypliny '''" ..
        dyscyplina ..
        "'''. Dostępne: '''piłka nożna''' lub '''koszykówka'''."

end


return p