var CCLiveChat = {}
CCLiveChat.addEventHandler = function(embedded_svc, events) {
    embedded_svc.addEventHandler("onHelpButtonClick", function(data) {
        if(events && typeof events.onHelpButtonClick === 'function') {
            events.onHelpButtonClick(data);
        }
    });
    
    embedded_svc.addEventHandler("onChatRequestSuccess", function(data) {
        if(events && typeof events.onChatRequestSuccess === 'function') {
            events.onChatRequestSuccess(data);
        }
    });
    
    embedded_svc.addEventHandler("onChatEstablished", function(data) {
        if(events && typeof events.onChatEstablished === 'function') {
            events.onChatEstablished(data);
        }
    });
    
    embedded_svc.addEventHandler("onChasitorMessage", function(data) {
        if(events && typeof events.onChasitorMessage === 'function') {
            events.onChasitorMessage(data);
        }
    });
    
    embedded_svc.addEventHandler("onAgentMessage", function(data) {
        if(events && typeof events.onAgentMessage === 'function') {
            events.onAgentMessage(data);
        }
    });
    
    embedded_svc.addEventHandler("onChatConferenceInitiated", function(data) {
        if(events && typeof events.onChatConferenceInitiated === 'function') {
            events.onChatConferenceInitiated(data);
        }
    });
    
    embedded_svc.addEventHandler("onAgentJoinedConference", function(data) {
        if(events && typeof events.onAgentJoinedConference === 'function') {
            events.onAgentJoinedConference(data);
        }
    });
    
    embedded_svc.addEventHandler("onAgentLeftConference", function(data) {
        if(events && typeof events.onAgentLeftConference === 'function') {
            events.onAgentLeftConference(data);
        }
    });
    
    embedded_svc.addEventHandler("onChatConferenceEnded", function(data) {
        if(events && typeof events.onChatConferenceEnded === 'function') {
            events.onChatConferenceEnded(data);
        }
    });
    
    embedded_svc.addEventHandler("onChatTransferSuccessful", function(data) {
        if(events && typeof events.onChatTransferSuccessful === 'function') {
            events.onChatTransferSuccessful(data);
        }
    });
    
    embedded_svc.addEventHandler("onChatEndedByChasitor", function(data) {
        if(events && typeof events.onChatEndedByChasitor === 'function') {
            events.onChatEndedByChasitor(data);
        }
        CCLiveChat.chatHandler(data);
    });
    
    embedded_svc.addEventHandler("onChatEndedByAgent", function(data) {
        if(events && typeof events.onChatEndedByAgent === 'function') {
            events.onChatEndedByAgent(data);
        }
        CCLiveChat.chatHandler(data);
    });
    
    embedded_svc.addEventHandler("onQueueUpdate", function(data) {
        if(events && typeof events.onQueueUpdate === 'function') {
            events.onQueueUpdate(data);
        }
    });
    
    embedded_svc.addEventHandler("onIdleTimeoutOccurred", function(data) {
        if(events && typeof events.onIdleTimeoutOccurred === 'function') {
            events.onIdleTimeoutOccurred(data);
        }
    });
    
    embedded_svc.addEventHandler("onConnectionError", function(data) {
        if(events && typeof events.onConnectionError === 'function') {
            events.onConnectionError(data);
        }
    });
    
    embedded_svc.addEventHandler("onClickSubmitButton", function(data) {
        if(events && typeof events.onClickSubmitButton === 'function') {
            events.onClickSubmitButton(data);
        }
    });

    embedded_svc.addEventHandler("onInviteAccepted", function(data) {
        if(events && typeof events.onInviteAccepted === 'function') {
            events.onInviteAccepted(data);
        }
    });
    
    embedded_svc.addEventHandler("onInviteRejected", function(data) {
        if(events && typeof events.onInviteRejected === 'function') {
            events.onInviteRejected(data);
        }
    });
};
CCLiveChat.initOmniChannel = function (data, callback, events) {
    var initESW = function (gslbBaseURL) {
        embedded_svc.settings.displayHelpButton = true; //Or false
        embedded_svc.settings.language = data.language; //For example, enter 'en' or 'en-US'

        embedded_svc.settings.defaultMinimizedText = data.chat.OnlineLabel__c; //(Defaults to Chat with an Expert)
        embedded_svc.settings.disabledMinimizedText = data.chat.ContactUsLabel__c; //(Defaults to Agent Offline)
        embedded_svc.settings.offlineSupportMinimizedText =  data.chat.OfflineSupportLabel__c;
        embedded_svc.settings.loadingText = data.chat.LoadingLabel__c; //(Defaults to Loading)
        //embedded_svc.settings.storageDomain = urlParams.get('dom'); //(Sets the domain for your deployment so that visitors can navigate subdomains during a chat session)

        // Settings for Live Agent
        embedded_svc.settings.directToButtonRouting = function (prechatFormData) {
            // Dynamically changes the button ID based on what the visitor enters in the pre-chat form.
            // Returns a valid button ID.
            console.log('prechatFormData', prechatFormData);
            return data.chat.ButtonId__c;
        };
        if(data.prepopulatedPrechatFields) {
            embedded_svc.settings.prepopulatedPrechatFields = data.prepopulatedPrechatFields; //Sets the auto-population of pre-chat form fields
        }
        if(data.fallbackRouting) {
            embedded_svc.settings.fallbackRouting = data.fallbackRouting; //An array of button IDs, user IDs, or userId_buttonId
        }
        embedded_svc.settings.extraPrechatFormDetails = data.extraPrechatFormDetails;
        embedded_svc.settings.extraPrechatInfo = data.extraPrechatInfo;

        embedded_svc.settings.enabledFeatures = ['LiveAgent'];
        embedded_svc.settings.entryFeature = 'LiveAgent';
        CCLiveChat.addEventHandler(embedded_svc, events);
        // '00D1w0000000Wty'
        embedded_svc.init(
            data.chat.OrgURL__c,
            data.chat.SiteURL__c,
            gslbBaseURL,
            data.chat.DeploymentOrgId__c,
            data.chat.SnapIn__c,
            {
                baseLiveAgentContentURL: data.chat.LiveAgentContentURL__c,
                deploymentId: data.chat.DeploymentId__c,
                buttonId: data.chat.ButtonId__c,
                baseLiveAgentURL: data.chat.LiveAgentURL__c,
                eswLiveAgentDevName: data.chat.LiveAgentDevName__c,
                isOfflineSupportEnabled: data.chat.OfflineSupport__c === true
            }
        );
        CCLiveChat.handleOffline(data, callback);
    };

    if (!window.embedded_svc) {
        var s = document.createElement('script');
        s.setAttribute('src', data.chat.OrgURL__c + '/embeddedservice/5.0/esw.min.js');
        s.onload = function () {
            initESW(null);
        };
        document.body.appendChild(s);
    } else {
        initESW('https://service.force.com');
    }
};

