/* common functions for all DTCVX brand LWR sites */

// GLOBAL VARS
// globally define adobe object
let s = null;
// create dataprops object for adobe
let dataProps = {};

function isEmpty(value) {
    if (value == undefined || value == null || value == "") {
        return true;
    }
    return false;
    //return (value == undefined || value == null || value == "");
}

function isObjectEmpty(obj) {
    return Object.keys(obj).length === 0;
}

function isCrawlerBot() {
    const botPattern = "(Googlebot|Googlebot-Mobile|Googlebot-Image|Google-InspectionTool|Google favicon|SemrushBot|Mediapartners-Google|bingbot|Commons-HttpClient|Python-urllib|msnbot|jyxobot|FAST-WebCrawler|FAST Enterprise Crawler|biglotron|teoma|convera|seekbot|gigablast|exabot|ngbot|ia_archiver|GingerCrawler|webmon|httrack|webcrawler|grub.org|UsineNouvelleCrawler|antibot|netresearchserver|bibnum.bnf|findlink|msrbot|panscient|yacybot|AISearchBot|IOI|ips-agent|tagoobot|MJ12bot|dotbot|woriobot|yanga|buzzbot|mlbot|yandexbot|purebot|Linguee Bot|Voyager|CyberPatrol|voilabot|baiduspider|citeseerxbot|spbot|twengabot|postrank|turnitinbot|scribdbot|page2rss|sitebot|linkdex|Adidxbot|blekkobot|ezooms|dotbot|Mail.RU_Bot|discobot|heritrix|findthatfile|europarchive.org|NerdByNature.Bot|domaincrawler|wbsearchbot|summify|ccbot|edisterbot|seznambot|ec2linkfinder|gslfbot|aihitbot|intelium_bot|facebookexternalhit|yeti|RetrevoPageAnalyzer|lb-spider|sogou|lssbot|careerbot|wotbox|wocbot|ichiro|DuckDuckBot|lssrocketcrawler|drupact|webcompanycrawler|acoonbot|openindexspider|gnam gnam spider|web-archive-net.com.bot|backlinkcrawler|coccoc|integromedb|content crawler spider|toplistbot|seokicks-robot|it2media-domain-crawler|ip-web-crawler.com|siteexplorer.info|elisabot|proximic|changedetection|blexbot|arabot|WeSEE:Search|niki-bot|CrystalSemanticsBot|rogerbot|360Spider|psbot|InterfaxScanBot|Lipperhey SEO Service|CC Metadata Scaper|g00g1e.net|GrapeshotCrawler|urlappendbot|brainobot|fr-crawler|binlar|SimpleCrawler|Livelapbot|Twitterbot|Facebot|OrangeBot|memorybot|AdvBot|BUbiNG|Qwantify|archive.org_bot|Applebot|TweetmemeBot|crawler4j|AddThis|prerender)";
    let re = new RegExp(botPattern, 'i');
    let userAgent = navigator.userAgent;
    if (re.test(userAgent)) {
        return true;
    } else {
        return false;
    }
}

function deleteAdobeCookies() {
    let allCookies = document.cookie.split(';')

    allCookies.forEach(e => {
        if (e.trim().startsWith('s_')) {
            let cookieName = e.split('=')[0].trim();
            console.log(cookieName);
            deleteCookie(cookieName);
        }
    });

}

function getCookie(cookieName) {
    let allCookies = document.cookie.split(';');
    let cookieVal = '';
    for (var i = 0; i < allCookies.length; i++) {
        if (allCookies[i].trim().startsWith(cookieName)) {
            cookieVal = allCookies[i].split('=')[1].trim();
            console.log('found cookie: ' + cookieName + ' with val: ' + cookieVal);
            return cookieVal;
        }
    }
    return null;
}

// Delete a cookie, by name
function deleteCookie(cookieName) {
    let domainParts = window.location.origin.split('.');
    let domain = '.' + domainParts[domainParts.length-2] + '.' + domainParts[domainParts.length-1];
    document.cookie = cookieName + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain="+domain;
}

function getNiceStatus() {
    //RECOVERING
    let storageKey = "-___chat";    
    for (i = 0; i < localStorage.length; i++)   {

        if (localStorage.key(i).includes(storageKey)) {

            let sessionStatus = JSON.parse(localStorage.getItem(localStorage.key(i)));
            console.log('page-init: chat-log: getNiceStatus = ' + sessionStatus.session.status);

            return sessionStatus.session.status;
        }

    };
}


