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

local p = {}
local matchData = require('Модуль:Матчи/Данные')

-- СЛОВАРЬ: Полное название -> Код
local nameToCode = {
    ["Абхазия"] = "АБХ", ["Американские Виргины"] = "АВИ", ["Австралийские Аборигены"] = "АВС",
    ["Азавад"] = "АЗА", ["Азорские Острова"] = "АЗО", ["Акри"] = "АКР", ["Аландские Острова"] = "АЛА",
    ["Аляска"] = "АЛЯ", ["Амбазония"] = "АМБ", ["Ангилья"] = "АНГ", ["Англси"] = "АНЛ",
    ["Антарктида"] = "АНР", ["Антигуа и Барбуда"] = "АНТ", ["Аомынь"] = "АОМ", ["Аруба"] = "АРУ",
    ["Америк. Самоа"] = "АСА",
    ["Американское Самоа"] = "АСА", ["Ассирия"] = "АСС", ["Атолл Джонстон"] = "АТО", ["Афганистан"] = "АФГ",
    ["Ачех"] = "АЧЕ", ["Багамы"] = "БАГ", ["Бакасси"] = "БАК", ["Бангладеш"] = "БАН",
    ["Барбадос"] = "БАР", ["Британские Виргины"] = "БВИ", ["Буганда"] = "БГН", ["Белиз"] = "БЕЛ",
    ["Бенин"] = "БЕН", ["Бермуды"] = "БЕР", ["Биафра"] = "БИА", ["Белуджистан"] = "БЛД",
    ["Бонайре"] = "БОН", ["Ботсвана"] = "БОТ", ["Барава"] = "БРВ", ["Бретань"] = "БРЕ",
    ["Бруней"] = "БРУ", ["Бугенвиль"] = "БУГ", ["Буркина-Фасо"] = "БУР", ["Бутан"] = "БУТ",
    ["Вазиристан"] = "ВАЗ", ["Валлония"] = "ВАЛ", ["Ватикан"] = "ВАТ", ["Венда"] = "ВЕН",
    ["Внешние Гебриды"] = "ВНЕ", ["Внутренняя Монголия"] = "ВНУ", ["Восточный Тимор"] = "ВОС",
    ["Гавайи"] = "ГАВ", ["Гагаузия"] = "ГАГ", ["Гайана"] = "ГАЙ", ["Галапагос"] = "ГАЛ",
    ["Гамбия"] = "ГАМ", ["Гваделупа"] = "ГВА", ["Гвинея-Бисау"] = "ГВБ", ["Гвиана"] = "ГВИ",
    ["Гернси"] = "ГЕР", ["Гибралтар"] = "ГИБ", ["Гонгконг"] = "ГОН", ["Государство Ва"] = "ГОС",
    ["Готланд"] = "ГОТ", ["Гоцо"] = "ГОЦ", ["Графство Ницца"] = "ГРА", ["Гренада"] = "ГРЕ",
    ["Гренландия"] = "ГРЛ", ["Гуам"] = "ГУА", ["Дарфур"] = "ДАР", ["Дельвидек"] = "ДЕЛ",
    ["Джерси"] = "ДЖЕ", ["Джибути"] = "ДЖИ", ["ДНР"] = "ДНР", ["Доминика"] = "ДОМ", ["Домин. Республика"] = "ДРЕ",
    ["Доминиканская Республика"] = "ДРЕ", ["Западная Армения"] = "ЗАА", ["Закарпатье"] = "ЗАК",
    ["Замбезия"] = "ЗАМ", ["Занзибар"] = "ЗАН", ["Западное Папуа"] = "ЗАП", ["Западная Сахара"] = "ЗАС",
    ["Западный Тоголенд"] = "ЗАТ", ["Земля Франца-Иосифа"] = "ЗФИ", ["Индия"] = "ИНД", ["Ичкерия"] = "ИЧК",
    ["Йемен"] = "ЙЕМ", ["Кабилия"] = "КАБ", ["Кайманы"] = "КАЙ", ["Камбоджа"] = "КАМ",
    ["Канары"] = "КАН", ["Каприви"] = "КАП", ["Каскадия"] = "КАС", ["Катанга"] = "КАТ",
    ["Кашмир"] = "КАШ", ["Кабинда"] = "КБН", ["Кения"] = "КЕН", ["Кергелен"] = "КЕР",
    ["Киргизия"] = "КИР", ["Китайский Тайпей"] = "КИТ", ["Кокос"] = "КОК", ["Коморы"] = "КОМ",
    ["Конк"] = "КОН", ["Кокосовые Острова"] = "КОО", ["Корейцы Японии"] = "КОР", ["Королевство обеих Сицилий"] = "КОС",
    ["Кирибати"] = "КРБ", ["Кермадек"] = "КРМ", ["Корнуолл"] = "КРН", ["Крым"] = "КРЫ",
    ["Курдистан"] = "КУР", ["Кюрасао"] = "КЮР", ["Ладония"] = "ЛАД", ["Лакота"] = "ЛАК",
    ["Лаос"] = "ЛАО", ["Лапландия"] = "ЛАП", ["Латгалия"] = "ЛАТ", ["Лесото"] = "ЛЕС",
    ["Ливан"] = "ЛИВ", ["ЛНР"] = "ЛНР", ["Логон"] = "ЛОГ", ["Маврикий"] = "МАВ",
    ["Мадагаскар"] = "МАД", ["Майотта"] = "МАЙ", ["Мальдивы"] = "МАЛ", ["Мальтийский Орден"] = "МАО",
    ["Мапуче"] = "МАП", ["Маршаллы"] = "МАР", ["Масаи"] = "МАС", ["Матабелеленд"] = "МАТ",
    ["Мавритания"] = "МВР", ["Мадейра"] = "МДР", ["Мелилья"] = "МЕЛ", ["Менорка"] = "МЕН",
    ["Мидуэй"] = "МИД", ["Микронезия"] = "МИК", ["Малайзия"] = "МЛЗ", ["Монако"] = "МНК",
    ["Монтсеррат"] = "МНТ", ["Мозамбик"] = "МОЗ", ["Молоссия"] = "МОЛ", ["Монголия"] = "МОН",
    ["Мореснет"] = "МОР", ["Марианы"] = "МРН", ["Мартиника"] = "МРТ", ["Мьянма"] = "МЬЯ",
    ["Нагорный Карабах"] = "НАГ", ["Науру"] = "НАУ", ["Нагаленд"] = "НГЛ", ["Непал"] = "НЕП",
    ["Новая Земля"] = "НЗЕ", ["Нигер"] = "НИГ", ["Никарагуа"] = "НИК", ["Ниуэ"] = "НИУ",
    ["Новая Каледония"] = "НОВ", ["Норфолк"] = "НОР", ["Ньюфаундленд"] = "НЬЮ", ["Острова Антиподов"] = "ОАН",
    ["Остров Вознесения"] = "ОВО", ["Огненная Земля"] = "ОГН", ["Остров Европа"] = "ОЕВ",
    ["Окситания"] = "ОКС", ["Острова Кука"] = "ОКУ", ["Олдерни"] = "ОЛД", ["Остров Мэн"] = "ОМЭ",
    ["Остров Пасхи"] = "ОПА", ["Остров Петра Первого"] = "ОПП", ["Остров Принца Эдуарда"] = "ОПЭ",
    ["Оркнейские Острова"] = "ОРК", ["Остров Рождества"] = "ОРО", ["Острова Силли"] = "ОСИ",
    ["Остров св. Елены"] = "ОСТ", ["Остров Уайт"] = "ОУА", ["Падания"] = "ПАД", ["Пакистан"] = "ПАК",
    ["Палау"] = "ПАЛ", ["Папуа-Новая Гвинея"] = "ПАП", ["Пенджаб"] = "ПЕН", ["Питкэрн"] = "ПИТ",
    ["Палестина"] = "ПЛС", ["Полинезийские Спорады"] = "ПОЛ", ["Приднестровье"] = "ПРИ", ["Прованс"] = "ПРО",
    ["Пуэрто-Рико"] = "ПУЭ", ["Раф-энд-Рэди"] = "РАФ", ["Рехобот"] = "РЕХ", ["Реция"] = "РЕЦ",
    ["Реюньон"] = "РЕЮ", ["Родос"] = "РОД", ["Сааремаа"] = "САА", ["Саба"] = "САБ",
    ["Самоа"] = "САМ", ["Сан-Марино"] = "САН", ["Сарк"] = "САР", ["Сен-Бартельми"] = "СБА",
    ["Свазиленд"] = "СВА", ["Сент-Винсент и Гренадины"] = "СВГ", ["Себорга"] = "СЕБ", ["Северный Кипр"] = "СЕВ",
    ["Сейшелы"] = "СЕЙ", ["Секейский Край"] = "СЕК", ["Сент-Люсия"] = "СЕН", ["Сеута"] = "СЕУ",
    ["Силенд"] = "СИЛ", ["Сингапур"] = "СИН", ["Сицилия"] = "СИЦ", ["Сент-Китс и Невис"] = "СКН",
    ["Сент-Мартен"] = "СМА", ["Сомалиленд"] = "СМЛ", ["Сан-Андрес"] = "СНА", ["Синд"] = "СНД",
    ["Соже"] = "СОЖ", ["Соломоны"] = "СОЛ", ["Сомали"] = "СОМ", ["Сен-Пьер и Микелон"] = "СПМ",
    ["Сардиния"] = "СРД", ["Сан-Томе и Принсипи"] = "СТП", ["Сулу"] = "СУЛ", ["Суринам"] = "СУР",
    ["Сент-Эстатиус"] = "СЭС", ["Таджикистан"] = "ТАД", ["Таити"] = "ТАИ", ["Тамил-Илам"] = "ТАМ",
    ["Танзания"] = "ТАН", ["Тасмания"] = "ТАС", ["Теркс и Кайкос"] = "ТЕР", ["Тибет"] = "ТИБ",
    ["Токелау"] = "ТОК", ["Тонга"] = "ТОН", ["Тристан-да-Кунья"] = "ТРИ", ["Триест"] = "ТРС",
    ["Туамоту"] = "ТУА", ["Тувалу"] = "ТУВ", ["Туркмения"] = "ТУР", ["Ужупис"] = "УЖУ",
    ["Уоллис и Футуна"] = "УОЛ", ["Уэйк"] = "УЭЙ", ["Федеральные владения Венесуэлы"] = "ФВВ", ["Фельвидек"] = "ФЕЛ",
    ["Фиджи"] = "ФИД", ["Филиппины"] = "ФИЛ", ["Фолкленд. Острова"] = "ФОЛ", ["Фрёйа"] = "ФРЁ",
    ["Французская Полинезия"] = "ФРА", ["Франкония"] = "ФРН", ["Хатт-Ривер"] = "ХАТ", ["Хёрд"] = "ХЁР",
    ["Хитра"] = "ХИТ", ["Хмонг"] = "ХМО", ["Христиания"] = "ХРИ", ["Хузестан"] = "ХУЗ",
    ["ЦАР"] = "ЦАР", ["Цыгане"] = "ЦЫГ", ["Чагос"] = "ЧАГ", ["Чад"] = "ЧАД",
    ["Чамерия"] = "ЧАМ", ["Чатем"] = "ЧАТ", ["Шан"] = "ШАН", ["Шетландские Острова"] = "ШЕТ",
    ["Шпицберген"] = "ШПИ", ["Шри-Ланка"] = "ШРИ", ["Экв. Гвинея"] = "ЭКВ", ["Эритрея"] = "ЭРИ",
    ["Эфиопия"] = "ЭФИ", ["Южная Георгия"] = "ЮГЕ", ["Южный Судан"] = "ЮЖН", ["Южный Йемен"] = "ЮЙМ",
    ["Южное Касаи"] = "ЮКА", ["Южный Камерун"] = "ЮКМ", ["Южное Конго"] = "ЮКО", ["Южная Осетия"] = "ЮОС",
    ["Южный Тироль"] = "ЮТИ", ["Ян-Майен"] = "ЯМА"
}

