// === Push Notifications Manager ===
// Inclus via head-common.php. Expose proposerNotifications() pour les jeux.

(function() {
  'use strict';

  var VAPID_PUBLIC_KEY = window.__VAPID_PUBLIC_KEY || '';
  var SW_PATH = '/sw.js';
  var API_PATH = '/push-api.php';

  // Ne rien faire si le navigateur ne supporte pas
  if (!('serviceWorker' in navigator) || !('PushManager' in window) || !VAPID_PUBLIC_KEY) return;

  // Enregistrer le Service Worker au chargement
  var swReady = navigator.serviceWorker.register(SW_PATH).then(function(reg) {
    return reg;
  }).catch(function() {
    return null;
  });

  // Convertir la cle VAPID base64url en Uint8Array
  function urlBase64ToUint8Array(base64String) {
    var padding = '='.repeat((4 - base64String.length % 4) % 4);
    var base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
    var rawData = atob(base64);
    var outputArray = new Uint8Array(rawData.length);
    for (var i = 0; i < rawData.length; i++) {
      outputArray[i] = rawData.charCodeAt(i);
    }
    return outputArray;
  }

  // Envoyer la subscription au serveur
  function envoyerSubscription(subscription, action) {
    var data = { action: action, endpoint: subscription.endpoint };
    if (action === 'subscribe') {
      var key = subscription.getKey('p256dh');
      var auth = subscription.getKey('auth');
      data.keys = {
        p256dh: btoa(String.fromCharCode.apply(null, new Uint8Array(key))).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''),
        auth: btoa(String.fromCharCode.apply(null, new Uint8Array(auth))).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')
      };
    }
    return fetch(API_PATH, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(data)
    });
  }

  // Verifier si deja abonne
  function estDejaAbonne() {
    return swReady.then(function(reg) {
      if (!reg) return false;
      return reg.pushManager.getSubscription().then(function(sub) {
        return !!sub;
      });
    });
  }

  // S'abonner
  function sAbonner() {
    return swReady.then(function(reg) {
      if (!reg) return null;
      return reg.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY)
      }).then(function(subscription) {
        return envoyerSubscription(subscription, 'subscribe').then(function() {
          return subscription;
        });
      });
    });
  }

  // Verifier cote serveur si l'utilisateur a deja une subscription
  function estDejaAbonneServeur() {
    return fetch(API_PATH, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ action: 'check' })
    }).then(function(r) { return r.json(); }).then(function(d) {
      return !!d.subscribed;
    }).catch(function() { return false; });
  }

  // === Popup de proposition ===
  function creerPopup() {
    // Ne pas proposer si deja refuse ou accepte dans les 5 derniers jours
    var lastAsked = localStorage.getItem('push_asked_at');
    if (lastAsked && (Date.now() - parseInt(lastAsked, 10)) < 5 * 86400000) return;

    // Ne pas proposer si la permission est deja accordee ou refusee definitivement
    if (Notification.permission === 'denied') return;
    if (Notification.permission === 'granted') {
      // Deja autorise, verifier qu'on est bien abonne
      estDejaAbonne().then(function(abonne) {
        if (!abonne) sAbonner();
      });
      return;
    }

    // Ne pas proposer si deja abonne depuis un autre domaine (meme user_id)
    estDejaAbonneServeur().then(function(dejaAbonne) {
      if (dejaAbonne) return;
      afficherPopup();
    });
  }

  function afficherPopup() {

    var overlay = document.createElement('div');
    overlay.className = 'push-popup-overlay';
    overlay.innerHTML =
      '<div class="push-popup">'
      + '<div class="push-popup-icon">&#128276;</div>'
      + '<div class="push-popup-title">Rester inform\u00e9 ?</div>'
      + '<div class="push-popup-text">Recevez une notification quand il y a du nouveau sur les jeux (d\u00e9fis, tournois, nouveaut\u00e9s).</div>'
      + '<div class="push-popup-btns">'
      + '<button class="push-popup-btn push-popup-accept">Activer</button>'
      + '<button class="push-popup-btn push-popup-decline">Non merci</button>'
      + '</div>'
      + '</div>';

    document.body.appendChild(overlay);

    // Animation d'entree
    requestAnimationFrame(function() {
      overlay.classList.add('push-popup-visible');
    });

    overlay.querySelector('.push-popup-accept').addEventListener('click', function() {
      fermerPopup(overlay);
      Notification.requestPermission().then(function(permission) {
        if (permission === 'granted') {
          sAbonner().then(function() {
            localStorage.setItem('push_asked_at', String(Date.now()));
          });
        } else {
          localStorage.setItem('push_asked_at', String(Date.now()));
        }
      });
    });

    overlay.querySelector('.push-popup-decline').addEventListener('click', function() {
      localStorage.setItem('push_asked_at', String(Date.now()));
      fermerPopup(overlay);
    });
  }

  function fermerPopup(overlay) {
    overlay.classList.remove('push-popup-visible');
    setTimeout(function() { overlay.remove(); }, 300);
  }

  // Fonction globale appelee par les jeux apres une partie
  window.proposerNotifications = function() {
    // Petit delai pour ne pas interrompre l'affichage du resultat
    setTimeout(creerPopup, 2000);
  };

})();
