Przejdź do zawartości

Moduł:H2H

Z Encyklopedia Poznanskiego Sportu

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

local p = {}

-- =========================================================
-- MODUŁ:H2H
--
-- Historia bezpośrednich spotkań dwóch drużyn.
--
-- team1 = drużyna analizowana
-- team2 = przeciwnik
--
-- nazwa_statystyki1 / nazwa_statystyki2 służą do identyfikacji
-- drużyn niezależnie od historycznych nazw sponsorskich.
--
-- Zawiera:
-- 1. Bilans ogółem / dom / wyjazd
-- 2. Trenerów team1 w rywalizacji
-- 3. Najlepszych strzelców obu drużyn
-- 4. Rekordy indywidualne team1
-- 5. Serie zwycięstw / porażek
-- 6. Analizę kwart
-- 7. Wszystkie mecze
-- 8. Dogrywki 1, 2 i 3
-- =========================================================


function p.main(frame)

    -- =====================================================
    -- PARAMETRY
    -- =====================================================

    local team1 = mw.text.trim(frame.args.team1 or "")
    local team2 = mw.text.trim(frame.args.team2 or "")

    if team1 == "" then
        return "'''Błąd:''' nie podano team1."
    end

    if team2 == "" then
        return "'''Błąd:''' nie podano team2."
    end


    -- =====================================================
    -- BEZPIECZEŃSTWO SQL
    -- =====================================================

    local function sql(value)

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

    end


    local team1SQL = sql(team1)
    local team2SQL = sql(team2)


    -- =====================================================
    -- FUNKCJE POMOCNICZE
    -- =====================================================

    local function liczba(value)

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

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

        return tonumber(tekst) or 0

    end


    local function procent(wygrane, mecze)

        if mecze == 0 then
            return "0,0%"
        end

        local wartosc =
            (wygrane / mecze) * 100

        return string.format(
            "%.1f%%",
            wartosc
        ):gsub("%.", ",")

    end


    -- =====================================================
    -- IDENTYFIKACJA STRONY TEAM1
    -- =====================================================

    local function miejsce(row)

        if row.ns1 == team1 then
            return "dom"
        end

        if row.ns2 == team1 then
            return "wyjazd"
        end

        return nil

    end


    -- =====================================================
    -- WYNIK TEAM1
    -- =====================================================

    local function wynikDruzyny(row)

        local g1 =
            liczba(row.gole1)

        local g2 =
            liczba(row.gole2)


        if row.ns1 == team1 then

            return g1, g2

        elseif row.ns2 == team1 then

            return g2, g1

        end

        return nil, nil

    end


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

    local function nazwaMeczu(row)

        local d1 =
            row.druzyna1 or ""

        local d2 =
            row.druzyna2 or ""

        local strona =
            row.strona_meczu or ""


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


        if strona ~= "" then

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

        end


        return tekst

    end


    -- =====================================================
    -- PARSOWANIE CZĘŚCI WYNIKU
    -- =====================================================

    local function parseWynikCzesciowy(value)

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

        local tekst =
            tostring(value)

        local a, b =
            tekst:match(
                "(%d+)%s*:%s*(%d+)"
            )

        if not a or not b then
            return nil, nil
        end

        return
            tonumber(a),
            tonumber(b)

    end


    -- =====================================================
    -- WARUNEK H2H
    -- =====================================================

    local whereH2H =
        "(" ..
        "(Mecze.nazwa_statystyki1='" ..
        team1SQL ..
        "' AND " ..
        "Mecze.nazwa_statystyki2='" ..
        team2SQL ..
        "')" ..

        " OR " ..

        "(Mecze.nazwa_statystyki1='" ..
        team2SQL ..
        "' AND " ..
        "Mecze.nazwa_statystyki2='" ..
        team1SQL ..
        "')" ..

        ")"


    -- =====================================================
    -- POBRANIE MECZÓW
    --
    -- UWAGA:
    -- pola nazywają się KWARTA1, KWARTA2 itd.
    -- a nie KWART1.
    -- =====================================================

    local fieldsMecze = table.concat({

        "Mecze.id=mecz",

        "Mecze.data=data",
        "Mecze.sezon=sezon",

        "Mecze.druzyna1=druzyna1",
        "Mecze.druzyna2=druzyna2",

        "Mecze.nazwa_statystyki1=ns1",
        "Mecze.nazwa_statystyki2=ns2",

        "Mecze.gole1=gole1",
        "Mecze.gole2=gole2",

        "Mecze.wynik=wynik",
        "Mecze.wynik_do_przerwy=wynik_do_przerwy",

        "Mecze.kwarta1=kwarta1",
        "Mecze.kwarta2=kwarta2",
        "Mecze.kwarta3=kwarta3",
        "Mecze.kwarta4=kwarta4",

        "Mecze.dogrywka1=dogrywka1",
        "Mecze.dogrywka2=dogrywka2",
        "Mecze.dogrywka3=dogrywka3",

        "Mecze.hala=hala",
        "Mecze.widzowie=widzowie",
        "Mecze.sedziowie=sedziowie",
        "Mecze.strona_meczu=strona_meczu"

    }, ",")


    local mecze =
        mw.ext.cargo.query(
            "Mecze",
            fieldsMecze,
            {
                where = whereH2H,

                orderBy =
                    "Mecze.data ASC",

                limit = 5000
            }
        )


    if not mecze or #mecze == 0 then

        return
            "'''Brak meczów pomiędzy ''" ..
            team1 ..
            "'' a ''" ..
            team2 ..
            "''.'''"

    end


    -- =====================================================
    -- BILANS
    -- =====================================================

    local bilans = {

        wszystkie = {
            mecze = 0,
            wygrane = 0,
            przegrane = 0,
            punktyZdobyte = 0,
            punktyStracone = 0
        },

        dom = {
            mecze = 0,
            wygrane = 0,
            przegrane = 0,
            punktyZdobyte = 0,
            punktyStracone = 0
        },

        wyjazd = {
            mecze = 0,
            wygrane = 0,
            przegrane = 0,
            punktyZdobyte = 0,
            punktyStracone = 0
        }

    }


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

    local serie = {

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

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

        wyjazd = {
            W = 0,
            P = 0
        }

    }


    local aktualnaSeria = {

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

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

        wyjazd = {
            W = 0,
            P = 0
        }

    }


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

    local rekordyMeczowe = {

        zwyciestwo = {
            dom = {},
            wyjazd = {}
        },

        porazka = {
            dom = {},
            wyjazd = {}
        }

    }


    local function dodajRekordMeczowy(
        lista,
        wartosc,
        item
    )

        if #lista == 0 then

            item.wartosc =
                wartosc

            table.insert(
                lista,
                item
            )

            return

        end


        local obecna =
            lista[1].wartosc


        if wartosc > obecna then

            lista = {
                item
            }

            item.wartosc =
                wartosc

            return lista


        elseif wartosc == obecna then

            item.wartosc =
                wartosc

            table.insert(
                lista,
                item
            )

        end


        return lista

    end


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

    for _, row in ipairs(mecze) do

        local zdobyte,
            stracone =
            wynikDruzyny(row)

        local miejsceMeczu =
            miejsce(row)


        if zdobyte and
            stracone and
            miejsceMeczu then


            local wynikMeczu


            if zdobyte > stracone then

                wynikMeczu = "W"

            elseif zdobyte < stracone then

                wynikMeczu = "P"

            else

                wynikMeczu = "R"

            end


            -- =============================================
            -- OGÓŁEM
            -- =============================================

            local b =
                bilans.wszystkie


            b.mecze =
                b.mecze + 1

            b.punktyZdobyte =
                b.punktyZdobyte +
                zdobyte

            b.punktyStracone =
                b.punktyStracone +
                stracone


            if wynikMeczu == "W" then

                b.wygrane =
                    b.wygrane + 1

            elseif wynikMeczu == "P" then

                b.przegrane =
                    b.przegrane + 1

            end


            -- =============================================
            -- DOM / WYJAZD
            -- =============================================

            local bd =
                bilans[miejsceMeczu]


            bd.mecze =
                bd.mecze + 1

            bd.punktyZdobyte =
                bd.punktyZdobyte +
                zdobyte

            bd.punktyStracone =
                bd.punktyStracone +
                stracone


            if wynikMeczu == "W" then

                bd.wygrane =
                    bd.wygrane + 1

            elseif wynikMeczu == "P" then

                bd.przegrane =
                    bd.przegrane + 1

            end


            -- =============================================
            -- REKORD MECZOWY
            -- =============================================

            local itemMeczu = {

                tekst =
                    nazwaMeczu(row),

                wynik =
                    tostring(
                        liczba(row.gole1)
                    ) ..
                    ":" ..
                    tostring(
                        liczba(row.gole2)
                    ),

                data =
                    row.data or "",

                miejsce =
                    miejsceMeczu

            }


            local roznica =
                zdobyte - stracone


            if roznica > 0 then

                local lista =
                    rekordyMeczowe
                        .zwyciestwo
                        [miejsceMeczu]

                if #lista == 0 then

                    itemMeczu.wartosc =
                        roznica

                    table.insert(
                        lista,
                        itemMeczu
                    )

                elseif roznica >
                    lista[1].wartosc then

                    itemMeczu.wartosc =
                        roznica

                    rekordyMeczowe
                        .zwyciestwo
                        [miejsceMeczu] = {
                            itemMeczu
                        }

                elseif roznica ==
                    lista[1].wartosc then

                    itemMeczu.wartosc =
                        roznica

                    table.insert(
                        lista,
                        itemMeczu
                    )

                end


            elseif roznica < 0 then

                local wartosc =
                    math.abs(roznica)

                local lista =
                    rekordyMeczowe
                        .porazka
                        [miejsceMeczu]


                if #lista == 0 then

                    itemMeczu.wartosc =
                        wartosc

                    table.insert(
                        lista,
                        itemMeczu
                    )

                elseif wartosc >
                    lista[1].wartosc then

                    itemMeczu.wartosc =
                        wartosc

                    rekordyMeczowe
                        .porazka
                        [miejsceMeczu] = {
                            itemMeczu
                        }

                elseif wartosc ==
                    lista[1].wartosc then

                    itemMeczu.wartosc =
                        wartosc

                    table.insert(
                        lista,
                        itemMeczu
                    )

                end

            end


            -- =============================================
            -- SERIA OGÓŁEM
            -- =============================================

            local so =
                aktualnaSeria.wszystkie


            if wynikMeczu == "W" then

                so.W =
                    so.W + 1

                so.P = 0

                if so.W >
                    serie.wszystkie.W then

                    serie.wszystkie.W =
                        so.W

                end

            elseif wynikMeczu == "P" then

                so.P =
                    so.P + 1

                so.W = 0

                if so.P >
                    serie.wszystkie.P then

                    serie.wszystkie.P =
                        so.P

                end

            end


            -- =============================================
            -- SERIA DOM / WYJAZD
            -- =============================================

            local ss =
                aktualnaSeria[miejsceMeczu]

            local sr =
                serie[miejsceMeczu]


            if wynikMeczu == "W" then

                ss.W =
                    ss.W + 1

                ss.P = 0

                if ss.W > sr.W then
                    sr.W = ss.W
                end

            elseif wynikMeczu == "P" then

                ss.P =
                    ss.P + 1

                ss.W = 0

                if ss.P > sr.P then
                    sr.P = ss.P
                end

            end

        end

    end


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

    local rekordy = {

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

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

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

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

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

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

    }


    -- =====================================================
    -- ZAWODNICY TEAM1
    --
    -- WAŻNE:
    -- zawodnik musi być po stronie właściwej drużyny
    -- historycznej:
    --
    -- M.ns1 = team1 -> U.druzyna = M.druzyna1
    -- M.ns2 = team1 -> U.druzyna = M.druzyna2
    --
    -- Dzięki temu zmiana sponsora nie psuje historii.
    -- =====================================================

    local fieldsZawodnicy = table.concat({

        "U.zawodnik=zawodnik",
        "U.druzyna=druzyna_zawodnika",

        "U.gol=gol",
        "U.minuty=minuty",
        "U.minuty_format=minuty_format",
        "U.asysta=asysta",
        "U.zbiorka=zbiorka",
        "U.eval=eval",
        "U.plusminus=plusminus",

        "M.id=mecz",
        "M.data=data",

        "M.druzyna1=druzyna1",
        "M.druzyna2=druzyna2",

        "M.nazwa_statystyki1=ns1",
        "M.nazwa_statystyki2=ns2",

        "M.gole1=gole1",
        "M.gole2=gole2",

        "M.wynik=wynik",
        "M.strona_meczu=strona_meczu"

    }, ",")


    local whereTeam1Players =
        "(" ..

        "(" ..
        "M.nazwa_statystyki1='" ..
        team1SQL ..
        "' AND " ..
        "M.nazwa_statystyki2='" ..
        team2SQL ..
        "' AND " ..
        "U.druzyna=M.druzyna1" ..
        ")" ..

        " OR " ..

        "(" ..
        "M.nazwa_statystyki1='" ..
        team2SQL ..
        "' AND " ..
        "M.nazwa_statystyki2='" ..
        team1SQL ..
        "' AND " ..
        "U.druzyna=M.druzyna2" ..
        ")" ..

        ")"


    local zawodnicy =
        mw.ext.cargo.query(
            "UdzialZawodnika=U,Mecze=M",
            fieldsZawodnicy,
            {
                join =
                    "U.mecz=M.id",

                where =
                    whereTeam1Players ..
                    " AND U.minuty > 0",

                orderBy =
                    "M.data ASC",

                limit = 10000
            }
        )


    -- =====================================================
    -- FUNKCJA DODAWANIA REKORDU
    --
    -- WAŻNE:
    -- tworzona jest kopia item.
    --
    -- Dzięki temu rekord asyst nie może zostać później
    -- nadpisany przez rekord zbiórek/EVAL/+/-.
    -- =====================================================

    local function kopiaItem(item, wartosc)

        return {

            zawodnik =
                item.zawodnik,

            mecz =
                item.mecz,

            data =
                item.data,

            tekst =
                item.tekst,

            wynik =
                item.wynik,

            punkty =
                item.punkty,

            minuty =
                item.minuty,

            minuty_format =
                item.minuty_format,

            asysty =
                item.asysty,

            zbiorki =
                item.zbiorki,

            eval =
                item.eval,

            plusminus =
                item.plusminus,

            wartosc =
                wartosc

        }

    end


    local function dodajRekordZawodnika(
        tabela,
        miejsceMeczu,
        wartosc,
        item
    )

        local lista =
            tabela[miejsceMeczu]


        if #lista == 0 then

            table.insert(
                lista,
                kopiaItem(
                    item,
                    wartosc
                )
            )

            return

        end


        local obecna =
            lista[1].wartosc


        if wartosc > obecna then

            tabela[miejsceMeczu] = {

                kopiaItem(
                    item,
                    wartosc
                )

            }


        elseif wartosc == obecna then

            table.insert(
                lista,
                kopiaItem(
                    item,
                    wartosc
                )
            )

        end

    end


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

    if zawodnicy then

        for _, row in ipairs(zawodnicy) do

            local miejsceMeczu =
                miejsce(row)


            if miejsceMeczu then

                local item = {

                    zawodnik =
                        row.zawodnik or "",

                    mecz =
                        row.mecz or "",

                    data =
                        row.data or "",

                    tekst =
                        nazwaMeczu(row),

                    wynik =
                        row.wynik or "",

                    punkty =
                        liczba(row.gol),

                    minuty =
                        liczba(row.minuty),

                    minuty_format =
                        row.minuty_format or "",

                    asysty =
                        liczba(row.asysta),

                    zbiorki =
                        liczba(row.zbiorka),

                    eval =
                        liczba(row.eval),

                    plusminus =
                        liczba(row.plusminus)

                }


                dodajRekordZawodnika(
                    rekordy.punkty,
                    miejsceMeczu,
                    item.punkty,
                    item
                )


                dodajRekordZawodnika(
                    rekordy.minuty,
                    miejsceMeczu,
                    item.minuty,
                    item
                )


                dodajRekordZawodnika(
                    rekordy.asysty,
                    miejsceMeczu,
                    item.asysty,
                    item
                )


                dodajRekordZawodnika(
                    rekordy.zbiorki,
                    miejsceMeczu,
                    item.zbiorki,
                    item
                )


                dodajRekordZawodnika(
                    rekordy.eval,
                    miejsceMeczu,
                    item.eval,
                    item
                )


                dodajRekordZawodnika(
                    rekordy.plusminus,
                    miejsceMeczu,
                    item.plusminus,
                    item
                )

            end

        end

    end


    -- =====================================================
   -- =====================================================