function noPageView() {
    let val = false;
    
    if (s.events !== undefined) {
        // if events is set, no page view
        console.log('handleAdobeData: noPageView: s.events: ' + s.events);
        val = true;
    }

    const pageProps = ['prop17','prop18','prop19','prop20','prop21','prop22'];
    pageProps.forEach((prop) => {
        if (s[prop] != null) {
            console.log('handleAdobeData: noPageView: noPageView prop found: ' + prop);
            val = true;
        }
    });
    
    if (s.prop5 == 'Anchor Link') {
        console.log('handleAdobeData: noPageView: anchor link found');
        val = true;
    }

    return val;
}

function suppressAdobe() {

    let suppressTag = document.querySelector('meta[name="suppressadobe"]');

    console.log('handleAdobe: SUPPRESS : ' + suppressTag);

    if (suppressTag != null && suppressTag.content == "true") {
        return true;
    } else {
        return false;
    }
}


function checkQueryParams() {
    
    const params = new URLSearchParams(window.location.search);
    // make all keys lowercase
    const searchParams = new URLSearchParams(
        Array.from(params, ([key, value]) => [key.toLowerCase(), value])
    );

    //VXSS-436 - campaign tracking
    if (searchParams.has('utm_campaign')) {
        dataProps.prop9 = searchParams.get('utm_campaign');
        dataProps.evar9 = searchParams.get('utm_campaign');
    }
    if (searchParams.has('utm_source')) {
        dataProps.prop23 = searchParams.get('utm_source');
        dataProps.evar23 = searchParams.get('utm_source');
    }
    if (searchParams.has('utm_medium')) {
        dataProps.prop24 = searchParams.get('utm_medium');
        dataProps.evar24 = searchParams.get('utm_medium');
    }
    if (searchParams.has('utm_content')) {
        dataProps.prop30 = searchParams.get('utm_content');
        dataProps.evar30 = searchParams.get('utm_content');
    }

    //VXSS-970 - chat link params
    if (searchParams.has('va_id')) {
        dataProps.prop8 = searchParams.get('va_id');
        dataProps.evar8 = searchParams.get('va_id');
    }
}

function clearAdobeVars() {

    // instead, lets clear dataProps and keep just those that should persist (and might not be getting set by events)
    let tempProps = dataProps;
    dataProps = {};
    dataProps.pageName = tempProps.pageName;
    dataProps.prop13 = tempProps.prop13;
    dataProps.prop14 = tempProps.prop14;
    dataProps.prop39 = tempProps.prop39;
    dataProps.evar74 = tempProps.evar74;
    dataProps.prop27 = tempProps.prop27;
    dataProps.evar27 = tempProps.evar27;

    console.log('page-init: handleAdobeData: custom adobe var clear');
}

function verifySessionStorage() {
    let ipSession = window.sessionStorage.getItem('LSKey[c]ip');
    let countrySession = window.sessionStorage.getItem('LSKey[c]country');
    let countryNameSession = window.sessionStorage.getItem('LSKey[c]countryName');
    let langSession = window.sessionStorage.getItem('LSKey[c]language');
    let regionSession = window.sessionStorage.getItem('LSKey[c]region');
    let mdSession =  window.sessionStorage.getItem('LSKey[c]metadataName');
    let primSession =  window.sessionStorage.getItem('LSKey[c]primaryLocale');

    let ipLocal = window.localStorage.getItem('LSKey[c]ip');
    let countryLocal = window.localStorage.getItem('LSKey[c]country');
    let countryNameLocal = window.localStorage.getItem('LSKey[c]countryName');
    let langLocal = window.localStorage.getItem('LSKey[c]language');
    let regionLocal = window.localStorage.getItem('LSKey[c]region');
    let mdLocal =  window.localStorage.getItem('LSKey[c]metadataName');
    let primLocal =  window.localStorage.getItem('LSKey[c]primaryLocale');

    if (ipSession && countrySession && countryNameSession && langSession && regionSession && mdSession && primSession) {
        return 'session-exists';
    }

    if (ipLocal && countryLocal && countryNameLocal && langLocal && regionLocal && mdLocal && primLocal) {
        window.sessionStorage.setItem('LSKey[c]country', window.localStorage.getItem('LSKey[c]country'));
        window.sessionStorage.setItem('LSKey[c]countryName', window.localStorage.getItem('LSKey[c]countryName'));
        window.sessionStorage.setItem('LSKey[c]metadataName', window.localStorage.getItem('LSKey[c]metadataName'));
        window.sessionStorage.setItem('LSKey[c]language', window.localStorage.getItem('LSKey[c]language'));
        window.sessionStorage.setItem('LSKey[c]region', window.localStorage.getItem('LSKey[c]region'));
        window.sessionStorage.setItem('LSKey[c]ip', window.localStorage.getItem('LSKey[c]ip'));
        window.sessionStorage.setItem('LSKey[c]primaryLocale', window.localStorage.getItem('LSKey[c]primaryLocale'));

        if (window.localStorage.getItem('LSKey[c]allowAdobe')) {
            window.sessionStorage.setItem('LSKey[c]allowAdobe', window.localStorage.getItem('LSKey[c]allowAdobe'));
        }

        return 'local-exists';
    }

    return 'create-session';
}