CCLiveChat.handleSuccess = function(results, callback, events) {
    console.log('results', results);
    if(typeof callback === 'object' && !events) {
        events = callback;
    }
    if(results.chat) {
        CCLiveChat.nps = results.chat.HasNPS__c; // Initialize NPS.
        CCLiveChat.chatBotName = results.chat.ChatBotName__c;
        CCLiveChat.chatBotAvatar = results.chat.ChatBotAvatar__c;
        CCLiveChat.chatBotNPSMessage = results.chat.ChatBotNPSMessage__c;
        CCLiveChat.chatEnded = false;
        if(CCLiveChat.chatBotAvatar) embedded_svc.settings.chatbotAvatarImgURL = results.chat.ChatBotAvatar__c;
    }
    CCLiveChat.chatHandler(results);
    CCLiveChat.chatInformation = results;
    CCLiveChat.initOmniChannel(results, callback, events);
};

CCLiveChat.handleError = function (event) {
    console.log(event);
};

CCLiveChat.handleOffline = function(data, callback) {
    CCLiveChat.job = function () {
        let buttonOfflines = document.getElementsByClassName('uiButton helpButtonDisabled');
        if (buttonOfflines.length && !data.chat.OfflineSupport__c && data.chat.OfflineURL__c) {
            let buttonOffline = buttonOfflines.item(0);
            buttonOffline.classList.remove('helpButtonDisabled');
            buttonOffline.onclick = function () {
                let query = 'Country=' + data.country.Name + '&Brand=' + data.brand.Name;
                if(data.chat.OfflineURL__c.indexOf('?') === -1) {
                    query = '?'+query;
                } else {
                    query = '&'+query;
                }
                //window.open(data.chat.OfflineURL__c + query, '_blank');
                window.location.href = data.chat.OfflineURL__c + query;
            }
        }
        if(typeof callback === 'function') {
            callback(data);
        }
    };
    window.setTimeout(CCLiveChat.job, 1000); // Wait one second to allow dom to be loaded.
    CCLiveChat.jobTimer = window.setInterval(CCLiveChat.job, 5000); // Repeat every 5 s
}