-- NAJLEPSI STRZELCY
-- OBU DRUŻYN
--
-- Drużyna jest ustalana na podstawie strony meczu:
--
-- ns1 = team1:
--   druzyna1 = team1
--   druzyna2 = team2
--
-- ns2 = team1:
--   druzyna2 = team1
--   druzyna1 = team2
--
-- Dzięki temu działa również przy zmianach nazw sponsorskich.
-- =====================================================

local strzelcy = {
    [team1] = {},
    [team2] = {}
}


local function dodajStrzelca(
    tabela,
    zawodnik,
    punkty
)

    if not zawodnik or zawodnik == "" then
        return
    end

    tabela[zawodnik] =
        (tabela[zawodnik] or 0)
        +
        punkty

end


-- =====================================================
-- JEDNO ZAPYTANIE DLA OBU DRUŻYN
-- =====================================================

local zawodnicyStrzelcy =
    mw.ext.cargo.query(
        "UdzialZawodnika=U,Mecze=M",

        table.concat({

            "U.zawodnik=zawodnik",
            "U.druzyna=druzyna",
            "U.gol=gol",
            "U.minuty=minuty",

            "M.id=mecz",
            "M.druzyna1=druzyna1",
            "M.druzyna2=druzyna2",

            "M.nazwa_statystyki1=ns1",
            "M.nazwa_statystyki2=ns2"

        }, ","),

        {
            join =
                "U.mecz=M.id",

            where =
                "(" ..

                "(" ..
                "M.nazwa_statystyki1='" ..
                team1SQL ..
                "' AND " ..
                "M.nazwa_statystyki2='" ..
                team2SQL ..
                "' AND " ..

                "(" ..
                "U.druzyna=M.druzyna1" ..
                " OR " ..
                "U.druzyna=M.druzyna2" ..
                ")" ..

                ")" ..

                " OR " ..

                "(" ..
                "M.nazwa_statystyki1='" ..
                team2SQL ..
                "' AND " ..
                "M.nazwa_statystyki2='" ..
                team1SQL ..
                "' AND " ..

                "(" ..
                "U.druzyna=M.druzyna1" ..
                " OR " ..
                "U.druzyna=M.druzyna2" ..
                ")" ..

                ")" ..

                ")" ..

                " AND U.minuty > 0",

            limit = 20000
        }
    )


