;
(function() {
    // valida suporte do navegador
    if ("fetch" in window === false || Array.prototype.flat === undefined) {
        return false;
    }

    // Porcentagem de usuários que devem ter métricas acompanhadas.
    // De zero a 99 -- o sorteio é feito de 0 a 99.
    const AVG_USERS_OBSERVER = 15;

    // tipos de métricas que devem ser observadas
    const entryTypes = ["measure", "navigation", "mark", "paint"];

    // métricas que foram observadas e estão prontas para serem enviadas
    const measureMap = {};

    // Retorna o nome da central, usando a variável Config ou
    // o subdomínio / primeiro diretório.
    const getCentralName = () => {
        if (window.Config && window.Config.central) {
            return window.Config.central.slug;
        }

        // estação com subdomínio
        if (location.hostname !== "www.uol.com.br") {
            return location.hostname.split(".")[0];
        }

        // estação migrada para dentro de www.uol
        if (location.hostname === "www.uol.com.br" && location.pathname !== "/") {
            return location.pathname.split("/")[1];
        }

        // home do UOL
        if (location.hostname === "www.uol.com.br" && location.pathname === "/") {
            return 'home';
        }

        return '-';
    }

    const getABTestParams = function(qs) {
        qs = qs.split('+').join(' ');

        var params = {},
            tokens,
            re = /[?&]?([^=]+)=([^&]*)/g;

        while (tokens = re.exec(qs)) {
            params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
        }
        if(params && params.abTest) {
            return params.abTest;
        }
        return false;
    }


    const parsePerformanceEntry = function(entry) {
        console.log("[performance observer] parsing entry", entry.entryType, entry);

        switch (entry.entryType) {
            case "mark":
            case "paint":
                // ignora marks com prefixo `_uol-`
                if (/^_uol-/.test(entry.name) === false) {
                    measureMap[entry.name] = entry.startTime.toString();
                }
                break;

            case "measure":
                // usa apenas measures com prefixo `uol`
                if (/^uol-/.test(entry.name) === true) {
                    measureMap[entry.name] = entry.duration.toString();
                }
                break;
            case "navigation":
                [
                    "domComplete",
                    "domInteractive",
                    "encodedBodySize",
                    "domContentLoadedEventStart",
                    "duration",
                    "loadEventStart",
                    "requestStart",
                    "responseStart",
                    "responseEnd",
                ].forEach((name) => {
                    measureMap[`nav-${name}`] = entry[name].toString();
                });

                // trata a métrica e adiciona na fila para ser enviada depois
                // https://developers.google.com/web/fundamentals/performance/navigation-and-resource-timing
                measureMap['nav-requestTime'] = (entry['responseStart'] - entry['requestStart']).toString();
                measureMap['nav-responseTime'] = (entry['responseEnd'] - entry['responseStart']).toString();
                measureMap['nav-requestResponseTime'] = (entry['responseEnd'] - entry['requestStart']).toString();
                break;
        }
    }

    const sendMetric = function() {
        // sem métricas para enviar, não prosseguir
        if (Object.keys(measureMap).length === 0) {
            return;
        }


        const data = [{
            "groupingMap": {
                "Agrupador dominio": "Métricas de Performance",
                "url": window.location.href,
                "host": window.location.hostname,
                "clientConnection":(window.navigator.connection && !!window.navigator.connection.effectiveType) && window.navigator.connection.effectiveType,
                "deviceMemory": (window.navigator && !!window.navigator.deviceMemory) && window.navigator.deviceMemory,
                "abTest": getABTestParams(document.location.search),
                "central": getCentralName(),
                "plataforma": window.Config && window.Config.platform || '-',
                "mediaType": window.universal_variable && window.universal_variable.aud && window.universal_variable.aud.mediaType || '-',
            },
            "measureMap": Object.assign({}, measureMap),
        }];

        console.log("[performance observer] sending metrics", JSON.stringify(data));

        fetch("https://logger.uol.com.br/v1/?prd=975", {
            method: "POST",
            headers: {
                "Content-Type": "application/json"
            },
            redirect: "error",
            referrerPolicy: "no-referrer",
            body: JSON.stringify(data),
        }).then(function(response) {
            // zera o objeto para que no próximo envio não seja enviado novamente
            response && Object.keys(measureMap).forEach((key) => delete measureMap[key]);
        });
    }

    const markWebVitalsMetric = function(metric) {
        measureMap[metric.name] = metric.value.toString();
    }

    const getWebVitalsMetrics = function() {
        // https://unpkg.com/web-vitals@2.1.0/dist/web-vitals.umd.js
        !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).webVitals={})}(this,(function(e){"use strict";var t,n,i,r,a=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:"v2-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},o=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if("first-input"===e&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},u=function(e,t){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(e(i),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},c=function(e){addEventListener("pageshow",(function(t){t.persisted&&e(t)}),!0)},f=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},s=-1,d=function(){return"hidden"===document.visibilityState?0:1/0},m=function(){u((function(e){var t=e.timeStamp;s=t}),!0)},v=function(){return s<0&&(s=d(),m(),c((function(){setTimeout((function(){s=d(),m()}),0)}))),{get firstHiddenTime(){return s}}},p=function(e,t){var n,i=v(),r=a("FCP"),u=function(e){"first-contentful-paint"===e.name&&(d&&d.disconnect(),e.startTime<i.firstHiddenTime&&(r.value=e.startTime,r.entries.push(e),n(!0)))},s=performance.getEntriesByName&&performance.getEntriesByName("first-contentful-paint")[0],d=s?null:o("paint",u);(s||d)&&(n=f(e,r,t),s&&u(s),c((function(i){r=a("FCP"),n=f(e,r,t),requestAnimationFrame((function(){requestAnimationFrame((function(){r.value=performance.now()-i.timeStamp,n(!0)}))}))})))},l=!1,g=-1,h={passive:!0,capture:!0},y=new Date,T=function(e,r){t||(t=r,n=e,i=new Date,L(removeEventListener),E())},E=function(){if(n>=0&&n<i-y){var e={entryType:"first-input",name:t.type,target:t.target,cancelable:t.cancelable,startTime:t.timeStamp,processingStart:t.timeStamp+n};r.forEach((function(t){t(e)})),r=[]}},S=function(e){if(e.cancelable){var t=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){T(e,t),r()},i=function(){r()},r=function(){removeEventListener("pointerup",n,h),removeEventListener("pointercancel",i,h)};addEventListener("pointerup",n,h),addEventListener("pointercancel",i,h)}(t,e):T(t,e)}},L=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,S,h)}))},w=new Set;e.getCLS=function(e,t){l||(p((function(e){g=e.value})),l=!0);var n,i=function(t){g>-1&&e(t)},r=a("CLS",0),s=0,d=[],m=function(e){if(!e.hadRecentInput){var t=d[0],i=d[d.length-1];s&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(s+=e.value,d.push(e)):(s=e.value,d=[e]),s>r.value&&(r.value=s,r.entries=d,n())}},v=o("layout-shift",m);v&&(n=f(i,r,t),u((function(){v.takeRecords().map(m),n(!0)})),c((function(){s=0,g=-1,r=a("CLS",0),n=f(i,r,t)})))},e.getFCP=p,e.getFID=function(e,i){var s,d=v(),m=a("FID"),p=function(e){e.startTime<d.firstHiddenTime&&(m.value=e.processingStart-e.startTime,m.entries.push(e),s(!0))},l=o("first-input",p);s=f(e,m,i),l&&u((function(){l.takeRecords().map(p),l.disconnect()}),!0),l&&c((function(){var o;m=a("FID"),s=f(e,m,i),r=[],n=-1,t=null,L(addEventListener),o=p,r.push(o),E()}))},e.getLCP=function(e,t){var n,i=v(),r=a("LCP"),s=function(e){var t=e.startTime;t<i.firstHiddenTime&&(r.value=t,r.entries.push(e)),n()},d=o("largest-contentful-paint",s);if(d){n=f(e,r,t);var m=function(){w.has(r.id)||(d.takeRecords().map(s),d.disconnect(),w.add(r.id),n(!0))};["keydown","click"].forEach((function(e){addEventListener(e,m,{once:!0,capture:!0})})),u(m,!0),c((function(i){r=a("LCP"),n=f(e,r,t),requestAnimationFrame((function(){requestAnimationFrame((function(){r.value=performance.now()-i.timeStamp,w.add(r.id),n(!0)}))}))}))}},e.getTTFB=function(e){var t,n=a("TTFB");t=function(){try{var t=performance.getEntriesByType("navigation")[0]||function(){var e=performance.timing,t={entryType:"navigation",startTime:0};for(var n in e)"navigationStart"!==n&&"toJSON"!==n&&(t[n]=Math.max(e[n]-e.navigationStart,0));return t}();if(n.value=n.delta=t.responseStart,n.value<0)return;n.entries=[t],e(n)}catch(e){}},"complete"===document.readyState?setTimeout(t,0):addEventListener("pageshow",t)},Object.defineProperty(e,"__esModule",{value:!0})}));

        webVitals.getCLS(markWebVitalsMetric, true);
        webVitals.getLCP(markWebVitalsMetric, true);
        webVitals.getFID(markWebVitalsMetric, true);
    }

    const init = function() {
        console.log("[performance observer] starting performance observer script");

        getWebVitalsMetrics();

        const performanceObserver = new PerformanceObserver(function(list) {
            const entries = list.getEntries();
            for (var i = 0; i < entries.length; i++) {
                parsePerformanceEntry(entries[i]);
            }
        });

        performanceObserver.observe({ entryTypes });

        // obtém as métricas que já foram registradas
        entryTypes.map((type) => performance.getEntriesByType(type))
            .flat(Infinity)
            .map(parsePerformanceEntry);

        window.addEventListener("visibilitychange", () => document.visibilityState === "hidden" && sendMetric());
        window.addEventListener("pagehide", sendMetric);

    }

    // Limita o envio a uma certa porcentagem
    // Possível utilizar parâmetro ?debugWebVitals=true para forçar envio
    if (location.search.includes("debugWebVitals=true") === true || Math.floor(Math.random() * 100) < AVG_USERS_OBSERVER) {
        init();
    }
})();