-- ОБРАТНЫЙ СЛОВАРЬ (Код -> Полное название) для ссылок и флагов
local codeToName = {
    ["АБХ"]="Абхазия", ["АВИ"]="Американские Виргины", ["АВС"]="Австрал. Аборигены", ["АЗА"]="Азавад",
    ["АЗО"]="Азорские Острова", ["АКР"]="Акри", ["АЛА"]="Аландские Острова", ["АЛЯ"]="Аляска",
    ["АМБ"]="Амбазония", ["АНГ"]="Ангилья", ["АНЛ"]="Англси", ["АНР"]="Антарктида",
    ["АНТ"]="Антигуа и Барбуда", ["АОМ"]="Аомынь", ["АРУ"]="Аруба", ["АСА"]="Америк. Самоа",
    ["АСС"]="Ассирия", ["АТО"]="Атолл Джонстон", ["АФГ"]="Афганистан", ["АЧЕ"]="Ачех",
    ["БАГ"]="Багамы", ["БАК"]="Бакасси", ["БАН"]="Бангладеш", ["БАР"]="Барбадос",
    ["БВИ"]="Британские Виргины", ["БГН"]="Буганда", ["БЕЛ"]="Белиз", ["БЕН"]="Бенин",
    ["БЕР"]="Бермуды", ["БИА"]="Биафра", ["БЛД"]="Белуджистан", ["БОН"]="Бонайре",
    ["БОТ"]="Ботсвана", ["БРВ"]="Барава", ["БРЕ"]="Бретань", ["БРУ"]="Бруней",
    ["БУГ"]="Бугенвиль", ["БУР"]="Буркина-Фасо", ["БУТ"]="Бутан", ["ВАЗ"]="Вазиристан",
    ["ВАЛ"]="Валлония", ["ВАТ"]="Ватикан", ["ВЕН"]="Венда", ["ВНЕ"]="Внешние Гебриды",
    ["ВНУ"]="Внутр. Монголия", ["ВОС"]="Восточный Тимор", ["ГАВ"]="Гавайи", ["ГАГ"]="Гагаузия",
    ["ГАЙ"]="Гайана", ["ГАЛ"]="Галапагос", ["ГАМ"]="Гамбия", ["ГВА"]="Гваделупа",
    ["ГВБ"]="Гвинея-Бисау", ["ГВИ"]="Гвиана", ["ГЕР"]="Гернси", ["ГИБ"]="Гибралтар",
    ["ГОН"]="Гонгконг", ["ГОС"]="Государство Ва", ["ГОТ"]="Готланд", ["ГОЦ"]="Гоцо",
    ["ГРА"]="Графство Ницца", ["ГРЕ"]="Гренада", ["ГРЛ"]="Гренландия", ["ГУА"]="Гуам",
    ["ДАР"]="Дарфур", ["ДЕЛ"]="Дельвидек", ["ДЖЕ"]="Джерси", ["ДЖИ"]="Джибути",
    ["ДНР"]="ДНР", ["ДОМ"]="Доминика", ["ДРЕ"]="Домин. Республика", ["ЗАА"]="Западная Армения",
    ["ЗАК"]="Закарпатье", ["ЗАМ"]="Замбезия", ["ЗАН"]="Занзибар", ["ЗАП"]="Западное Папуа",
    ["ЗАС"]="Западная Сахара", ["ЗАТ"]="Западный Тоголенд", ["ЗФИ"]="Земля Франца-Иосифа",
    ["ИНД"]="Индия", ["ИЧК"]="Ичкерия", ["ЙЕМ"]="Йемен", ["КАБ"]="Кабилия",
    ["КАЙ"]="Кайманы", ["КАМ"]="Камбоджа", ["КАН"]="Канары", ["КАП"]="Каприви",
    ["КАС"]="Каскадия", ["КАТ"]="Катанга", ["КАШ"]="Кашмир", ["КБН"]="Кабинда",
    ["КЕН"]="Кения", ["КЕР"]="Кергелен", ["КИР"]="Киргизия", ["КИТ"]="Китайский Тайпей",
    ["КОК"]="Кокос", ["КОМ"]="Коморы", ["КОН"]="Конк", ["КОО"]="Кокосовые Острова",
    ["КОР"]="Корейцы Японии", ["КОС"]="Кор. об. Сицилий", ["КРБ"]="Кирибати", ["КРМ"]="Кермадек",
    ["КРН"]="Корнуолл", ["КРЫ"]="Крым", ["КУР"]="Курдистан", ["КЮР"]="Кюрасао",
    ["ЛАД"]="Ладония", ["ЛАК"]="Лакота", ["ЛАО"]="Лаос", ["ЛАП"]="Лапландия",
    ["ЛАТ"]="Латгалия", ["ЛЕС"]="Лесото", ["ЛИВ"]="Ливан", ["ЛНР"]="ЛНР",
    ["ЛОГ"]="Логон", ["МАВ"]="Маврикий", ["МАД"]="Мадагаскар", ["МАЙ"]="Майотта",
    ["МАЛ"]="Мальдивы", ["МАО"]="Мальтийский Орден", ["МАП"]="Мапуче", ["МАР"]="Маршаллы",
    ["МАС"]="Масаи", ["МАТ"]="Матабелеленд", ["МВР"]="Мавритания", ["МДР"]="Мадейра",
    ["МЕЛ"]="Мелилья", ["МЕН"]="Менорка", ["МИД"]="Мидуэй", ["МИК"]="Микронезия",
    ["МЛЗ"]="Малайзия", ["МНК"]="Монако", ["МНТ"]="Монтсеррат", ["МОЗ"]="Мозамбик",
    ["МОЛ"]="Молоссия", ["МОН"]="Монголия", ["МОР"]="Мореснет", ["МРН"]="Марианы",
    ["МРТ"]="Мартиника", ["МЬЯ"]="Мьянма", ["НАГ"]="Нагорный Карабах", ["НАУ"]="Науру",
    ["НГЛ"]="Нагаленд", ["НЕП"]="Непал", ["НЗЕ"]="Новая Земля", ["НИГ"]="Нигер",
    ["НИК"]="Никарагуа", ["НИУ"]="Ниуэ", ["НОВ"]="Новая Каледония", ["НОР"]="Норфолк",
    ["НЬЮ"]="Ньюфаундленд", ["ОАН"]="Острова Антиподов", ["ОВО"]="Остров Вознесения",
    ["ОГН"]="Огненная Земля", ["ОЕВ"]="Остров Европа", ["ОКС"]="Окситания", ["ОКУ"]="Острова Кука",
    ["ОЛД"]="Олдерни", ["ОМЭ"]="Остров Мэн", ["ОПА"]="Остров Пасхи", ["ОПП"]="Остров Петра Первого",
    ["ОПЭ"]="Остров Принца Эдуарда", ["ОРК"]="Оркнейские Острова", ["ОРО"]="Остров Рождества",
    ["ОСИ"]="Острова Силли", ["ОСТ"]="Остров св. Елены", ["ОУА"]="Остров Уайт", ["ПАД"]="Падания",
    ["ПАК"]="Пакистан", ["ПАЛ"]="Палау", ["ПАП"]="Папуа-Новая Гвинея", ["ПЕН"]="Пенджаб",
    ["ПИТ"]="Питкэрн", ["ПЛС"]="Палестина", ["ПОЛ"]="Полинезийские Спорады", ["ПРИ"]="Приднестровье",
    ["ПРО"]="Прованс", ["ПУЭ"]="Пуэрто-Рико", ["РАФ"]="Раф-энд-Рэди", ["РЕХ"]="Рехобот",
    ["РЕЦ"]="Реция", ["РЕЮ"]="Реюньон", ["РОД"]="Родос", ["САА"]="Сааремаа",
    ["САБ"]="Саба", ["САМ"]="Самоа", ["САН"]="Сан-Марино", ["САР"]="Сарк",
    ["СБА"]="Сен-Бартельми", ["СВА"]="Свазиленд", ["СВГ"]="Сент-Винсент и Гренадины", ["СЕБ"]="Себорга",
    ["СЕВ"]="Северный Кипр", ["СЕЙ"]="Сейшелы", ["СЕК"]="Секейский Край", ["СЕН"]="Сент-Люсия",
    ["СЕУ"]="Сеута", ["СИЛ"]="Силенд", ["СИН"]="Сингапур", ["СИЦ"]="Сицилия",
    ["СКН"]="Сент-Китс и Невис", ["СМА"]="Сент-Мартен", ["СМЛ"]="Сомалиленд", ["СНА"]="Сан-Андрес",
    ["СНД"]="Синд", ["СОЖ"]="Соже", ["СОЛ"]="Соломоны", ["СОМ"]="Сомали",
    ["СПМ"]="Сен-Пьер и Микелон", ["СРД"]="Сардиния", ["СТП"]="Сан-Томе и Принсипи", ["СУЛ"]="Сулу",
    ["СУР"]="Суринам", ["СЭС"]="Сент-Эстатиус", ["ТАД"]="Таджикистан", ["ТАИ"]="Таити",
    ["ТАМ"]="Тамил-Илам", ["ТАН"]="Танзания", ["ТАС"]="Тасмания", ["ТЕР"]="Теркс и Кайкос",
    ["ТИБ"]="Тибет", ["ТОК"]="Токелау", ["ТОН"]="Тонга", ["ТРИ"]="Тристан-да-Кунья",
    ["ТРС"]="Триест", ["ТУА"]="Туамоту", ["ТУВ"]="Тувалу", ["ТУР"]="Туркмения",
    ["УЖУ"]="Ужупис", ["УОЛ"]="Уоллис и Футуна", ["УЭЙ"]="Уэйк", ["ФВВ"]="Фед. вл. Венесуэлы",
    ["ФЕЛ"]="Фельвидек", ["ФИД"]="Фиджи", ["ФИЛ"]="Филиппины", ["ФОЛ"]="Фолкленд. Острова",
    ["ФРЁ"]="Фрёйа", ["ФРА"]="Французская Полинезия", ["ФРН"]="Франкония", ["ХАТ"]="Хатт-Ривер",
    ["ХЕР"]="Хёрд", ["ХИТ"]="Хитра", ["ХМО"]="Хмонг", ["ХРИ"]="Христиания",
    ["ХУЗ"]="Хузестан", ["ЦАР"]="ЦАР", ["ЦЫГ"]="Цыгане", ["ЧАГ"]="Чагос",
    ["ЧАД"]="Чад", ["ЧАМ"]="Чамерия", ["ЧАТ"]="Чатем", ["ШАН"]="Шан",
    ["ШЕТ"]="Шетландские Острова", ["ШПИ"]="Шпицберген", ["ШРИ"]="Шри-Ланка", ["ЭКВ"]="Экв. Гвинея",
    ["ЭРИ"]="Эритрея", ["ЭФИ"]="Эфиопия", ["ЮГЕ"]="Южная Георгия", ["ЮЖН"]="Южный Судан",
    ["ЮЙМ"]="Южный Йемен", ["ЮКА"]="Южное Касаи", ["ЮКМ"]="Южный Камерун", ["ЮКО"]="Южное Конго",
    ["ЮОС"]="Южная Осетия", ["ЮТИ"]="Южный Тироль", ["ЯМА"]="Ян-Майен"
}

