Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

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

local p = {}
local _id_counter = 0
local html = mw.html
local cargo = mw.ext.cargo

-- ============================================================
-- HELPER: Number Formatters
-- ============================================================

-- Indian Format (1,00,000)
local function formatINR(amount)
    if not amount then return "0" end
    local n = tostring(math.floor(tonumber(amount) or 0))
    if #n <= 3 then return n end
    local last3 = n:sub(-3)
    local rest = n:sub(1, -4)
    -- Indian format: group remaining digits in pairs (from right)
    local formattedRest = rest:reverse():gsub("(%d%d)", "%1,"):reverse():gsub("^,", "")
    return formattedRest .. "," .. last3
end

-- Standard Format (100,000) - For USD, Yen, etc.
local function formatStd(amount)
    if not amount then return "0" end
    local n = tostring(math.floor(tonumber(amount) or 0))
    return n:reverse():gsub("(%d%d%d)", "%1,"):reverse():gsub("^,", "")
end

-- ============================================================
-- HELPER: Dual Currency Display & Calc
-- ============================================================
-- Returns: { displayHTML, valueForDatabase (INR) }
local function processMoney(amount, currency, rate)
    if not amount or amount == "" or amount == "0" then 
        return { display = "TBD", dbValue = 0 } 
    end

    local val = 0
    local r = tonumber(rate) or 1
    local symbol = currency or "₹"
    
    if type(amount) == "string" then
        val = tonumber((amount:gsub(",", ""))) or 0
    else
        val = tonumber(amount) or 0
    end
    
    -- Case 1: Input is INR (Primary = INR, Secondary = USD)
    if symbol == "₹" or symbol == "INR" or symbol == "Rs" then
        local inrVal = val
        local usdVal = val * r -- Rate should be e.g. 0.011
        
        local mainStr = "₹ " .. formatINR(inrVal)
        local subStr = ""
        
        if r ~= 1 then
            subStr = '<br><small style="color:var(--text-muted); font-size:0.85em;">≈ $ ' .. formatStd(usdVal) .. '</small>'
        end
        
        return { 
            display = '<span class="pz-val">' .. mainStr .. subStr .. '</span>',
            dbValue = inrVal
        }
    
    -- Case 2: Input is Foreign (Primary = Foreign, Secondary = INR)
    else
        local localVal = val
        local inrVal = val * r -- Rate should be e.g. 90 (1 Unit = 90 INR)
        
        local mainStr = symbol .. " " .. formatStd(localVal)
        local subStr = '<br><small style="color:var(--text-muted); font-size:0.85em;">≈ ₹ ' .. formatINR(inrVal) .. '</small>'
        
        return { 
            display = '<span class="pz-val">' .. mainStr .. subStr .. '</span>',
            dbValue = inrVal
        }
    end
end

-- Helper: Get Logo
local function getLogo(teamName)
    if not teamName or teamName == "" or teamName == "TBD" then return "" end
    local clean = teamName:gsub("'", "")
    local light = clean .. '.png'
    local dark = clean .. '_dark.png'
    
    local container = html.create('span')
    
    if mw.title.new('File:' .. light).exists then
        container:wikitext('[[File:' .. light .. '|link=|class=logo-lightmode]]')
    else
        container:wikitext('[[File:Shield_team.png|link=|class=logo-lightmode]]')
    end
    
    if mw.title.new('File:' .. dark).exists then
        container:wikitext('[[File:' .. dark .. '|link=|class=logo-darkmode]]')
    elseif mw.title.new('File:' .. light).exists then
        container:wikitext('[[File:' .. light .. '|link=|class=logo-darkmode]]')
    else
        container:wikitext('[[File:Shield_team_dark.png|link=|class=logo-darkmode]]')
    end
    
    return tostring(container)
end