-- =====================================================
-- PRZYPISANIE ZAWODNIKA DO TEAM1 / TEAM2
-- NA PODSTAWIE STRONY MECZU
-- =====================================================

if zawodnicyStrzelcy then

    for _, row in ipairs(zawodnicyStrzelcy) do

        local druzynaH2H = nil


        -- -------------------------------------------------
        -- Wariant 1:
        -- team1 jest drużyną 1
        -- -------------------------------------------------

        if row.ns1 == team1 and
            row.ns2 == team2 then

            if row.druzyna == row.druzyna1 then

                druzynaH2H = team1

            elseif row.druzyna == row.druzyna2 then

                druzynaH2H = team2

            end


        -- -------------------------------------------------
        -- Wariant 2:
        -- team2 jest drużyną 1
        -- -------------------------------------------------

        elseif row.ns1 == team2 and
            row.ns2 == team1 then

            if row.druzyna == row.druzyna1 then

                druzynaH2H = team2

            elseif row.druzyna == row.druzyna2 then

                druzynaH2H = team1

            end

        end


        -- -------------------------------------------------
        -- Dodanie punktów
        -- -------------------------------------------------

        if druzynaH2H == team1 then

            dodajStrzelca(
                strzelcy[team1],
                row.zawodnik,
                liczba(row.gol)
            )


        elseif druzynaH2H == team2 then

            dodajStrzelca(
                strzelcy[team2],
                row.zawodnik,
                liczba(row.gol)
            )

        end

    end