function setSession(repos) {
    window.sessionStorage.setItem('LSKey[c]ip', repos.ipAddress);
    window.sessionStorage.setItem('LSKey[c]region', repos.region);
    window.sessionStorage.setItem('LSKey[c]country', repos.countryCode);
    window.sessionStorage.setItem('LSKey[c]countryName', repos.countryName);
    window.sessionStorage.setItem('LSKey[c]metadataName', repos.masterLabel);
    window.sessionStorage.setItem('LSKey[c]language', repos.languageCode);
    window.sessionStorage.setItem('LSKey[c]primaryLocale', repos.primaryLocale);
    window.localStorage.setItem('LSKey[c]ip', repos.ipAddress);
    window.localStorage.setItem('LSKey[c]region', repos.region);
    window.localStorage.setItem('LSKey[c]country', repos.countryCode);
    window.localStorage.setItem('LSKey[c]countryName', repos.countryName);
    window.localStorage.setItem('LSKey[c]metadataName', repos.masterLabel);
    window.localStorage.setItem('LSKey[c]language', repos.languageCode);
    window.localStorage.setItem('LSKey[c]primaryLocale', repos.primaryLocale);
}

const getBrowserName = () => {
    let browserInfo = navigator.userAgent;
    let browser;
    if (browserInfo.includes('Opera') || browserInfo.includes('Opr')) {
      browser = 'Opera';
    } else if (browserInfo.includes('Edg')) {
      browser = 'Edge';
    } else if (browserInfo.includes('Chrome')) {
      browser = 'Chrome';
    } else if (browserInfo.includes('Safari')) {
      browser = 'Safari';
    } else if (browserInfo.includes('Firefox')) {
      browser = 'Firefox'
    } else {
      browser = 'unknown'
    }
    return browser;
}

const beforeUnloadHandler = (event) => {

    console.log('beforeunload handler fired - where does this happen compared to originalReferrer?');
    
    let eventDataProps = {};

    eventDataProps.pageName = dataProps.pageName;
    eventDataProps.prop13 = dataProps.prop13;
    eventDataProps.prop14 = dataProps.prop14;
    eventDataProps.prop39 = dataProps.prop39;
    eventDataProps.evar74 = dataProps.evar74;
    eventDataProps.prop27 = dataProps.prop27;
    eventDataProps.evar27 = dataProps.evar27;   

    if (s !== null && dataProps.pageName) {
        getPercentPageViewed();
        if (window.sessionStorage.getItem('LSKey[c]firstPage') == 'true'){
            eventDataProps.prop21 = window._ppvHighestPercentViewed;
            eventDataProps.evar21 = window._ppvHighestPercentViewed;
        } else {
            eventDataProps.prop40 = window._ppvHighestPercentViewed;
            eventDataProps.prop41 = window._ppvHighestPixelsSeen;
        }
    }

    console.log('page-init: handleAdobeData-callout: beforeunload event');
    handleAdobeData(eventDataProps, 'event', 'beforeunload event');

};


// BEGIN Adobe Related