-- ФУНКЦИЯ: Сводная таблица за всю историю
function p.all_time_table(frame)
    local stats = {}

    -- 1. СБОР И АНАЛИЗ ДАННЫХ
    for year, stages in pairs(matchData) do
        for stageName, matches in pairs(stages) do
            for _, match in ipairs(matches) do
                -- Создаем профиль команды, если её еще нет
                if not stats[match.t1] then stats[match.t1] = {code=match.t1, P=0, W=0, Wet=0, D=0, Let=0, L=0, GF=0, GA=0} end
                if not stats[match.t2] then stats[match.t2] = {code=match.t2, P=0, W=0, Wet=0, D=0, Let=0, L=0, GF=0, GA=0} end

                local t1 = stats[match.t1]
                local t2 = stats[match.t2]

                -- Записываем матч и голы (пенальти в разницу мячей не идут)
                t1.P = t1.P + 1; t2.P = t2.P + 1
                t1.GF = t1.GF + match.s1; t1.GA = t1.GA + match.s2
                t2.GF = t2.GF + match.s2; t2.GA = t2.GA + match.s1

                -- Логика распределения побед/поражений/очков
                if match.p1 and match.p2 then
                    -- Были пенальти
                    if match.p1 > match.p2 then t1.Wet = t1.Wet + 1; t2.Let = t2.Let + 1
                    else t2.Wet = t2.Wet + 1; t1.Let = t1.Let + 1 end
                elseif match.et then
                    -- Был экстра-тайм
                    if match.s1 > match.s2 then t1.Wet = t1.Wet + 1; t2.Let = t2.Let + 1
                    else t2.Wet = t2.Wet + 1; t1.Let = t1.Let + 1 end
                else
                    -- Основное время
                    if match.s1 > match.s2 then t1.W = t1.W + 1; t2.L = t2.L + 1
                    elseif match.s2 > match.s1 then t2.W = t2.W + 1; t1.L = t1.L + 1
                    else t1.D = t1.D + 1; t2.D = t2.D + 1 end
                end
            end
        end
    end

    -- 2. ПОДСЧЕТ ОЧКОВ И ПОДГОТОВКА К СОРТИРОВКЕ
    local arr = {}
    for code, t in pairs(stats) do
        -- Формула: В*3 + ВО*2 + Н*1 + ПО*1
        t.Pts = (t.W * 3) + (t.Wet * 2) + (t.D * 1) + (t.Let * 1)
        t.name = codeToName[code] or code
        table.insert(arr, t)
    end

    -- 3. АЛГОРИТМ СОРТИРОВКИ (Иерархия правил ЧТМ)
    table.sort(arr, function(a, b)
        if a.Pts ~= b.Pts then return a.Pts > b.Pts end -- 1. Очки
        local aGD, bGD = a.GF - a.GA, b.GF - b.GA
        if aGD ~= bGD then return aGD > bGD end         -- 2. Разница мячей
        if a.GF ~= b.GF then return a.GF > b.GF end     -- 3. Забитые голы
        local aTW, bTW = a.W + a.Wet, b.W + b.Wet
        if aTW ~= bTW then return aTW > bTW end         -- 4. Все победы (В + ВО)
        if a.W ~= b.W then return a.W > b.W end         -- 5. Чистые победы (В)
        return a.name < b.name                          -- 6. По алфавиту
    end)

    -- 4. ОТРИСОВКА ТАБЛИЦЫ
    local result = {}
    
    -- Шапка таблицы
    table.insert(result, frame:preprocess('{{Т|ПШТ=да|С=да}}'))
    table.insert(result, '|-')
    table.insert(result, '! scope="col" style="background-color:#ebf3fe;"|')
    table.insert(result, '! scope="col" style="background-color:#ebf3fe;"|')
    table.insert(result, '! scope="col" style="background-color:#ebf3fe;"|')
    table.insert(result, '! scope="col" style="background-color:#ebf3fe;"|<abbr title="игры">И</abbr>')
    table.insert(result, '! scope="col" style="background-color:#ebf3fe;"|<abbr title="выигрыши (3 очка)">В</abbr>')
    table.insert(result, '! scope="col" style="background-color:#ebf3fe;"|<abbr title="выигрыши в дополнительное время или по пенальти (2 очка)">ВО</abbr>')
    table.insert(result, '! scope="col" style="background-color:#ebf3fe;"|<abbr title="ничьи (1 очко)">Н</abbr>')
    table.insert(result, '! scope="col" style="background-color:#ebf3fe;"|<abbr title="поражения в дополнительное время или по пенальти (1 очко)">ПО</abbr>')
    table.insert(result, '! scope="col" style="background-color:#ebf3fe;"|<abbr title="поражения (0 очков)">П</abbr>')
    table.insert(result, '! scope="col" style="background-color:#ebf3fe;"|<abbr title="забитые и пропущенные мячи">М</abbr>')
    table.insert(result, '! scope="col" style="background-color:#ebf3fe;"|<abbr title="очки">О</abbr>')

    -- Строки команд
    for i, t in ipairs(arr) do
        table.insert(result, '|-')
        -- Место
        table.insert(result, '| style="white-space:nowrap;text-align:center;" | ' .. i)
        -- Флаг
        table.insert(result, '| style="white-space:nowrap;text-align:center;" | [[Файл:' .. t.name .. '.jpg|30x60px]]')
        -- Название
        table.insert(result, '| style="white-space:nowrap;text-align:center;" | [[' .. t.name .. ']]')
        -- Статистика (И, В, ВО, Н, ПО, П)
        table.insert(result, '| style="white-space:nowrap;text-align:center;" | ' .. t.P)
        table.insert(result, '| style="white-space:nowrap;text-align:center;" | ' .. t.W)
        table.insert(result, '| style="white-space:nowrap;text-align:center;" | ' .. t.Wet)
        table.insert(result, '| style="white-space:nowrap;text-align:center;" | ' .. t.D)
        table.insert(result, '| style="white-space:nowrap;text-align:center;" | ' .. t.Let)
        table.insert(result, '| style="white-space:nowrap;text-align:center;" | ' .. t.L)
        -- Мячи
        table.insert(result, '| style="white-space:nowrap;text-align:center;" | ' .. t.GF .. '-' .. t.GA)
        -- Очки
        table.insert(result, '| style="white-space:nowrap;text-align:center;" | ' .. t.Pts)
    end

    table.insert(result, '|}')
    return table.concat(result, "\n")