end


-- =====================================================
-- SORTOWANIE STRZELCÓW
-- =====================================================

local function uporzadkujStrzelcow(
    tablica
)

    local wynik = {}


    for zawodnik, punkty
        in pairs(tablica) do

        table.insert(
            wynik,
            {
                zawodnik = zawodnik,
                punkty = punkty
            }
        )

    end


    table.sort(
        wynik,

        function(a, b)

            if a.punkty == b.punkty then

                return a.zawodnik <
                    b.zawodnik

            end

            return a.punkty >
                b.punkty

        end
    )


    return wynik

end


local strzelcy1 =
    uporzadkujStrzelcow(
        strzelcy[team1]
    )


local strzelcy2 =
    uporzadkujStrzelcow(
        strzelcy[team2]
    )

    -- =====================================================
    -- TRENERZY TEAM1
    -- =====================================================

    local trenerzy = {}


    -- =====================================================
    -- POBIERAMY SZTAB WSZYSTKICH MECZÓW
    -- =====================================================

    local sztab =
        mw.ext.cargo.query(
            "SztabMeczu=S,Mecze=M",

            table.concat({

                "S.osoba=osoba",
                "S.druzyna=druzyna",
                "S.rola=rola",

                "M.id=mecz",

                "M.druzyna1=druzyna1",
                "M.druzyna2=druzyna2",

                "M.nazwa_statystyki1=ns1",
                "M.nazwa_statystyki2=ns2"

            }, ","),

            {
                join =
                    "S.mecz=M.id",

                where =
                    "S.rola='Trener'" ..

                    " AND " ..

                    "(" ..

                    "(" ..
                    "M.nazwa_statystyki1='" ..
                    team1SQL ..
                    "' AND " ..
                    "M.nazwa_statystyki2='" ..
                    team2SQL ..
                    "' AND " ..
                    "S.druzyna=M.druzyna1" ..
                    ")" ..

                    " OR " ..

                    "(" ..
                    "M.nazwa_statystyki1='" ..
                    team2SQL ..
                    "' AND " ..
                    "M.nazwa_statystyki2='" ..
                    team1SQL ..
                    "' AND " ..
                    "S.druzyna=M.druzyna2" ..
                    ")" ..

                    ")",

                limit = 10000

            }
        )


    -- =====================================================
    -- TWORZENIE LISTY TRENERÓW
    -- =====================================================

    if sztab then

        for _, row in ipairs(sztab) do

            local trener =
                row.osoba or ""


            if trener ~= "" then

                trenerzy[trener] =
                    trenerzy[trener] or {

                        mecze = 0,
                        wygrane = 0,
                        przegrane = 0,

                        punktyZdobyte = 0,
                        punktyStracone = 0

                    }

            end

        end

    end


    -- =====================================================
    -- STATYSTYKI TRENERÓW
    -- =====================================================

    for _, row in ipairs(mecze) do

        local sztabMeczu =
            mw.ext.cargo.query(

                "SztabMeczu",

                "osoba,rola,druzyna",

                {

                    where =
                        "SztabMeczu.mecz='" ..
                        sql(row.mecz or "") ..
                        "'" ..

                        " AND SztabMeczu.rola='Trener'" ..

                        " AND SztabMeczu.druzyna='" ..

                        sql(

                            row.ns1 == team1
                            and row.druzyna1
                            or row.druzyna2

                        ) ..

                        "'",

                    limit = 10

                }

            )


        if sztabMeczu and
            #sztabMeczu > 0 then

            for _, sztabRow
                in ipairs(sztabMeczu) do

                local trener =
                    sztabRow.osoba or ""


                if trener ~= "" then

                    trenerzy[trener] =
                        trenerzy[trener] or {

                            mecze = 0,
                            wygrane = 0,
                            przegrane = 0,

                            punktyZdobyte = 0,
                            punktyStracone = 0

                        }


                    local zdobyte,
                        stracone =
                        wynikDruzyny(row)


                    if zdobyte and
                        stracone then

                        local t =
                            trenerzy[trener]


                        t.mecze =
                            t.mecze + 1


                        t.punktyZdobyte =
                            t.punktyZdobyte +
                            zdobyte


                        t.punktyStracone =
                            t.punktyStracone +
                            stracone


                        if zdobyte >
                            stracone then

                            t.wygrane =
                                t.wygrane + 1

                        elseif zdobyte <
                            stracone then

                            t.przegrane =
                                t.przegrane + 1

                        end

                    end

                end

            end

        end

    end


    local listaTrenerow = {}


    for trener, dane
        in pairs(trenerzy) do

        table.insert(
            listaTrenerow,
            {
                trener = trener,
                dane = dane
            }
        )

    end


    table.sort(
        listaTrenerow,

        function(a, b)

            if a.dane.mecze ==
                b.dane.mecze then

                return a.trener <
                    b.trener

            end

            return a.dane.mecze >
                b.dane.mecze

        end
    )


    -- =====================================================
    -- ANALIZA KWART
    --
    -- UWAGA:
    -- pola Cargo:
    -- kwarta1
    -- kwarta2
    -- kwarta3
    -- kwarta4
    --
    -- a nie kwart1 itd.
    -- =====================================================

    local kwarty = {

        {
            nazwa = "1. kwarta",
            pole = "kwarta1"
        },

        {
            nazwa = "2. kwarta",
            pole = "kwarta2"
        },

        {
            nazwa = "3. kwarta",
            pole = "kwarta3"
        },

        {
            nazwa = "4. kwarta",
            pole = "kwarta4"
        }

    }


    local analizaKwart = {}


    for i = 1, 4 do

        analizaKwart[i] = {

            wygranaKwartaWygranyMecz = 0,
            wygranaKwartaPrzegranyMecz = 0,

            przegranaKwartaWygranyMecz = 0,
            przegranaKwartaPrzegranyMecz = 0,

            remisKwartaWygranyMecz = 0,
            remisKwartaPrzegranyMecz = 0

        }

    end


    for _, row in ipairs(mecze) do

        local zdobyte,
            stracone =
            wynikDruzyny(row)


        if zdobyte and
            stracone then

            local wynikMeczu


            if zdobyte > stracone then

                wynikMeczu = "W"

            elseif zdobyte < stracone then

                wynikMeczu = "P"

            else

                wynikMeczu = "R"

            end


            for i = 1, 4 do

                local pole =
                    kwarty[i].pole


                local a, b =
                    parseWynikCzesciowy(
                        row[pole]
                    )


                if a and b then

                    local teamScore
                    local oppScore


                    if miejsce(row) ==
                        "dom" then

                        teamScore = a
                        oppScore = b

                    else

                        teamScore = b
                        oppScore = a

                    end


                    if teamScore >
                        oppScore then

                        if wynikMeczu == "W" then

                            analizaKwart[i].
                                wygranaKwartaWygranyMecz =
                                analizaKwart[i].
                                wygranaKwartaWygranyMecz + 1

                        elseif wynikMeczu == "P" then

                            analizaKwart[i].
                                wygranaKwartaPrzegranyMecz =
                                analizaKwart[i].
                                wygranaKwartaPrzegranyMecz + 1

                        end


                    elseif teamScore <
                        oppScore then

                        if wynikMeczu == "W" then

                            analizaKwart[i].
                                przegranaKwartaWygranyMecz =
                                analizaKwart[i].
                                przegranaKwartaWygranyMecz + 1

                        elseif wynikMeczu == "P" then

                            analizaKwart[i].
                                przegranaKwartaPrzegranyMecz =
                                analizaKwart[i].
                                przegranaKwartaPrzegranyMecz + 1

                        end


                    else

                        if wynikMeczu == "W" then

                            analizaKwart[i].
                                remisKwartaWygranyMecz =
                                analizaKwart[i].
                                remisKwartaWygranyMecz + 1

                        elseif wynikMeczu == "P" then

                            analizaKwart[i].
                                remisKwartaPrzegranyMecz =
                                analizaKwart[i].
                                remisKwartaPrzegranyMecz + 1

                        end

                    end

                end

            end

        end

    end


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

    local out = {}


    -- =====================================================
    -- BILANS
    -- =====================================================

    table.insert(
        out,
        "== Bilans bezpośrednich spotkań =="
    )

    table.insert(
        out,
        ""
    )


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


    table.insert(
        out,
        "! Zakres !! Mecze !! Wygrane !! Przegrane !! % wygranych !! Punkty zdobyte !! Punkty stracone"
    )


    local zakresy = {

        {
            nazwa = "Ogółem",
            dane = bilans.wszystkie
        },

        {
            nazwa = "🏠 Dom",
            dane = bilans.dom
        },

        {
            nazwa = "✈️ Wyjazd",
            dane = bilans.wyjazd
        }

    }


    for _, zakres
        in ipairs(zakresy) do

        local d =
            zakres.dane


        table.insert(
            out,
            "|-"
        )


        table.insert(
            out,
            "! " ..
            zakres.nazwa
        )


        table.insert(
            out,
            "| " ..
            d.mecze
        )


        table.insert(
            out,
            "| " ..
            d.wygrane
        )


        table.insert(
            out,
            "| " ..
            d.przegrane
        )


        table.insert(
            out,
            "| " ..
            procent(
                d.wygrane,
                d.mecze
            )
        )


        table.insert(
            out,
            "| " ..
            d.punktyZdobyte
        )


        table.insert(
            out,
            "| " ..
            d.punktyStracone
        )

    end


    table.insert(
        out,
        "|}"
    )


    -- =====================================================
    -- TRENERZY
    -- =====================================================

    table.insert(
        out,
        ""
    )


    table.insert(
        out,
        "== Trenerzy " ..
        team1 ..
        " w rywalizacji =="
    )


    table.insert(
        out,
        ""
    )


    if #listaTrenerow == 0 then

        table.insert(
            out,
            "Brak danych o trenerach."
        )

    else

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


        table.insert(
            out,
            "! Trener !! Mecze !! W !! P !! % wygranych !! Punkty zdobyte !! Punkty stracone"
        )


        for _, trener
            in ipairs(listaTrenerow) do

            local d =
                trener.dane


            table.insert(
                out,
                "|-"
            )


            table.insert(
                out,
                "| [[" ..
                trener.trener ..
                "]]"
            )


            table.insert(
                out,
                "| " ..
                d.mecze
            )


            table.insert(
                out,
                "| " ..
                d.wygrane
            )


            table.insert(
                out,
                "| " ..
                d.przegrane
            )


            table.insert(
                out,
                "| " ..
                procent(
                    d.wygrane,
                    d.mecze
                )
            )


            table.insert(
                out,
                "| " ..
                d.punktyZdobyte
            )


            table.insert(
                out,
                "| " ..
                d.punktyStracone
            )

        end


        table.insert(
            out,
            "|}"
        )

    end


    -- =====================================================
    -- NAJLEPSI STRZELCY
    -- =====================================================

    table.insert(
        out,
        ""
    )


    table.insert(
        out,
        "== Najlepsi strzelcy rywalizacji =="
    )


    table.insert(
        out,
        ""
    )


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


    table.insert(
        out,
        "! " ..
        team1 ..
        " !! Punkty !! " ..
        team2 ..
        " !! Punkty"
    )


    local max =
        math.max(
            #strzelcy1,
            #strzelcy2
        )


    for i = 1, max do

        table.insert(
            out,
            "|-"
        )


        local s1 =
            strzelcy1[i]


        local s2 =
            strzelcy2[i]


        if s1 then

            table.insert(
                out,
                "| [[" ..
                s1.zawodnik ..
                "]]"
            )


            table.insert(
                out,
                "| " ..
                s1.punkty

            )

        else

            table.insert(
                out,
                "|"
            )

            table.insert(
                out,
                "|"
            )

        end


        if s2 then

            table.insert(
                out,
                "| [[" ..
                s2.zawodnik ..
                "]]"
            )


            table.insert(
                out,
                "| " ..
                s2.punkty

            )

        else

            table.insert(
                out,
                "|"
            )

            table.insert(
                out,
                "|"
            )

        end

    end


    table.insert(
        out,
        "|}"
    )


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

    table.insert(
        out,
        ""
    )


    table.insert(
        out,
        "== Rekordy indywidualne " ..
        team1 ..
        " =="
    )


    table.insert(
        out,
        ""
    )


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


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


    local rekordyLista = {

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

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

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

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

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

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

    }


    local function tekstRekordu(
        lista,
        typ
    )

        if not lista or
            #lista == 0 then

            return "—"

        end


        local wynik = {}


        for _, item
            in ipairs(lista) do

            local wartosc


            if typ == "punkty" then

                wartosc =
                    item.punkty ..
                    " pkt"


            elseif typ == "minuty" then

                wartosc =
                    item.minuty_format


                if wartosc == "" then

                    wartosc =
                        tostring(
                            item.minuty
                        ) ..
                        " min"

                end


            elseif typ == "asysty" then

                wartosc =
                    item.asysty ..
                    " as."


            elseif typ == "zbiorki" then

                wartosc =
                    item.zbiorki ..
                    " zb."


            elseif typ == "eval" then

                wartosc =
                    item.eval ..
                    " EVAL"


            elseif typ == "plusminus" then

                if item.plusminus >= 0 then

                    wartosc =
                        "+" ..
                        item.plusminus

                else

                    wartosc =
                        tostring(
                            item.plusminus
                        )

                end


                wartosc =
                    wartosc ..
                    " +/-"

            end


            table.insert(
                wynik,

                "[[" ..
                item.zawodnik ..
                "]] — " ..
                wartosc ..
                "<br>" ..
                item.tekst ..
                " (" ..
                item.wynik ..
                ")"

            )

        end


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

    end


    for _, rekord
        in ipairs(rekordyLista) do

        table.insert(
            out,
            "|-"
        )


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


        table.insert(
            out,
            "| " ..
            tekstRekordu(
                rekord.dane.dom,
                rekord.typ
            )
        )


        table.insert(
            out,
            "| " ..
            tekstRekordu(
                rekord.dane.wyjazd,
                rekord.typ
            )
        )

    end


    table.insert(
        out,
        "|}"
    )


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

    table.insert(
        out,
        ""
    )


    table.insert(
        out,
        "== Serie zwycięstw i porażek =="
    )


    table.insert(
        out,
        ""
    )


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


    table.insert(
        out,
        "! Seria !! Ogółem !! 🏠 Dom !! ✈️ Wyjazd"
    )


    table.insert(
        out,
        "|-"
    )


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


    table.insert(
        out,
        "| " ..
        serie.wszystkie.W
    )


    table.insert(
        out,
        "| " ..
        serie.dom.W
    )


    table.insert(
        out,
        "| " ..
        serie.wyjazd.W
    )


    table.insert(
        out,
        "|-"
    )


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


    table.insert(
        out,
        "| " ..
        serie.wszystkie.P
    )


    table.insert(
        out,
        "| " ..
        serie.dom.P
    )


    table.insert(
        out,
        "| " ..
        serie.wyjazd.P
    )


    table.insert(
        out,
        "|}"
    )


    -- =====================================================
    -- ANALIZA KWART
    -- =====================================================

    table.insert(
        out,
        ""
    )


    table.insert(
        out,
        "== Zależność wyniku kwarty od wyniku meczu =="
    )


    table.insert(
        out,
        ""
    )


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


    table.insert(
        out,
        "! Kwarta !! Wygrała kwartę<br>i wygrała mecz !! Wygrała kwartę<br>i przegrała mecz !! Przegrała kwartę<br>i wygrała mecz !! Przegrała kwartę<br>i przegrała mecz !! Remis kwarty<br>i wygrała mecz !! Remis kwarty<br>i przegrała mecz"
    )


    for i = 1, 4 do

        local a =
            analizaKwart[i]


        table.insert(
            out,
            "|-"
        )


        table.insert(
            out,
            "! " ..
            kwarty[i].nazwa
        )


        table.insert(
            out,
            "| " ..
            a.wygranaKwartaWygranyMecz
        )


        table.insert(
            out,
            "| " ..
            a.wygranaKwartaPrzegranyMecz
        )


        table.insert(
            out,
            "| " ..
            a.przegranaKwartaWygranyMecz
        )


        table.insert(
            out,
            "| " ..
            a.przegranaKwartaPrzegranyMecz
        )


        table.insert(
            out,
            "| " ..
            a.remisKwartaWygranyMecz
        )


        table.insert(
            out,
            "| " ..
            a.remisKwartaPrzegranyMecz
        )

    end


    table.insert(
        out,
        "|}"
    )


    -- =====================================================
    -- WSZYSTKIE MECZE
    -- =====================================================

    table.insert(
        out,
        ""
    )


    table.insert(
        out,
        "== Historia spotkań =="
    )


    table.insert(
        out,
        ""
    )


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


    table.insert(
        out,
        "! Data !! Sezon !! Mecz !! Wynik !! Miejsce !! Wynik do przerwy !! K1 !! K2 !! K3 !! K4 !! Dogrywka 1 !! Dogrywka 2 !! Dogrywka 3"
    )


    for _, row
        in ipairs(mecze) do

        local m =
            miejsce(row)


        local miejsceTekst


        if m == "dom" then

            miejsceTekst =
                "🏠 Dom"

        else

            miejsceTekst =
                "✈️ Wyjazd"

        end


        table.insert(
            out,
            "|-"
        )


        table.insert(
            out,
            "| " ..
            (row.data or "")
        )


        table.insert(
            out,
            "| " ..
            (row.sezon or "")
        )


        table.insert(
            out,
            "| " ..
            nazwaMeczu(row)
        )


        table.insert(
            out,
            "| '''" ..
            liczba(row.gole1) ..
            ":" ..
            liczba(row.gole2) ..
            "'''"
        )


        table.insert(
            out,
            "| " ..
            miejsceTekst
        )


        table.insert(
            out,
            "| " ..
            (row.wynik_do_przerwy or "—")
        )


        -- =============================================
        -- KWARTA 1
        -- =============================================

        table.insert(
            out,
            "| " ..
            (row.kwarta1 or "—")
        )


        -- =============================================
        -- KWARTA 2
        -- =============================================

        table.insert(
            out,
            "| " ..
            (row.kwarta2 or "—")
        )


        -- =============================================
        -- KWARTA 3
        -- =============================================

        table.insert(
            out,
            "| " ..
            (row.kwarta3 or "—")
        )


        -- =============================================
        -- KWARTA 4
        -- =============================================

        table.insert(
            out,
            "| " ..
            (row.kwarta4 or "—")
        )


        -- =============================================
        -- DOGRYWKA 1
        -- =============================================

        table.insert(
            out,
            "| " ..
            (row.dogrywka1 or "—")
        )


        -- =============================================
        -- DOGRYWKA 2
        -- =============================================

        table.insert(
            out,
            "| " ..
            (row.dogrywka2 or "—")
        )


        -- =============================================
        -- DOGRYWKA 3
        -- =============================================

        table.insert(
            out,
            "| " ..
            (row.dogrywka3 or "—")
        )

    end


    table.insert(
        out,
        "|}"
    )


    -- =====================================================
    -- KONIEC
    -- =====================================================

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

end


return p