// Default code
var PUSH_SITE_ID        = parseInt(typeof localSiteId !== 'undefined' ? localSiteId : '1');
var PUSH_MASTER_URL     = '/assets/push/push.php';
var PUSH_SERVICE_WORKER = './assets/push/firebase-messaging-sw.js';
// Retrieve Firebase Messaging object.
const messaging         = firebase.messaging();
var fcmSkaIdName        = "skaFcmId";
var fcmSkaIdDelete      = "skaFcmIdDeleted";
// Send the token to the master
function fcmTokenSendToServer(subscriptionId, theStatus) {
    // test and submit
    fcmTheStatus = (typeof theStatus === 'undefined' || theStatus.length === 0 ? 'register'       : theStatus);
    fcmTheEmail  = (typeof SITE_USER_EMAIL !== 'undefined'                     ? SITE_USER_EMAIL  : '');
    // Do the checks
    if (typeof subscriptionId !== 'undefined' && (typeof window.jQuery !== 'undefined' || window.jQuery)) {
        // Post the subscription
        $.ajax({
            type: 'POST',
            url: PUSH_MASTER_URL,
            data: {pushsend: 1,
                    pushtype: fcmTheStatus,
                    site_id: PUSH_SITE_ID,
                    registration_id: subscriptionId,
                    user_email: fcmTheEmail,
                    active: 1},
            success: function(responsedata) {
                // All good
                theResponseData = (typeof responsedata !== 'undefined' && typeof responsedata.response !== 'undefined' ? responsedata.response : null);
                if (theResponseData !== null) {
                    theStatus = parseInt(theResponseData.status);
                    theSaveId = parseInt(theResponseData.save_id);
                    fcmCookieSet(fcmSkaIdName, theSaveId, 7);
                } else {
                    // UPS - there was some issue
                    fcmCookieDelete(fcmSkaIdName);
                };
            },
            error: function(responsedata) {
                fcmCookieDelete(fcmSkaIdName);
            },
            dataType: 'json' });
    };
}
// Request permission
function fcmRequestPermission() {
    Notification.requestPermission().then(async (permission) => {
        console.log(permission);
        if (permission == 'granted') {

            try {
                const token = await messaging.getToken();

                if (token) {
                    console.log(token);
                    fcmTokenSendToServer(token);
                } else {
                    console.log('No Instance ID token available. Request permission to generate one.');
                }
            } catch (error) {

                console.log('An error occurred while retrieving token. ', error);


                //BUT THE NEW TOKEN SUCCESSFULY FETCHED
                const token = await messaging.getToken();

                if (token) {

                    console.log(token);
                    fcmTokenSendToServer(token);
                } else {
                    console.log('No Instance ID token available. Request permission to generate one.');
                }
            }
        }

    })
        .catch(error => console.log(error));
};
// Callback fired if Instance ID token is updated.
function fcmTokenRefresh() {
    messaging.onTokenRefresh(function() {
        messaging.getToken()
        .then(function(refreshedToken) {
            // console.log('Token refreshed.');
            // Send Instance ID token to app server.
            fcmTokenSendToServer(refreshedToken);
        })
        .catch(function(err) {
            // console.log('Unable to retrieve refreshed token ', err);
        });
    });
};
// Remove the token
function fcmTokenDelete() {
    messaging.getToken()
    .then(function(currentToken) {
        messaging.deleteToken(currentToken)
        .then(function() {
            // console.log('Token deleted.');
            fcmTokenSendToServer(currentToken, 'delete');
        })
        .catch(function(err) {
            // console.log('Unable to delete token. ', err);
        });
    })
    .catch(function(err) {
        // console.log('Error retrieving Instance ID token. ', err);
    });
};
// If we want to display the message into the page
function fcmOnMessage() {
    // The on message
    messaging.onMessage(function(payload) {
      // console.log("Message received. ", payload);
    });
};
// Init the code
function fcmInitTheCode() {
    // Get and set the permissions
    fcmRequestPermission();
    // Listen for notifications
    // fcmTokenRefresh();
    // Listen for anymessage
    // fcmOnMessage();
};
// Set the cookies ==================================================
function fcmCookieSet(name, value,  days) {
    expires = "";
    if (days) {
        date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        expires = "; expires="+date.toGMTString();
    } else {
        expires = "";
    };
    document.cookie = name+"="+value+expires+"; path=/";
};
// Cookies - Get
function fcmCookieGet(name) {
    nameEQ = name + "=";
    ca = document.cookie.split(';');
    for(i=0;i < ca.length;i++) {
        c = ca[i];
        while (c.charAt(0)===' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length,c.length);
    };
    return null;
};
// Cookies - Delete
function fcmCookieDelete(name) {
    fcmCookieSet(name,"",-1);
};
// Run the code ONLY ON SSL
if (location.protocol === 'https' || document.location.protocol === 'https' || location.protocol === 'https:' || document.location.protocol === 'https:') {
    $(document).ready(function() {
        var fcmDeleteStatus = fcmCookieGet(fcmSkaIdDelete);
        if (!fcmDeleteStatus || fcmDeleteStatus.length === 0) {
            // Delete old ID cookie
            fcmCookieDelete(fcmSkaIdName);
            // Set status
            fcmDeleteStatus = 0;
        };
        // If it's not deleted execute
        if (parseInt(fcmDeleteStatus) !== 1) {
            // Check if we already have it
            var fcmCookieIdValue = fcmCookieGet(fcmSkaIdName);
            if (!fcmCookieIdValue || fcmCookieIdValue.length === 0) {
                fcmInitTheCode();
            };
        };
    });
};