end

-- ФУНКЦИЯ: Поиск крупнейшей победы/поражения
function p.biggest_result(frame)
    local input = frame.args[1] or frame:getParent().args[1]
    local resultType = frame.args[2] or frame:getParent().args[2]
    
    if not input or input == "" or not resultType or resultType == "" then return "—" end

    local teamCode = nameToCode[input] or input
    
    local max_diff = -1
    local record_matches = {}
    local team_has_played = false -- <<-- 1. ДОБАВЛЕН ФЛАГ

    -- Вспомогательная функция для красивого сокращения стадий
    local function formatStage(stageName)
        if string.find(stageName, "Группа") then return "гр."
        elseif stageName == "3 место" then return "3-е место"
        else return stageName end
    end

    -- 1. ПРОХОДИМ ПО ВСЕЙ БАЗЕ ДАННЫХ
    for year, stages in pairs(matchData) do
        for stageName, matches in pairs(stages) do
            for _, match in ipairs(matches) do
                local current_diff = 0
                local is_relevant = false

                if match.t1 == teamCode then
                    current_diff = match.s1 - match.s2
                    is_relevant = true
                elseif match.t2 == teamCode then
                    current_diff = match.s2 - match.s1
                    is_relevant = true
                end

                if is_relevant then
                    team_has_played = true -- <<-- 2. УСТАНАВЛИВАЕМ ФЛАГ, ЕСЛИ КОМАНДА СЫГРАЛА ХОТЯ БЫ ОДИН МАТЧ

                    -- Проверяем, подходит ли матч под наш запрос (победа или поражение)
                    local type_match = false
                    if (resultType == "Победа" and current_diff > 0) or (resultType == "Поражение" and current_diff < 0) then
                        type_match = true
                    end
                    
                    if type_match then
                        local abs_diff = math.abs(current_diff)
                        
                        if abs_diff > max_diff then
                            -- Нашли новый рекорд!
                            max_diff = abs_diff
                            record_matches = { {year=year, stage=stageName, data=match} }
                        elseif abs_diff == max_diff then
                            -- Такой же рекорд, добавляем в список
                            table.insert(record_matches, {year=year, stage=stageName, data=match})
                        end
                    end
                end
            end
        end
    end

    -- <<-- 3. ИЗМЕНЕН БЛОК ПРОВЕРКИ
    if #record_matches == 0 then
        if team_has_played then
            return "—" -- Команда играла, но подходящих результатов (побед/поражений) не найдено
        else
            return "" -- Команда вообще не играла в финальных турнирах
        end
    end

    -- 2. СОРТИРУЕМ РЕЗУЛЬТАТЫ ХРОНОЛОГИЧЕСКИ
    table.sort(record_matches, function(a, b)
        if a.year ~= b.year then return a.year < b.year end
        return a.data.number < b.data.number
    end)

    -- 3. ФОРМАТИРУЕМ ВЫВОД
    local output = {}
    for _, item in ipairs(record_matches) do
        local opponent_code, score_str
        if item.data.t1 == teamCode then
            opponent_code = item.data.t2
            score_str = item.data.s1 .. ":" .. item.data.s2
        else
            opponent_code = item.data.t1
            score_str = item.data.s2 .. ":" .. item.data.s1
        end
        
        local opponent_name = codeToName[opponent_code] or opponent_code
        local year_short = string.sub(tostring(item.year), 3, 4)
        local stage_short = formatStage(item.stage)

        table.insert(output, string.format("[[%s]] — %s (%s, %s)", opponent_name, score_str, year_short, stage_short))
    end
    
    return table.concat(output, "<br>")
end

return p