/**
 * Detector de uploads grandes para sistemas detras de Cloudflare.
 * Cloudflare Free/Pro bloquea uploads >100MB.
 *
 * Estrategia: cuando detecta archivo >90MB en un dominio Cloudflare,
 * abre una nueva ventana/pestaña en el dominio directo (sin Cloudflare)
 * para que el usuario suba el archivo ahi sin restriccion.
 *
 * Intercepta:
 *   1. input[type=file] change → click en boton "Seleccionar archivo"
 *   2. drop event             → drag-and-drop de archivos
 *   3. XMLHttpRequest.send()  → safety net para cualquier upload XHR
 *
 * Se carga automaticamente en TODAS las paginas (incluido media manager)
 * porque DokuWiki incluye script.js de cada plugin.
 */
(function(){
    // Mapeo de dominios Cloudflare a dominios directos
    var CF_MAP = {
        'sistemavirtualdegestion.com': 'systemsie.site',
        'susprofesionales.com': 'susprofesionales.systemsie.site',
        'gyhcontadores.com': 'gyhcontadores.systemsie.site'
    };

    // Detectar si estamos en un dominio Cloudflare
    var host = window.location.hostname;
    var directDomain = null;
    var cfDomainMatch = null;
    for (var cfDomain in CF_MAP) {
        if (host.indexOf(cfDomain) !== -1) {
            directDomain = host.replace(cfDomain, CF_MAP[cfDomain]);
            cfDomainMatch = cfDomain;
            break;
        }
    }

    // Si no estamos en Cloudflare, no hacer nada
    if (!directDomain) return;

    var MAX_CF = 90 * 1024 * 1024; // 90MB margen de seguridad
    var directBase = window.location.protocol + '//' + directDomain;

    /**
     * Construye la URL directa para la pagina actual
     */
    function getDirectUrl() {
        return directBase + window.location.pathname + window.location.search;
    }

    /**
     * Muestra alerta y abre el dominio directo en nueva pestaña
     * para que el usuario suba el archivo ahi (sin Cloudflare).
     *
     * NO redirige la pestaña actual — abre una nueva para que
     * el usuario no pierda su sesion en el dominio Cloudflare.
     */
    function alertAndOpenDirect(fileName, fileSize) {
        var sizeMB = (fileSize / 1024 / 1024).toFixed(1);
        var directUrl = getDirectUrl();

        var msg = 'El archivo "' + fileName + '" tiene un tamaño de ' + sizeMB + ' MB, ' +
            'superior al limite estandar de carga.\n\n' +
            'Para asegurar una transferencia estable y eficiente, ' +
            'el sistema habilitara automaticamente un canal directo para completar la subida.\n\n' +
            '¿Desea continuar?';

        if (confirm(msg)) {
            window.open(directUrl, '_blank');
        }
    }

    // ─── 1. Interceptar input[type=file] change ─────────────────
    document.addEventListener('change', function(e) {
        if (e.target && e.target.type === 'file') {
            var input = e.target;
            if (!input.files) return;
            for (var i = 0; i < input.files.length; i++) {
                if (input.files[i].size > MAX_CF) {
                    e.preventDefault();
                    e.stopImmediatePropagation();
                    alertAndOpenDirect(input.files[i].name, input.files[i].size);
                    // Limpiar el input para que no intente subir por Cloudflare
                    try { input.value = ''; } catch(ex) {}
                    return;
                }
            }
        }
    }, true); // fase de captura

    // ─── 2. Interceptar drag-and-drop ────────────────────────────
    document.addEventListener('drop', function(e) {
        var files = null;
        try {
            files = e.dataTransfer && e.dataTransfer.files;
        } catch(ex) {
            return;
        }
        if (!files || files.length === 0) return;
        for (var i = 0; i < files.length; i++) {
            if (files[i].size > MAX_CF) {
                e.preventDefault();
                e.stopImmediatePropagation();
                alertAndOpenDirect(files[i].name, files[i].size);
                return;
            }
        }
    }, true); // fase de captura

    // ─── 3. Interceptar XMLHttpRequest.send() (safety net) ──────
    var _origXhrSend = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function(data) {
        // Solo interceptar si es un File o Blob grande
        if (data && typeof data === 'object') {
            var fileSize = 0;
            var fileName = 'archivo';

            if (data instanceof File) {
                fileSize = data.size;
                fileName = data.name;
            } else if (data instanceof Blob) {
                fileSize = data.size;
            } else if (data instanceof FormData) {
                // Revisar archivos dentro del FormData
                try {
                    var entries = data.entries();
                    var entry;
                    while (!(entry = entries.next()).done) {
                        var val = entry.value[1];
                        if (val instanceof File && val.size > MAX_CF) {
                            this.abort();
                            alertAndOpenDirect(val.name, val.size);
                            return;
                        }
                    }
                } catch(ex) {
                    // FormData.entries() no soportado en IE — ignorar
                }
            }

            if (fileSize > MAX_CF) {
                // Abortar el XHR
                this.abort();
                alertAndOpenDirect(fileName, fileSize);
                return; // No enviar
            }
        }
        return _origXhrSend.apply(this, arguments);
    };

})();
