Модуль:StatEngine/RatingBuilder/Debug

Материал из ЧТМ
Версия от 13:17, 1 мая 2026; Подбырин (обсуждение | вклад) (Новая страница: «-- ========================================================================= -- Модуль:StatEngine/Debug -- Вызов в вики-тексте: {{#invoke:St...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Для документации этого модуля может быть создана страница Модуль:StatEngine/RatingBuilder/Debug/doc

-- =========================================================================
-- Модуль:StatEngine/Debug
-- Вызов в вики-тексте: {{#invoke:StatEngine/Debug|run|2024}}
-- =========================================================================

local p = {}

-- Копия таблицы рангов для правильной сортировки от лучших к худшим
local ranks = {
    ["оп"] = 1,
    ["о"] = 2, ["о1"] = 3, ["о2"] = 4, ["о3"] = 5,
    ["о1-3г-no"] = 10, ["о-8г-no"] = 11, ["о-7г-no"] = 12, ["о-6г-no"] = 13,
    ["о-5г-no"] = 14, ["о-4г-no"] = 15, ["о-3г-no"] = 16,
    ["о1-6г"] = 20, ["о1-5г"] = 21, ["о1-4г"] = 22, ["о1-3г"] = 23, ["о1-2г"] = 24, ["о1-1г"] = 25,
    ["о2-6г"] = 30, ["о2-5г"] = 31, ["о2-4г"] = 32, ["о2-3г"] = 33, ["о2-2г"] = 34, ["о2-1г"] = 35,
    ["о3-6г"] = 40, ["о3-5г"] = 41, ["о3-4г"] = 42, ["о3-3г"] = 43, ["о3-2г"] = 44, ["о3-1г"] = 45,
    ["о-8г"] = 50, ["о-7г"] = 51, ["о-6г"] = 52, ["о-5г"] = 53, ["о-4г"] = 54, ["о-3г"] = 55, ["о-2г"] = 56, ["о-1г"] = 57,
    ["ос"] = 60, ["ос-5г"] = 61, ["ос-4г"] = 62, ["ос-3г"] = 63, ["ос-2г"] = 64, ["ос-1г"] = 65,
    
    -- === ЛИГА НАЦИЙ ===
    ["4гD"]=101, ["3гD-no"]=102, ["3гD"]=103, ["2гD"]=104, ["1гD"]=105, ["чфD"]=106, ["пD"]=107, ["фD"]=108, ["побD"]=109,
    ["4гC"]=111, ["3гC-no"]=112, ["3гC"]=113, ["2гC"]=114, ["1гC"]=115, ["чфC"]=116, ["пC"]=117, ["фC"]=118, ["побC"]=119,
    ["4гB"]=121, ["3гB-no"]=122, ["3гB"]=123, ["2гB"]=124, ["1гB"]=125, ["чфB"]=126, ["пB"]=127, ["фB"]=128, ["побB"]=129,
    ["4гA"]=131, ["3гA-no"]=132, ["3гA"]=133, ["2гA"]=134, ["1гA"]=135, ["чфA"]=136, ["пA"]=137, ["фA"]=138,
    
    -- === ФИНАЛЬНЫЕ ТУРНИРЫ ===
    ["8"] = 270, ["7"] = 271, ["6"] = 272, ["5"] = 273,
    ["6г"] = 280, ["5г"] = 281, ["4г"] = 282, ["3г"] = 283, ["2г"] = 284, ["1г"] = 285,
    ["в"] = 290, ["чф"] = 291, ["д"] = 292, ["б"] = 293, ["ф"] = 294, ["ч"] = 295
}

function p.run(frame)
    -- Получаем аргументы (сначала проверяем напрямую, затем у родителя)
    local args = frame.args[1] and frame.args or frame:getParent().args
    local year = tonumber(args[1] or args["год"] or args.year)

    if not year then
        return "<strong class='error'>Ошибка: Укажите год первым параметром (например, {{#invoke:StatEngine/Debug|run|2024}}).</strong>"
    end

    -- Загружаем БД турниров за указанный год
    local db_module_name = 'Модуль:Data/Tournaments/' .. year
    local success_db, db_tournaments = pcall(require, db_module_name)
    if not success_db then
        return "<strong class='error'>Ошибка: Не удалось загрузить данные турниров (" .. db_module_name .. ").</strong>"
    end

    -- Загружаем основной модуль рейтинга
    local success_builder, Builder = pcall(require, 'Модуль:StatEngine/RatingBuilder')
    if not success_builder then
        return "<strong class='error'>Ошибка: Не удалось загрузить Модуль:StatEngine/RatingBuilder.</strong>"
    end

    -- Собираем данные
    local data = Builder.build_year(year, db_tournaments)
    
    if not data or next(data) == nil then
        return "''Нет данных для вывода за " .. year .. " год.''"
    end

    local output_lines = {}
    
    -- Собираем названия турниров и сортируем их по алфавиту для красоты
    local tournaments = {}
    for tourney_name in pairs(data) do
        table.insert(tournaments, tourney_name)
    end
    table.sort(tournaments)

    -- Обрабатываем каждый турнир
    for _, tourney in ipairs(tournaments) do
        local teams_data = data[tourney]
        local teams_list = {}
        
        -- Переводим команды из ассоциативного массива в индексированный для сортировки
        for team_name, result in pairs(teams_data) do
            table.insert(teams_list, {
                name = team_name,
                result = result,
                -- Если ключа нет в базе рангов или пришел nil, ставим -1 (чтобы улетел в самый низ)
                rank = ranks[result] or -1
            })
        end

        -- Сортировка команд
        table.sort(teams_list, function(a, b)
            if a.rank ~= b.rank then
                return a.rank > b.rank -- От большего (лучшего) к меньшему
            else
                return a.name < b.name -- При равных рангах сортируем по алфавиту
            end
        end)

        -- Формируем текст для текущего турнира
        table.insert(output_lines, string.format("== %s (%d) ==", tourney, #teams_list))
        
        for i, t in ipairs(teams_list) do
            local display_result = t.result
            if display_result == nil then
                display_result = "<span style='color:red;'>'''nil''' (неизвестная ошибка)</span>"
            elseif t.rank == -1 then
                display_result = string.format("<span style='color:orange;'>%s (неизвестный код ранга)</span>", tostring(t.result))
            end
            
            table.insert(output_lines, string.format("%d. %s — %s", i, t.name, display_result))
        end
        
        table.insert(output_lines, "") -- Пустая строка между турнирами
    end

    return table.concat(output_lines, "\n")
end

return p