function p.main(frame)
    local args = frame:getParent().args
    
    -- Global Settings
    local currency = args.currency or "₹"
    local rate = tonumber(args.rate) or 1
    
    local tournamentName = args.tournament or mw.title.getCurrentTitle().subpageText
    
    -- PRE-CHECK: Are there any awards?
    local hasAnyAwards = false
    for i = 1, 20 do
        if args['award_' .. i] and args['award_' .. i] ~= "" then
            hasAnyAwards = true
            break
        end
    end

    -- Unique IDs for Toggling
    _id_counter = _id_counter + 1
    local uniqueID = "pp-" .. _id_counter
    local idContent = 'content-' .. uniqueID
    local idBtnShow = 'btn-show-' .. uniqueID
    local idBtnHide = 'btn-hide-' .. uniqueID
    
    local grid = html.create('div'):addClass('prize-section-grid')
    
    -- Adjust grid columns if no awards (Full width ranking)
    if not hasAnyAwards then
        grid:css('grid-template-columns', '1fr')
    end
    
    -- ==========================================
    -- COLUMN 1: RANKINGS (TEAMS)
    -- ==========================================
    local colRank = grid:tag('div'):addClass('prize-col-rank')
    colRank:tag('div'):addClass('prize-header'):wikitext('Prize Pool Distribution')
    
    local rankList = colRank:tag('div'):addClass('prize-list')
    local hasRankData = false
    local rankCount = 0
    
    for i = 1, 64 do
        if (args['team_'..i] and args['team_'..i] ~= "") or (args['prize_'..i] and args['prize_'..i] ~= "") then 
            rankCount = rankCount + 1 
        end
    end
    
    local collapseLimit = 10 
    local isCollapsible = (rankCount > collapseLimit)
    
    local hiddenDiv = nil
    if isCollapsible then
        hiddenDiv = html.create('div')
            :addClass('mw-collapsible mw-collapsed')
            :attr('id', 'mw-customcollapsible-' .. idContent)
    end
    
    for i = 1, 64 do
        local place = args['place_'..i] or (i .. '.')
        local team = args['team_'..i]
        local rawPrize = args['prize_'..i]
        local seed = args['seed_'..i]
        
        if (team and team ~= "") or (rawPrize and rawPrize ~= "") then
            hasRankData = true
            
            -- Process Money (Display + DB Value)
            local moneyData = processMoney(rawPrize, currency, rate)
            
            -- DATABASE STORE (Always store INR value)
            if team and team ~= "" and cargo and cargo.store then
                cargo.store('PrizeMoney', {
                    tournament = tournamentName,
                    placement = i,
                    team = team,
                    prize = moneyData.dbValue, -- STORES INR
                    award = ''
                })
            end
            
            local targetContainer = rankList
            if isCollapsible and i > collapseLimit then
                targetContainer = hiddenDiv
            end
            
            local row = targetContainer:tag('div'):addClass('prize-row')
            
            local rankClass = 'rank-other'
            local rankIcon = place
            if i == 1 then rankClass = 'rank-1'; rankIcon = '🥇' end
            if i == 2 then rankClass = 'rank-2'; rankIcon = '🥈' end
            if i == 3 then rankClass = 'rank-3'; rankIcon = '🥉' end
            
            row:addClass(rankClass)
            row:tag('div'):addClass('pz-rank'):wikitext(rankIcon)
            
            local teamDiv = row:tag('div'):addClass('pz-team')
            
            if team and team ~= "" then
                teamDiv:wikitext(getLogo(team))
                teamDiv:wikitext('[[' .. team .. ']]')
            else
                teamDiv:wikitext('TBD'):css('color', 'var(--text-muted)'):css('font-weight', 'normal')
            end
            
            local infoDiv = row:tag('div'):addClass('pz-info')
            
            -- Prize Display
            if rawPrize and rawPrize ~= "" then
                infoDiv:tag('div'):addClass('pz-prize'):wikitext(moneyData.display)
            end
            
            if seed and seed ~= "" then
                infoDiv:tag('span'):addClass('pz-seed'):wikitext(seed)
            end
        end
    end
    
    if not hasRankData then
        rankList:tag('div'):addClass('prize-empty')
            :wikitext('<i class="fa-solid fa-trophy"></i><br>Prize Pool TBD')
    else
        if isCollapsible then
            rankList:wikitext(tostring(hiddenDiv))
            local toggleTargets = 'mw-customtoggle-' .. idContent .. ' mw-customtoggle-' .. idBtnShow .. ' mw-customtoggle-' .. idBtnHide
            
            colRank:tag('div')
                :attr('id', 'mw-customcollapsible-' .. idBtnShow)
                :addClass('prize-show-more mw-collapsible ' .. toggleTargets) 
                :wikitext('View Full Distribution <i class="fa-solid fa-chevron-down"></i>')
                
            colRank:tag('div')
                :attr('id', 'mw-customcollapsible-' .. idBtnHide)
                :addClass('prize-show-more mw-collapsible mw-collapsed ' .. toggleTargets) 
                :wikitext('Show Less <i class="fa-solid fa-chevron-up"></i>')
        end
    end
    
    -- ==========================================
    -- COLUMN 2: SPECIAL AWARDS (Conditionally Rendered)
    -- ==========================================
    if hasAnyAwards then
        local colAward = grid:tag('div'):addClass('prize-col-award')
        colAward:tag('div'):addClass('prize-header'):wikitext('Special Awards')
        
        local awardList = colAward:tag('div'):addClass('prize-list')
        
        for i = 1, 20 do
            local awardName = args['award_'..i]
            local winner = args['award_'..i..'_winner']
            local team = args['award_'..i..'_team']
            local rawPrize = args['award_'..i..'_prize']
            
            if awardName and awardName ~= "" then
                
                local moneyData = processMoney(rawPrize, currency, rate)
                
                if (winner or team) and cargo and cargo.store then
                    cargo.store('PrizeMoney', {
                        tournament = tournamentName,
                        placement = '',
                        team = team or '',
                        player = winner or '',
                        prize = moneyData.dbValue, -- STORES INR
                        award = awardName
                    })
                end
                
                local row = awardList:tag('div'):addClass('award-row')
                
                local info = row:tag('div'):addClass('award-info')
                info:tag('div'):addClass('award-name'):wikitext(awardName)
                
                local winDiv = info:tag('div'):addClass('award-winner')
                
                if winner and winner ~= "" then
                    if team and team ~= "" then winDiv:wikitext(getLogo(team)) end
                    winDiv:wikitext('[[' .. winner .. ']]')
                elseif team and team ~= "" then
                    winDiv:wikitext(getLogo(team))
                    winDiv:wikitext('[[' .. team .. ']]')
                else
                    winDiv:wikitext("TBD"):css('color', 'var(--text-muted)'):css('font-weight', 'normal')
                end
                
                if rawPrize and rawPrize ~= "" then
                    row:tag('div'):addClass('award-prize'):wikitext(moneyData.display)
                end
            end
        end
    end
    
    return tostring(grid)
end

return p