//instantiate tracking object with report suite ID and set global params in object
function handleAdobeData(localDataProps, type, logName) {
    
    console.log('handleAdobeData: function called with type: '+type+' and allowAdobe: ' + window.sessionStorage.getItem('LSKey[c]allowAdobe') + ' and suppressAdobe: ' + suppressAdobe());

    if (window.sessionStorage.getItem('LSKey[c]allowAdobe') == 'allow' && !suppressAdobe()) {

        console.log('handleAdobeData: localDataProps.pageName = ' + localDataProps.pageName);

        if (!isObjectEmpty(localDataProps) && ((type=='onetrust' && localDataProps.pageName !== undefined) || type=='page' || type=='event')) {

            let aaPromise = new Promise(function (resolve, reject) {
            
                if (s === null) {
                    let aascripttag = document.createElement('script');
                    aascripttag.async = false;
                    //aascripttag.src = SITE_DOMAIN + '/sfsites/c/resource/Adobe_AppMeasurement_'+BRAND+'?s='+Date.now();
                    aascripttag.src = SITE_DOMAIN + '/sfsites/c/resource/Adobe_AppMeasurement?s='+Date.now();
                    document.head.insertBefore(aascripttag, document.head.children[0]);
            
                    aascripttag.addEventListener('load', () => {
    
                        console.log('handleAdobeData: loaded. setting global props');
                        s = s_gi(SUITE_NAME);
                        //designate tracking server
                        s.trackingServer = TRACKING_SERVER;
    
                        s.registerPostTrackCallback(function(){
                            // custom clear of dataProps
                            clearAdobeVars();
                            // native clear of s object
                            s.clearVars();
                            console.log('handleAdobeData: cleared data post s.t()');
                        });
                        
                        resolve();
                    });
                } else {
                    console.log('handleAdobeData: already loaded. resolve promise');
                    resolve();
                }
                
            });
    
            aaPromise.then(() => {
                console.log('handleAdobeData: promise resolved');
    
                //Previous Page URL: prop3
                let originalReferrer = window.sessionStorage.getItem('LSKey[c]originalReferrer');
                console.log('handleAdobeData: original referrer value: ', originalReferrer);
                if (originalReferrer) {
                    console.log('handleAdobeData: using original referrer after redirect : ', originalReferrer);
                    s.referrer = originalReferrer;
                    s.prop3 = originalReferrer;
                    s.prop12 = originalReferrer;
                    window.sessionStorage.removeItem('LSKey[c]originalReferrer');
                    window.sessionStorage.setItem('LSKey[c]visitReferrer',originalReferrer);
                } else {
                    let currentReferrer = window.sessionStorage.getItem('LSKey[c]currentReferrer');
                    let originalReferrer = window.sessionStorage.getItem('LSKey[c]visitReferrer');
                    s.prop12 = originalReferrer;
                    if (currentReferrer) {
                        s.referrer = currentReferrer;
                        s.prop3 = currentReferrer;
                    } else {
                        s.referrer = document.referrer;
                        s.prop3 = document.referrer;
                    }
                    if (type == 'page') {
                        window.sessionStorage.setItem('LSKey[c]currentReferrer', window.location.href);
                    }
                    console.log('handleAdobeData: prop3/referrer: ' + s.prop3); 
                }
    
                //Adobe Suite Name: prop95, evar 95
                s.prop95 = SUITE_NAME;
                s.evar95 = SUITE_NAME;
    
                //Brand (Site Section): prop1, evar3, evar130
                var getdomain = location.host.split('.').reverse();
                var root_domain =  getdomain[1];
                s.prop1 = root_domain;
                s.evar3 = root_domain;
                s.evar130 = root_domain;
    
                //Visitor ID: prop 38
                //Visitor Type: Prop 4 and Evar4
                let visitorId = getCookie('s_fid');
                if (visitorId !== null) {
                    s.prop38 = visitorId;
                }
                let visitorType = getCookie('s_nr');
                if (visitorType !== null) {
                    s.prop4 = visitorType;
                    s.evar4 = visitorType;
                }
                
                // always set these props when fired.
                s.prop2 = window.location.href;
                s.prop31 = window.sessionStorage.getItem('LSKey[c]language');
                s.prop32 = window.sessionStorage.getItem('LSKey[c]countryName');

                // authenticated user account id
                let chatData = window.sessionStorage.getItem("LSKey[c]chatdata");
                if (chatData) {
                    chatData = JSON.parse(chatData);
                }
                let account_id = "N/A";
                if (BRAND == 'Disney') {
                    account_id = chatData && chatData.disneyAccountId ? chatData.disneyAccountId : "N/A";
                } else if (BRAND == 'Hulu') {
                    account_id = chatData && chatData.huluAccountId ? chatData.huluAccountId : "N/A";
                }
                  
                if (account_id != 'N/A') {
                    s.prop11 = account_id;
                    s.evar11 = account_id;
                }

                for (const [key, value] of Object.entries(localDataProps)) {
                    if (key.startsWith('event')) {
                        s.events = key;
                    } else {
                        s[key] = value;
                    }
                }

                if(s.pageName) getPercentPageViewed();
                if (window._ppvHighestPercentViewed) {
                    s.prop40 = window._ppvHighestPercentViewed;
                    s.prop41 = window._ppvHighestPixelsSeen;
                }
    
                if (!s.prop2.includes('preview.salesforce')) {
                    if (noPageView()) {
                        console.log('handleAdobeData s.tl() callout - NO PAGE VIEW: ' + logName);
                        if (s.prop7 != null && s.prop7 != undefined) {
                            s.tl(true,"o",s.prop7);
                        } else {
                            s.tl(true,"o",s.prop2);
                        }
                    } else {
                        console.log('handleAdobeData s.t() callout: ' + logName);
                        s.t();
                    }
                }
                
    
            }).catch(() => {
                console.log('handleAdobeData: promise rejected');
            });

        }
        
    }
}

