/**
 * functions to support PUSH notifications (PN) on user client
 */
 var RCODE = '';
 
/**
 * subscribe Push notifications (PN)
 * - check, if PN's are available
 * - request users permission, if not done so far
 * - register service worker, if permisson is granted  
 */
async function pnSubscribe() {
     
        showSubscribeEmailForm();
    
}

async function pnSubscribeOne() {
    if (pnAvailable()) {
        // if not granted or denied so far...
        if (window.Notification.permission === "default") {
            await window.Notification.requestPermission();
        }
        var swReg = await navigator.serviceWorker.getRegistration();
        if (swReg !== undefined) {
            //console.log("yet subscribed");
            return false;
        }
        if (Notification.permission === 'granted') {
            // register service worker
            await pnRegisterSW();
        }
    } 
}

function showSubscribeEmailForm() {
    
    jQuery("#subsBtn1").hide();
    jQuery("#email_form").show();
}

function pnSubscribeEmail(){
    if (jQuery("#email_val").val()==''){
        alert('Укажите email, пожалуйста');
        return false;
    }
    $.ajax({
        type: "POST",
        cache: false,
        data: "url="+window.location.href +"&email_val=" + jQuery("#email_val").val(),
        url: "/push/PNSubscriber.php?email=1",
        success: function(data) {
            //alert(data);
            alert('Вы успешно подписались!');
            jQuery("#email_form").hide();
        }
    });
}


/**
 * helper while testing
 * unsubscribe Push notifications
 */
async function pnUnsubscribe() {
    var swReg = null;
    if (pnAvailable()) {
        // unfortunately there is no function to reset Notification permission...
        // unregister service worker
        await pnUnregisterSW();
    }
}

/**
 * helper while testing
 * update service worker.
 * works not correct on each browser/os -> sometimes brwoser have to
 * be restarted to update service worker
 */
async function pnUpdate() {
    var swReg = null;
    if (pnAvailable()) {
        // unfortunately there is no function to reset Notification permission...
        // unregister service worker
        await pnUpdateSW();
    }
}

/**
 * helper while testing
 * check if PN already subscribed
 */
async function pnSubscribed() {
    var swReg;
    if (pnAvailable()) {
        swReg = await navigator.serviceWorker.getRegistration();
    }
    return (swReg !== undefined);
}

/**
 * checks whether all requirements for PN are met
 * 1. have to run in secure context
 *    - window.isSecureContext = true
 * 2. browser should implement at least
 *    - navigatpr.serviceWorker
 *    - window.PushManager
 *    - window.Notification
 *    
 * @returns boolen
 */
function pnAvailable() {
    var bAvailable = false;
    if (window.isSecureContext) {
       // running in secure context - check for available Push-API
        bAvailable = (('serviceWorker' in navigator) && 
		              ('PushManager' in window) && 
					  ('Notification' in window)); 
    } else {
        console.log('site have to run in secure context!');
    }
    return bAvailable;
}

function successSW(){
    $.ajax({
        type: "POST",
        cache: false,
        data: "url="+window.location.href,
        url: "/push/PNSubscriber.php?success=1",
        success: function(data) {
            //alert(data);
            alert('Вы успешно подписались!');
        }
    });
}

/**
 * register the service worker.
 * there is no check for multiple registration necessary - browser/Push-API
 * takes care if same service-worker ist already registered
 */
async function pnRegisterSW() {
    navigator.serviceWorker.register('/PNServiceWorker9.js')
        .then((swReg) => {
            // registration worked
            console.log('Registration succeeded. Scope is ' + swReg.scope);
            successSW();
        }).catch((error) => {
            // registration failed
            console.log('Registration failed with ' + error);
        });
}

/**
 * helper while testing
 * unregister the service worker.
 */
async function pnUnregisterSW() {
    navigator.serviceWorker.getRegistration()
        .then(function(reg) {
            reg.unregister()
                .then(function(bOK) {
                    if (bOK) {
                        console.log('unregister service worker succeeded.');
                    } else {
                        console.log('unregister service worker failed.');
                    }
                });
        });
}

/**
 * helper while testing
 * update service worker.
 */
async function pnUpdateSW() {
    navigator.serviceWorker.getRegistration()
        .then(function(reg) {
            reg.update()
                .then(function(bOK) {
                    if (bOK) {
                        console.log('update of service worker succeeded.');
                    } else {
                        console.log('update of service worker failed.');
                    }
                });
        });
}
