Promiedos-Simulator

Simulador de partidos de Promiedos.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         Promiedos-Simulator
// @namespace    http://tampermonkey.net/
// @version      2.1
// @description  Simulador de partidos de Promiedos.
// @author       Duszafir
// @match        https://www.promiedos.com.ar/league/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=promiedos.com.ar
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';
    let zonasInfo, id, key,data, equipos, fechasInfo, bloque;
    const avisoKey = 'avisoSimuladorVisto';
    if (!localStorage.getItem(avisoKey)) {
        mostrarAviso();
    }

    function mostrarAviso() {
        const modal = document.createElement('div');
        modal.style.position = 'fixed';
        modal.style.top = 0;
        modal.style.left = 0;
        modal.style.width = '100%';
        modal.style.height = '100%';
        modal.style.background = 'rgba(0,0,0,0.5)';
        modal.style.display = 'flex';
        modal.style.justifyContent = 'center';
        modal.style.alignItems = 'center';
        modal.style.zIndex = 9999;

        const box = document.createElement('div');
        box.style.background = '#237714';
        box.style.padding = '20px';
        box.style.borderRadius = '8px';
        box.style.textAlign = 'center';
        box.style.maxWidth = '300px';

        box.innerHTML = `
            <p>Espera a que carguen todas las fechas para poder simular.</p>
        `;

        const checkContainer = document.createElement('label');
        checkContainer.style.display = 'flex';
        checkContainer.style.alignItems = 'center';
        checkContainer.style.justifyContent = 'center';
        checkContainer.style.marginTop = '10px';
        checkContainer.style.color = '#fff';
        checkContainer.style.cursor = 'pointer';

        const check = document.createElement('input');
        check.type = 'checkbox';
        check.style.marginRight = '8px';

        checkContainer.appendChild(check);
        checkContainer.appendChild(document.createTextNode('No volver a mostrar'));

        const btn = document.createElement('button');
        btn.textContent = 'Entendido';
        btn.style.padding = '6px 12px';
        btn.style.border = 'none';
        btn.style.borderRadius = '6px';
        btn.style.background = '#0f481c';
        btn.style.color = '#fff';
        btn.style.cursor = 'pointer';
        btn.style.marginTop = '10px';

        btn.addEventListener('mouseenter', () => {
            btn.style.background = '#0c3a16';
        });
        btn.addEventListener('mouseleave', () => {
            btn.style.background = '#0f481c';
        });

        btn.addEventListener('click', () => {
            if (check.checked) {
                localStorage.setItem(avisoKey, 'true');
            }
            document.body.removeChild(modal);
        });

        box.appendChild(checkContainer);
        box.appendChild(btn);
        modal.appendChild(box);
        document.body.appendChild(modal);
    }

    async function cargarDatos(el) {
        data = JSON.parse(el.textContent);

        id = data.props.pageProps.data.league.id;
        const filters = data.props.pageProps.data.games?.filters;
        zonasInfo = data.props.pageProps.data.tables_groups;

        if (!filters || !filters[1] || !filters[1].key || !zonasInfo || zonasInfo.length == 0) {
            console.error("No se pudo obtener la key de las fechas");
            console.log("Filters recibidos:", filters);
            alert("No se puede simular.")
            return;
        }
        key = filters[1].key;
        equipos = crearEquipos();
        fechasInfo = await verFechas(filters);
    }

    function crearEquipos() {
        let grupos = [];
        for (let group of zonasInfo) {
            let grupo = {
                nombre: group.name,
                zonas: []
            };

            for (let table of group.tables) {
                let zona = {
                    nombre: table.name,
                    equipos: []
                };

                for (let row of table.table.rows) {

                    let perdidos = parseInt(row.values[6]?.value);
                    if (isNaN(perdidos)) perdidos = 0;

                    let equipo = {
                        nombre: row.entity.object.name,
                        shortName: row.entity.object.short_name,
                        partidos: parseInt(row.values[0].value),
                        goles: parseInt(row.values[1].value),
                        difGoles: parseInt(row.values[2].value),
                        puntos: parseInt(row.values[3].value),
                        ganados: parseInt(row.values[4].value),
                        empates: parseInt(row.values[5].value),
                        perdidos: perdidos,
                        positionOriginal: row.num
                    };
                    if (zona.nombre.includes("Promedios") || zona.nombre.includes("Relegation")) {
                        equipo.puntos = parseInt(row.values[0].value);
                        equipo.partidos = parseInt(row.values[1].value);

                        let v3 = parseInt(row.values[3].value);
                        let v4 = parseInt(row.values[4].value);
                        let v5 = parseInt(row.values[5].value);
                        const cols = table.table.columns.map(c => parseInt(c.title)).filter(n => !isNaN(n));
                        const invertido = cols.length >= 2 && cols[0] > cols[cols.length - 1];

                        equipo.x1 = invertido ? v5 : v3;
                        equipo.x2 = v4;
                        equipo.x3 = invertido ? v3 : v5;
                        equipo.invertido = invertido;

                        equipo.promedio = equipo.partidos > 0
                            ? (equipo.puntos / equipo.partidos).toFixed(3)
                            : 0;

                        delete equipo.goles;
                        delete equipo.difGoles;
                        delete equipo.ganados;
                        delete equipo.empates;
                        delete equipo.perdidos;
                    } else if (zona.nombre.includes("Anual")) {
                        equipo.nombre = row.entity.object.name;
                        equipo.shortName = row.entity.object.short_name;
                        equipo.partidos = parseInt(row.values[0].value);
                        equipo.goles = parseInt(row.values[1].value);
                        equipo.difGoles = parseInt(row.values[2].value);
                        equipo.puntos = parseInt(row.values[3].value);
                        equipo.ganados = parseInt(row.values[4].value);
                        equipo.empates = parseInt(row.values[5].value);
                        equipo.perdidos = perdidos;
                        equipo.positionOriginal = row.num;
                    }
                    zona.equipos.push(equipo);
                }
                grupo.zonas.push(zona);
            }
            grupos.push(grupo);
        }
        return grupos;
    }

    function buscarEquipo(nombreEquipo, tabla) {
        for (let z = 0; z < equipos[tabla].zonas.length; z++) {
            for (let eq of equipos[tabla].zonas[z].equipos) {
                if (eq.nombre === nombreEquipo || eq.shortName === nombreEquipo) {
                    return {
                        equipo: eq,
                        indiceZona: z,
                        indiceTabla: tabla
                    };
                }
            }
        }
        return null;
    }

    function filterEsDeFechas(filter) {return /fecha/i.test(filter.name);}

    async function verFechas(filters) {
        let fechasInfo = [];
        let tabla = 0;
        const basesProbadas = new Set();

        for (let f of filters) {
            if (!filterEsDeFechas(f)) continue;

            const base = f.key.replace(/_\d+$/, "");

            if (basesProbadas.has(base)) continue;
            basesProbadas.add(base);

            let fechas = [];
            let n = 1;

            while (n <= 45) {
                const keyActual = `${base}_${n}`;
                const url = `https://api.promiedos.com.ar/league/games/${id}/${keyActual}`;

                try {
                    const res = await fetch(url);
                    if (!res.ok) break;

                    const data = await res.json();
                    if (!data.games || data.games.length === 0) break;

                    fechas.push({
                        fecha: n,
                        tabla: tabla,
                        base: base,
                        partidos: data.games.map(p => ({
                            id: p.id,
                            teamA: p.teams[0],
                            teamB: p.teams[1],
                            winner: p.winner,
                            scores: p.scores,
                            alreadyPlayed: "scores" in p
                        }))
                    });

                    n++;
                } catch {
                    break;
                }
            }

            if (fechas.length > 0) {
                fechasInfo.push(...fechas);
                tabla++;
            }
        }

        if (fechasInfo.length === 0) {
            alert("No se encontraron fechas disponibles para simular.");
        }
        return fechasInfo;
    }

    function calc(equipoA, equipoB, num1, num2, partidoEncontrado) {
        if (num1 > num2) {
            completarDatos(equipoA, "w", num1, num2);
            completarDatos(equipoB, "l", num2, num1);
            partidoEncontrado.winner = 1;

            if ("x3" in equipoA) equipoA.x3 += 3;

        } else if (num1 < num2) {
            completarDatos(equipoA, "l", num1, num2);
            completarDatos(equipoB, "w", num2, num1);
            partidoEncontrado.winner = 2;

            if ("x3" in equipoB) equipoB.x3 += 3;

        } else {
            completarDatos(equipoA, "t", num1, num2);
            completarDatos(equipoB, "t", num2, num1);
            partidoEncontrado.winner = 0;

            if ("x3" in equipoA) equipoA.x3 += 1;
            if ("x3" in equipoB) equipoB.x3 += 1;
        }

        if ("promedio" in equipoA) {
            equipoA.promedio = equipoA.partidos > 0
                ? +(equipoA.puntos / equipoA.partidos).toFixed(3)
                : 0;
        }

        if ("promedio" in equipoB) {
            equipoB.promedio = equipoB.partidos > 0
                ? +(equipoB.puntos / equipoB.partidos).toFixed(3)
                : 0;
        }
    }

    window.simular = function (idFecha, num1, num2, tabla) {
        if (isNaN(num1) || isNaN(num2) || num1 < 0 || num2 < 0) {
            console.log("Pusiste mal los numeros");
            return;
        }
        let partidoEncontrado = null;

        for (let f of fechasInfo) {
            for (let p of f.partidos) {
                if (p.id === idFecha) {
                    partidoEncontrado = p;
                    break;
                }
            }
            if (partidoEncontrado) break;
        }

        if (!partidoEncontrado) {
            console.log("Ese partido no existe");
            return;
        }

        const resA = buscarEquipo(partidoEncontrado.teamA.name, tabla);
        const resB = buscarEquipo(partidoEncontrado.teamB.name, tabla);

        if (!resA || !resB) {
            console.log("No se encontraron los equipos");
            return;
        }

        const equipoA = resA.equipo;
        const equipoB = resB.equipo;

        const resultadoActual = obtenerResultadoActual(partidoEncontrado);
        if (resultadoActual) {
            revertirPartido(equipoA, equipoB, resultadoActual);
        }

        partidoEncontrado.prev = {
            golesA: num1,
            golesB: num2
        };
        calc(equipoA,equipoB,num1,num2,partidoEncontrado);

        partidoEncontrado.alreadyPlayed = true;
        const zonasActualizar = new Set([resA.indiceZona, resB.indiceZona]);
        zonasActualizar.forEach(indiceZona => ordenarTablas(indiceZona, tabla));

        const tablaAnual = obtenerTablaAnual();
        if (tablaAnual) {
            const equipoAAnual = buscarEquipo(equipoA.nombre, tablaAnual.tablaIndice)?.equipo;
            const equipoBAnual = buscarEquipo(equipoB.nombre, tablaAnual.tablaIndice)?.equipo;
            calc(equipoAAnual,equipoBAnual,num1,num2,partidoEncontrado);
            ordenarTablas(tablaAnual.zonaIndice, tablaAnual.tablaIndice);
        }

        const tablaRelegation = obtenerTablaRelegation();
        if (tablaRelegation) {
            const equipoARelegation = buscarEquipo(equipoA.nombre, tablaRelegation.tablaIndice)?.equipo;
            const equipoBRelegation = buscarEquipo(equipoB.nombre, tablaRelegation.tablaIndice)?.equipo;

            if (equipoARelegation && equipoBRelegation) {
                calc(equipoARelegation, equipoBRelegation, num1, num2, partidoEncontrado);

                recalcularPromedio(equipoARelegation);
                recalcularPromedio(equipoBRelegation);
            }
            ordenarTablas(tablaRelegation.zonaIndice, tablaRelegation.tablaIndice);
        }
    }

    function obtenerTablaAnual() {
        for (let t = 0; t < equipos.length; t++) {
            for (let z = 0; z < equipos[t].zonas.length; z++) {
                const zona = equipos[t].zonas[z];
                if (zona.nombre.includes("Tabla Anual")) {
                    return {
                        tablaIndice: t,
                        zonaIndice: z,
                        zona: zona
                    };
                }
            }
        }
        return null;
    }

    function obtenerTablaRelegation() {
        for (let t = 0; t < equipos.length; t++) {
            for (let z = 0; z < equipos[t].zonas.length; z++) {
                const zona = equipos[t].zonas[z];
                if (zona.nombre.includes("Promedios") || zona.nombre.includes("Relegation")) {
                    return {
                        tablaIndice: t,
                        zonaIndice: z,
                        zona: zona
                    };
                }
            }
        }
        return null;
    }

    function recalcularPromedio(eq) {
        if (eq.partidos > 0) {
            eq.promedio = (eq.puntos / eq.partidos).toFixed(3);
        } else {
            eq.promedio = 0;
        }
    }

    function ordenarTablas(indiceZona, tabla) {
        const tablaContainer = document.querySelector('div[class^=page-layout_dashboard__layout_left__]');
        const zonaContainer = tablaContainer.children[tabla];
        if (!zonaContainer) return;

        let indiceDom = indiceZona;
        if (zonaContainer.firstElementChild.tagName !== "DIV") {
            indiceDom += 1;
        }

        const tablas = zonaContainer.children[indiceDom].querySelector("tbody");
        if (!tablas) return;

        const filasOriginales = Array.from(tablas.children).map(f => ({
            fila: f,
            color: f.children[0].style.backgroundColor
        }));

        const zona = equipos[tabla].zonas[indiceZona];
        if (!zona) return;

        const esRelegation =
            zona.nombre.includes("Promedios") ||
            zona.nombre.includes("Relegation");

        if (!esRelegation) {
            zona.equipos.sort((a, b) => {
                if (b.puntos !== a.puntos) return b.puntos - a.puntos;
                if (b.difGoles !== a.difGoles) return b.difGoles - a.difGoles;
                if (b.goles !== a.goles) return b.goles - a.goles;
                return a.nombre.localeCompare(b.nombre);
            });
        } else {
            zona.equipos.sort((a, b) => {
                if (b.promedio !== a.promedio) return b.promedio - a.promedio;
                if (b.puntos !== a.puntos) return b.puntos - a.puntos;
                if (b.partidos !== a.partidos) return b.partidos - a.partidos;
                return a.nombre.localeCompare(b.nombre);
            });
        }

        borrarTabla(tablas, zona, filasOriginales, esRelegation);
    }

    function borrarTabla(tablas, zona, filasOriginales, esRelegation) {
        tablas.innerHTML = "";
        let posicion = 1;

        for (let eq of zona.equipos) {
            const filaData = filasOriginales.find(f => {
                const nombre = f.fila.children[1].children[0].children[1].textContent.trim();
                return nombre === eq.shortName || nombre === eq.nombre;
            });
            if (!filaData) continue;

            const fila = filaData.fila;

            const colorPosicion = filasOriginales[posicion - 1]?.color || "";
            fila.children[0].style.backgroundColor = colorPosicion;
            fila.children[0].children[0].textContent = posicion;

            if (fila.children[1].children[0].children.length === 3) {
                const partido = fechasInfo
                    .flatMap(f => f.partidos)
                    .find(p => p.prev && (p.teamA.name === eq.nombre || p.teamB.name === eq.nombre));

                if (partido) {
                    fila.children[1].children[0].children[2].textContent =
                        `${partido.prev.golesA}-${partido.prev.golesB}`;

                    let colorBG = "#ffc61a";
                    if (eq.nombre === partido.teamA.name) {
                        if (partido.prev.golesA > partido.prev.golesB) colorBG = "#6faa54";
                        else if (partido.prev.golesA < partido.prev.golesB) colorBG = "#ff4848";
                    } else {
                        if (partido.prev.golesB > partido.prev.golesA) colorBG = "#6faa54";
                        else if (partido.prev.golesB < partido.prev.golesA) colorBG = "#ff4848";
                    }

                    fila.children[1].children[0].children[2].style.backgroundColor = colorBG;
                }
            }

            if (!esRelegation) {
                const eqDifGol = eq.goles - eq.difGoles;
                fila.children[2].textContent = eq.puntos;
                fila.children[3].textContent = eq.partidos;
                fila.children[4].textContent = `${eq.goles}:${eqDifGol}`;
                fila.children[5].textContent = eq.difGoles;
                fila.children[6].textContent = eq.ganados;
                fila.children[7].textContent = eq.empates;
                fila.children[8].textContent = eq.perdidos;
            } else {
                    fila.children[2].textContent = eq.promedio;
                    fila.children[3].textContent = eq.puntos;
                    fila.children[4].textContent = eq.partidos;
                if (!eq.invertido) {
                    fila.children[5].textContent = eq.x1;
                    fila.children[6].textContent = eq.x2;
                    fila.children[7].textContent = eq.x3;
                } else {
                    fila.children[7].textContent = eq.x1;
                    fila.children[6].textContent = eq.x2;
                    fila.children[5].textContent = eq.x3;
                }
            }

            tablas.appendChild(fila);
            posicion++;
        }
    }

    function obtenerResultadoActual(partido) {
        if (partido.prev) {
            return partido.prev;
        }

        if (partido.alreadyPlayed && partido.scores) {
            return {
                golesA: partido.scores[0],
                golesB: partido.scores[1]
            };
        }

        return null;
    }

    function revertirPartido(eA, eB, prev) {
        revertirDatosEquipo(eA, eB, prev);

        const tablaAnual = obtenerTablaAnual();
        if (tablaAnual) {
            const eAAnual = buscarEquipo(eA.nombre, tablaAnual.tablaIndice)?.equipo;
            const eBAnual = buscarEquipo(eB.nombre, tablaAnual.tablaIndice)?.equipo;
            if (eAAnual && eBAnual) {
                revertirDatosEquipo(eAAnual, eBAnual, prev);
            }
        }
        const tablaRelegation = obtenerTablaRelegation();
        if (tablaRelegation) {
            const eAR = buscarEquipo(eA.nombre, tablaRelegation.tablaIndice)?.equipo;
            const eBR = buscarEquipo(eB.nombre, tablaRelegation.tablaIndice)?.equipo;

            if (eAR && eBR) {
                if (prev.golesA > prev.golesB) {
                    eAR.x3 -= 3;
                } else if (prev.golesA < prev.golesB) {
                    eBR.x3 -= 3;
                } else {
                    eAR.x3 -= 1;
                    eBR.x3 -= 1;
                }

                eAR.partidos--;
                eBR.partidos--;
                eAR.puntos -= prev.golesA > prev.golesB ? 3 : prev.golesA < prev.golesB ? 0 : 1;
                eBR.puntos -= prev.golesB > prev.golesA ? 3 : prev.golesB < prev.golesA ? 0 : 1;

                recalcularPromedio(eAR);
                recalcularPromedio(eBR);
            }
        }
    }

    function revertirDatosEquipo(eA, eB, prev) {
        eA.partidos--;
        eB.partidos--;

        eA.goles -= prev.golesA;
        eB.goles -= prev.golesB;

        eA.difGoles -= (prev.golesA - prev.golesB);
        eB.difGoles -= (prev.golesB - prev.golesA);

        if (prev.golesA > prev.golesB) {
            eA.puntos -= 3;
            eA.ganados--;
            eB.perdidos--;
        } else if (prev.golesA < prev.golesB) {
            eB.puntos -= 3;
            eB.ganados--;
            eA.perdidos--;
        } else {
            eA.puntos--;
            eB.puntos--;
            eA.empates--;
            eB.empates--;
        }
    }

    function completarDatos(equipo, resul, goles, golesE) {
        equipo.partidos++;
        equipo.goles += goles;
        equipo.difGoles += goles - golesE;

        if (resul === "w") {
            equipo.puntos += 3;
            equipo.ganados++;
        } else if (resul === "l") {
            equipo.perdidos++;
        } else {
            equipo.puntos++;
            equipo.empates++;
        }
    }

    window.onload = () => {
        const resulContainer = document.querySelector(".item-event__content");
        const btnCol = document.createElement("div");
        const fechaActual = getFechaActual();
        if (!resulContainer || !fechaActual) return;
        layout();
    }

    function getFechaActual() {
        const filtersS = data.props.pageProps.data.games?.filters;
        if (!filtersS) return null;

        const selectedFilter = filtersS.find(f => f.selected);
        return selectedFilter || null;
    }

    function layout() {
        const mainBlock = document.querySelector('div[class^=page-layout_dashboard__layout_right__]')
        const mainBlockL = document.querySelector('div[class^=page-layout_dashboard__layout_left__]')
        const theMainBlock = document.querySelector('div[class^=main-block__container]')
        mainBlock.style.width = "100%"
        mainBlockL.style.width = "100%"
        theMainBlock.style.maxWidth = "1400px"
    }

    function crearBloque(resulContainer, btnCol) {
        const block = resulContainer.parentElement.parentElement.parentElement;
        bloque = document.createElement("div");
        bloque.className = "bloque";
        bloque.style.display = "grid";
        bloque.style.gridTemplateColumns = "1fr auto";
        bloque.style.columnGap = "6px";
        bloque.style.width = "410px"
        ajustarBloque(bloque)

        block.parentNode.insertBefore(bloque, block);
        bloque.appendChild(block);

        btnCol.style.display = "flex";
        btnCol.style.flexDirection = "column";
        btnCol.style.gap = "2px";

        const offsetTop =
            resulContainer.getBoundingClientRect().top -
            block.getBoundingClientRect().top;

        btnCol.style.marginTop = `${offsetTop}px`;

        bloque.appendChild(btnCol);
    }

    function crearBotones(resulContainer, btnCol, fechaActual, tabla) {
        let resul;
        const links = resulContainer.querySelectorAll("a");

        links.forEach((a, i) => {
            const partido = fechaActual[i];
            if (!partido) return;

            let num1 = null;
            let num2 = null;

            const btn = document.createElement("button");
            btn.className = "simulador-btn";
            btn.textContent = "Simular";

            btn.style.padding = "2px 6px";
            btn.style.borderRadius = "6px";
            btn.style.border = "none";
            btn.style.background = "#17712c";
            btn.style.color = "#fff";
            btn.style.cursor = "pointer";
            btn.style.height = "36.81px";

            btn.addEventListener("mouseenter", () => btn.style.background = "#11501f");
            btn.addEventListener("mouseleave", () => btn.style.background = "#17712c");

            btn.dataset.partidoId = partido.id;
            btn.dataset.tabla = tabla;
            btnCol.appendChild(btn);

            if (a.children.length == 2) {
                a.children[1].children[0].style.height = "38px";
                a.style.height = "63px";
                btn.style.marginTop = "24px";
                resul = a.children[1].children[1].children[0].children[1];
            } else if (a.children.length == 1) {5
                a.children[0].children[0].style.height = "38px";
                a.style.height = "38.81px";
                resul = a.children[0].children[1].children[0].children[1];
            }

            a.addEventListener("click", e => e.preventDefault());

            if (resul.children.length == 1) {
                num1 = resul.children[0].children[0].children[1];
                num2 = resul.children[0].children[2].children[0];

                num1.setAttribute("contenteditable", "true");
                num2.setAttribute("contenteditable", "true");

                limitarAUnDigito(num1);
                limitarAUnDigito(num2);
            } else {
                const nums = crearResul(resul);
                num1 = nums.num1;
                num2 = nums.num2;
            }


            btn.addEventListener("click", () => {
                if (!num1 || !num2) return;
                if (num1.textContent === "+" || num2.textContent === "+") return;

                simular(
                    String(btn.dataset.partidoId),
                    Number(num1.textContent),
                    Number(num2.textContent),
                    Number(btn.dataset.tabla)
                );
            });
        });
    }

    function crearResul(resul) {
        if (resul.dataset.simuladorInicializado === "true") {
            return {
                num1: resul.querySelector(".sim-num1"),
                num2: resul.querySelector(".sim-num2")
            };
        }

        resul.dataset.simuladorInicializado = "true";
        while (resul.firstChild) {
            resul.removeChild(resul.firstChild);
        }

        const resultBlock = document.createElement("div");
        resultBlock.style.color = "white";
        resultBlock.style.display = "flex";
        resultBlock.style.alignItems = "center";
        resultBlock.style.gap = "4px";
        resultBlock.style.fontSize = "18px";

        const num1Container = document.createElement("div");

        const num1Margin = document.createElement("div");
        num1Margin.style.marginRight = "3px";

        const num1 = document.createElement("span");
        num1.textContent = "+";
        num1.setAttribute("contenteditable", "true");
        limitarAUnDigito(num1);

        num1Container.appendChild(num1Margin);
        num1Container.appendChild(num1);

        const dash = document.createElement("div");
        dash.textContent = "-";
        dash.style.padding = "0 2px";
        dash.style.textAlign = "center";
        dash.style.fontSize = "28px";
        dash.style.fontWeight = "700";

        const num2Container = document.createElement("div");

        const num2Margin = document.createElement("div");
        num2Margin.style.marginRight = "3px";

        const num2 = document.createElement("span");
        num2.textContent = "+";
        num2.setAttribute("contenteditable", "true");
        limitarAUnDigito(num2);

        num2Container.appendChild(num2Margin);
        num2Container.appendChild(num2);

        resultBlock.appendChild(num1Container);
        resultBlock.appendChild(dash);
        resultBlock.appendChild(num2Container);

        resul.appendChild(resultBlock);
        return { num1, num2 };
    }

    function eliminarBotones() {
        document.querySelectorAll(".simulador-btn").forEach(btn => btn.remove());

        if (bloque && bloque.parentNode) {
            while (bloque.firstChild) {
                const child = bloque.firstChild;
                if (child.classList && child.classList.contains("btnCol")) {
                    child.remove();
                } else {
                    bloque.parentNode.insertBefore(child, bloque);
                }
            }

            bloque.parentNode.removeChild(bloque);
            bloque = null;
        }
    }

    let ultimaBaseUsada = null;
    function interceptarFetch() {
        const _fetch = window.fetch;
        window.fetch = async (...args) => {
            const res = await _fetch(...args);
            try {
                const url = args[0];
                if (typeof url === "string" && url.includes("/league/games/")) {
                    const key = url.split("/").pop();
                    ultimaBaseUsada = key.replace(/_\d+$/, "");
                }
            } catch {}
            return res;
        };
    }

    let ultimaClave = null;
    let primeraVez = true;
    let fechaRenderizada = null;
    setInterval(() => {
        const resulContainer = document.querySelector(".item-event__content");
        if (!resulContainer || !fechasInfo || fechasInfo.length === 0) return;

        let fechaCorrecta = null;

        if (primeraVez) {
            const filtro = getFechaActual();
            if (!filtro) return;

            const baseSeleccionada = filtro.key.replace(/_\d+$/, "");
            const numeroFecha = parseInt(filtro.name.match(/\d+/)[0]);

            fechaCorrecta = fechasInfo.find(f => f.fecha === numeroFecha && f.base === baseSeleccionada);
            if (!fechaCorrecta) return;

            primeraVez = false;
        } else {
            const menuFechas = document.querySelector("div[class*='select-trigger_selectTop__']");
            if (!menuFechas || !menuFechas.children[1]) return;

            const fechaVisible = menuFechas.children[1].firstChild;
            if (!fechaVisible) return;

            const textoActual = fechaVisible.textContent.trim();
            const match = textoActual.match(/\d+/);
            if (!match) return;

            const numeroFecha = parseInt(match[0]);
            const baseEnUso = ultimaBaseUsada;
            if (!baseEnUso) return;

            const claveActual = `${numeroFecha}-${baseEnUso}`;
            if (claveActual === ultimaClave) return;
            ultimaClave = claveActual;

            fechaCorrecta = fechasInfo.find(
                f => f.fecha === numeroFecha && f.base === baseEnUso
            );
            if (!fechaCorrecta) return;
        }

        const claveRender = `${fechaCorrecta.fecha}-${fechaCorrecta.base}-${fechaCorrecta.tabla}`;
        if (claveRender === fechaRenderizada) return;
        fechaRenderizada = claveRender;

        eliminarBotones();

        const btnCol = document.createElement("div");
        crearBloque(resulContainer, btnCol);

        crearBotones(
            resulContainer,
            btnCol,
            fechaCorrecta.partidos,
            fechaCorrecta.tabla
        );

        interceptarFetch();
    }, 200);

    function limitarAUnDigito(el) {
        if (!el.textContent.trim()) {
            el.textContent = "+";
        }

        el.addEventListener("keydown", e => {
            if (
                e.key === "Backspace" ||
                e.key === "Delete" ||
                e.key === "ArrowLeft" ||
                e.key === "ArrowRight" ||
                e.key === "Tab"
            ) return;

            if (!/^[0-9]$/.test(e.key)) {
                e.preventDefault();
                return;
            }
        });

        el.addEventListener("paste", e => {
            e.preventDefault();
        });

        el.addEventListener("input", () => {
            let val = el.textContent.replace(/[^0-9]/g, "").slice(0, 1);
            el.textContent = val === "" ? "+" : val;
        });
    }

    let lastMode = null;
    let resizeTimeout;
    function ajustarBloque(bloque) {
        const w = window.innerWidth;
        let mode;

        if (w > 1200) mode = "big";
        else if (w > 1040) mode = "mid";
        else mode = "small";

        if (mode === lastMode) return;
        lastMode = mode;

        bloque.style.width =
            mode === "big" ? "410px" :
            mode === "mid" ? "710px" :
            "510px";
    }
    window.addEventListener("resize", () => {
        clearTimeout(resizeTimeout);
        resizeTimeout = setTimeout(() => ajustarBloque(bloque), 100);
    });

    function verDatos() {
        // console.clear();
        console.log("Equipos:", equipos);
        console.log("Fechas Info: ", fechasInfo);
    }
    window.verDatos = verDatos;

    let interval = setInterval(async function () {
        let el = document.getElementById("__NEXT_DATA__");
        if (!el) return;

        clearInterval(interval);
        await cargarDatos(el);
        document.querySelectorAll("iframe").forEach(i => i.remove());
        const iframeObserver = new MutationObserver(mutations => {
            for (const m of mutations) {
                for (const node of m.addedNodes) {
                    if (node.tagName === "IFRAME") {
                        node.remove();
                    } else if (node.querySelectorAll) {
                        node.querySelectorAll("iframe").forEach(i => i.remove());
                    }
                }
            }
        });

        iframeObserver.observe(document.body, {
            childList: true,
            subtree: true
        });
        verDatos();
    }, 100);

})();