document.addEventListener('sendadobeevent', function (event) {

    let eventDataProps = {};

    console.log('handleAdobeData: event recieved from click: ', JSON.stringify(event.detail));
    for (const [key, value] of Object.entries(event.detail.params)) {
        eventDataProps[key] = value;
    }
    eventDataProps.pageName = dataProps.pageName;
    eventDataProps.prop13 = dataProps.prop13;
    eventDataProps.prop14 = dataProps.prop14;
    eventDataProps.prop39 = dataProps.prop39;
    eventDataProps.evar74 = dataProps.evar74;
    eventDataProps.prop27 = dataProps.prop27;
    eventDataProps.evar27 = dataProps.evar27;

    handleAdobeData(eventDataProps, 'event', 'sendadobeevent: ' + JSON.stringify(event.detail.params));

});
// END Adobe

// BEGIN OneTrust related code
function getOneTrustGroupValue(group) {

    let OptOutStatus = decodeURIComponent(document.cookie)
        .split("; ")
        .find((e) => e.startsWith("OptanonConsent"))
        ?.split("&")
        .find((e) => e.startsWith("groups"))
        .split("=")[1]
        .split(",")
        .find((e) => e.startsWith(group))
        ?.split(":");
    
    return OptOutStatus[1];
}

function hasUserOptedOut() {
    
    let optOutValue = getOneTrustGroupValue(ONETRUST_GROUP); // 4 is opt out flag
    
    console.log('page-init: onetrust: opt out value: ' + optOutValue);

    if (optOutValue === "1" || window.sessionStorage.getItem('LSKey[c]region') === 'APAC' || window.sessionStorage.getItem('LSKey[c]region') === 'LATAM') {
        console.log('page-init: onetrust: User has opted in. load adobe library');
        window.sessionStorage.setItem('LSKey[c]allowAdobe', 'allow');
        window.localStorage.setItem('LSKey[c]allowAdobe', 'allow');
        //console.log('page-init: onetrust: handleAdobeData-callout: are dataProps set? ', dataProps);
        //handleAdobeData(dataProps, 'onetrust');
    } else {
        console.log('page-init: onetrust: User has opted out. ');
        window.sessionStorage.setItem('LSKey[c]allowAdobe', 'reject');
        window.localStorage.setItem('LSKey[c]allowAdobe', 'reject');
        deleteAdobeCookies();
    }         
}

function OptanonWrapper() { 
    console.log('page-init: onetrust: Onetrust OptanonWrapper');

    setTimeout(() => {
        hasUserOptedOut();
    }, 10);

    OneTrust.OnConsentChanged(hasUserOptedOut);
}

document.addEventListener('privacychoice', function () {
    console.log("onetrust: Received one trust event.");
    OneTrust.ToggleInfoDisplay();
});
// END OneTrust