Module:PlayoffBracketv2

From elfpedia.eu

Documentation for this module may be created at Module:PlayoffBracketv2/doc

local M = {}

-- Dependency on Standingsv3 module to get playoff teams and their seeding
-- Changed from Standingsv2 to Standingsv3
local Standings = require('Module:Standingsv3')

-- Function to generate the playoff bracket
function M.generateBracket(frame)
    local args = frame:getParent().args
    local season = tonumber(args.season) or 2025
    if not season then
        return "<p>Error: Please provide a season (e.g., {{#invoke:PlayoffBracket|generateBracket|season=2025}})</p>"
    end

    -- Retrieve data and seeding via the Standings module
    local games = Standings.getGameData(season)
    local allTeamStats = Standings.calculateTeamStats(games)
    -- playoffTeamsInfo returns {TeamName = {status=..., rank=..., isQualified=..., ...}}
    local playoffTeamsInfo = Standings.getPlayoffTeams(allTeamStats, season) 

    -- Filter and sort qualified teams by rank to assign them to matchups
    local sortedPlayoffTeams = {}
    for teamName, info in pairs(playoffTeamsInfo) do
        -- Only insert qualified teams that have a rank
        if info.isQualified and info.rank ~= nil then
            table.insert(sortedPlayoffTeams, { Name = teamName, Rank = info.rank, Status = info.status })
        end
    end
    
    -- Now sort the filtered list (line 27 will no longer compare nil values)
    table.sort(sortedPlayoffTeams, function(a, b) return a.Rank < b.Rank end)

    local teamByRank = {}
    for _, team in ipairs(sortedPlayoffTeams) do
        teamByRank[team.Rank] = team.Name
    end

    -- --- HTML Generation for the Bracket ---
    local output = {}
    table.insert(output, '<div class="playoff-bracket-container">') -- Main container

    -- Bye Week Teams
    -- Use 'TBD' if a rank does not exist (e.g., less than 6 teams qualified)
    local team1_name = teamByRank[1] or "TBD"
    local team2_name = teamByRank[2] or "TBD"

    -- Wildcard Round Teams
    local team3_name = teamByRank[3] or "TBD"
    local team4_name = teamByRank[4] or "TBD"
    local team5_name = teamByRank[5] or "TBD"
    local team6_name = teamByRank[6] or "TBD"
-- Wildcard Round
table.insert(output, '<div class="playoff-round wildcard-round">')
table.insert(output, '<div class="playoff-round-header">WILDCARD ROUND</div>')
table.insert(output, '<div class="playoff-matchup-sub-header">')
table.insert(output, '<div class="playoff-header-away">AWAY</div>')
table.insert(output, '<div class="playoff-header-home">HOME</div>')
table.insert(output, '</div>')

-- Matchup #6 (Away) vs #3 (Home)
table.insert(output, '<div class="playoff-matchup">')
table.insert(output, '<div class="sr-only">Wildcard matchup: Seed #6 ' .. team6_name .. ' at Seed #3 ' .. team3_name .. '.</div>')
table.insert(output, '<div class="playoff-team away-team">[[' .. team6_name .. ']] (#6)</div>')
table.insert(output, '<div class="playoff-at">AT</div>')
table.insert(output, '<div class="playoff-team home-team">[[' .. team3_name .. ']] (#3)</div>')
table.insert(output, '</div>')

-- Matchup #5 (Away) vs #4 (Home)
table.insert(output, '<div class="playoff-matchup">')
table.insert(output, '<div class="sr-only">Wildcard matchup: Seed #5 ' .. team5_name .. ' at Seed #4 ' .. team4_name .. '.</div>')
table.insert(output, '<div class="playoff-team away-team">[[' .. team5_name .. ']] (#5)</div>')
table.insert(output, '<div class="playoff-at">AT</div>')
table.insert(output, '<div class="playoff-team home-team">[[' .. team4_name .. ']] (#4)</div>')
table.insert(output, '</div>')

table.insert(output, '</div>') -- End wildcard-round


-- Bye Week Section (neue kompakte Darstellung)
table.insert(output, '<div class="playoff-bye-info">')
table.insert(output, '<span class="playoff-bye-label">Bye Week:</span>')
table.insert(output, '<span class="playoff-bye-team">[[' .. team1_name .. ']] (#1)</span>')
table.insert(output, '<span class="playoff-bye-team">[[' .. team2_name .. ']] (#2)</span>')
table.insert(output, '</div>')


   -- Semifinal Round
table.insert(output, '<div class="playoff-round semifinal-round">')
table.insert(output, '<div class="playoff-round-header">SEMIFINAL ROUND</div>')

-- Matchup 1: Highest remaining Seed vs #2 Seed
table.insert(output, '<div class="playoff-matchup">')
table.insert(output, '<div class="sr-only">Semifinal matchup: Highest remaining Wild Card winner versus Seed #2 ' .. team2_name .. '.</div>')
table.insert(output, '<div class="playoff-team away-team winner-placeholder">(Highest WC Winner)</div>')
table.insert(output, '<div class="playoff-at">AT</div>')
table.insert(output, '<div class="playoff-team home-team">[[' .. team2_name .. ']] (#2)</div>')
table.insert(output, '</div>')

-- Matchup 2: Lowest remaining Seed vs #1 Seed
table.insert(output, '<div class="playoff-matchup">')
table.insert(output, '<div class="sr-only">Semifinal matchup: Lowest remaining Wild Card winner versus Seed #1 ' .. team1_name .. '.</div>')
table.insert(output, '<div class="playoff-team away-team winner-placeholder">(Lowest WC Winner)</div>')
table.insert(output, '<div class="playoff-at">AT</div>')
table.insert(output, '<div class="playoff-team home-team">[[' .. team1_name .. ']] (#1)</div>')
table.insert(output, '</div>')

table.insert(output, '</div>') -- End semifinal-round


-- Championship Game
table.insert(output, '<div class="playoff-round championship-round">')
table.insert(output, '<div class="playoff-round-header">CHAMPIONSHIP GAME</div>')

table.insert(output, '<div class="playoff-matchup">')
table.insert(output, '<div class="sr-only">Championship game matchup: Winner of semifinal one versus winner of semifinal two.</div>')
table.insert(output, '<div class="playoff-team away-team winner-placeholder">Winner Semifinal 1</div>')
table.insert(output, '<div class="playoff-at">VS</div>')
table.insert(output, '<div class="playoff-team home-team winner-placeholder">Winner Semifinal 2</div>')
table.insert(output, '</div>')

table.insert(output, '</div>') -- End championship-round

    table.insert(output, '</div>') -- End playoff-bracket-container
    return table.concat(output, '\n')
end

return M