CCLiveChat.getUrlParameter = function(sParam) {
    var sPageURL = decodeURIComponent(window.location.search.substring(1)),
        sURLVariables = sPageURL.split('&'),
        sParameterName,
        i;
    for (i = 0; i < sURLVariables.length; i++) {
        let token = sURLVariables[i];
        for(var j = i+1; j < sURLVariables.length; j++) {
            if(sURLVariables[j].indexOf('=') >= 0) {
                break;
            }
            token += '&' + sURLVariables[j];
        }
        sParameterName = token.split('=');
        if (sParameterName[0] && sParameterName[0].toLowerCase() === sParam.toLowerCase()) {
            return sParameterName[1] === undefined ? true : sParameterName[1];
        }
    }
};

// Remote Action for data local usage.
CCLiveChat.init = async function(env, country, brand, lang, callback, events) {
    const response = await fetch(env + '/omchat/services/apexrest/v1/livechat/params?country='+country + '&brand=' + brand + '&lang=' + lang);
    if (response.status === 200) {
        const data = await response.json(); //extract JSON from the http response
        CCLiveChat.handleSuccess(data, callback, events);
    } else {
        CCLiveChat.handleError(response);
    }
};

CCLiveChat.chatHandler = function(data) {
    if(CCLiveChat.nps && data.liveAgentSessionKey) {
        console.log("onChatEndedByChasitor event was fired.  liveAgentSessionKey was " + data.liveAgentSessionKey, data);
        //embedded_svc.postMessage("agent.sendMessage", `lwc:survey:nps:${data.liveAgentSessionKey}`);
        /*
        Thanks for using the chat.
        You are not registered  yet, remember to  sub scribe to our
        newsletter to keep up to  date with our services,  new products and
        skincare tips!<br/>
        <h2>HAVE WE BEEN HELPFUL TO YOU?</h2>

        Grazie per aver utilizzato la chat! Se non ti sei ancora registrato, ricordati di iscriverti alla nostra newsletter per restare sempre aggiornato sui nostri servizi, nuovi prodotti e consigli utili di skincare!<br/>
        <h2>TI SIAMO STATI D'AIUTO ?</h2>
        */
        data.message = CCLiveChat.chatBotNPSMessage || '<h2>HAVE WE BEEN HELPFUL TO YOU?</h2>';
        if(!CCLiveChat.chatEnded) {
            window.postMessage(
                {
                    data: data,
                    type: "endChat"
                },
                window.parent.location.href
            );
        }
    } else {
        console.log(CCLiveChat.chatBotName, CCLiveChat.chatBotAvatar);
        let chatHeadScript = `
            window.addEventListener("message", receiveMessage, false);
            function receiveMessage(event) {
                var payload = event.data;
                if(payload && payload.type === "chasitor.sendMessage") {
                    embedded_svc.postMessage("chasitor.sendMessage", payload.message);
                } else if(payload && payload.type === "chatEnded") {
                    CCLiveChat.chatEnded = payload.message
                }
                if(payload && payload.data && payload.data.params && (payload.data.params.getName === CCLiveChat.chatBotName || payload.data.params.name === CCLiveChat.chatBotName)) {
                    embedded_svc.settings.chatbotAvatarImgURL = CCLiveChat.chatBotAvatar
                }
            }`;
        
        let targetElements = document.getElementsByTagName('head');
        if(targetElements.length > 0 && !document.getElementById('CCLiveChat_nps_script')) {
            let npsScriptElement = document.createElement('script');
            npsScriptElement.id = 'CCLiveChat_nps_script';
            npsScriptElement.innerHTML = chatHeadScript;
            
            let targetElement = targetElements[0];
            targetElement.append(npsScriptElement);
        }
    }
}

// Initialization all together
window.CCLiveChat = CCLiveChat;