/**
 * Fichier  : assets/js/pwa-install.js
 * Auteur   : KREMER Régis
 * Version  : 2.6.13
 * Date     : 2026-07-08
 * Description : JS — Proposition d'installation PWA MageStock PC/mobile/tablette.
 *
 * Changelog :
 *   v2.6.8 (2026-07-08) — Ajout bannière installable, support Android/desktop,
 *                      consignes iOS et enregistrement SW pour tous les rôles.
 *   v2.6.10 (2026-07-08) — Enregistrement SW via MageStockRuntime basePath.
 *   v2.6.13 (2026-07-08) — Aide d'installation par navigateur : Chrome, Edge,
 *                      Safari iOS/macOS, Firefox et Samsung Internet.
 */
(function(){
  'use strict';

  const STATE_KEY = 'sm_pwa_install_dismissed_at';
  const HELP_DELAY_MS = 1200;
  let deferredPrompt = null;
  let promptSeen = false;

  function ua(){ return navigator.userAgent || ''; }
  function isStandalone(){
    return (window.matchMedia && window.matchMedia('(display-mode: standalone)').matches) || window.navigator.standalone === true;
  }
  function isIOS(){
    return /iphone|ipad|ipod/i.test(ua()) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);
  }
  function isAndroid(){ return /android/i.test(ua()); }
  function isFirefox(){ return /firefox|fxios/i.test(ua()); }
  function isEdge(){ return /edg\//i.test(ua()); }
  function isSamsung(){ return /samsungbrowser/i.test(ua()); }
  function isSafari(){ return /^((?!chrome|android|crios|fxios|edg|samsungbrowser).)*safari/i.test(ua()); }
  function isSecure(){ return location.protocol === 'https:' || location.hostname === 'localhost' || location.hostname === '127.0.0.1'; }
  function runtimeUrl(path){
    const raw = String(path || '');
    if(/^(?:https?:)?\/\//i.test(raw) || raw.charAt(0) === '/') return raw;
    const runtime = window.MageStockRuntime || {};
    const base = String(runtime.basePath || '').replace(/\/+$/, '');
    return (base ? base : '') + '/' + raw.replace(/^\.\//, '').replace(/^\/+/, '');
  }
  function swUrl(){ return runtimeUrl('sw.js'); }

  function dismissedRecently(){
    try {
      const t = parseInt(localStorage.getItem(STATE_KEY) || '0', 10);
      return t && (Date.now() - t) < 7*24*60*60*1000;
    } catch(e){ return false; }
  }
  function dismiss(){
    try { localStorage.setItem(STATE_KEY, String(Date.now())); } catch(e){}
    hide();
  }
  function el(){ return document.getElementById('pwaInstallCard'); }
  function hide(){ const node = el(); if(node) node.hidden = true; }

  function copyForMode(mode){
    if(mode === 'prompt') return {
      title: 'Installer MageStock',
      text: 'Ajoutez MageStock comme application sur cet appareil pour un accès rapide en plein écran.',
      button: 'Installer'
    };
    if(mode === 'ios') return {
      title: 'Installer MageStock sur iPhone / iPad',
      text: 'Dans Safari : bouton Partager, puis Ajouter à l’écran d’accueil. Les notifications iOS nécessitent l’application installée.',
      button: 'Compris'
    };
    if(mode === 'safari') return {
      title: 'Installer MageStock avec Safari',
      text: 'Sur Mac, utilisez Fichier puis Ajouter au Dock lorsque l’option est disponible. Sur iPhone/iPad : Partager puis Ajouter à l’écran d’accueil.',
      button: 'Compris'
    };
    if(mode === 'firefox-android') return {
      title: 'Installer MageStock avec Firefox',
      text: 'Menu Firefox, puis Installer ou Ajouter à l’écran d’accueil selon votre version Android.',
      button: 'Compris'
    };
    if(mode === 'samsung') return {
      title: 'Installer MageStock avec Samsung Internet',
      text: 'Menu Samsung Internet, puis Ajouter la page à ou Installer l’application web.',
      button: 'Compris'
    };
    if(mode === 'edge') return {
      title: 'Installer MageStock avec Edge',
      text: 'Edge peut proposer l’installation automatiquement. Sinon : menu, Applications, Installer ce site en tant qu’application.',
      button: 'Compris'
    };
    if(mode === 'manual') return {
      title: 'Installation MageStock disponible',
      text: 'Utilisez le menu de votre navigateur, puis Installer l’application ou Ajouter à l’écran d’accueil si l’option est proposée.',
      button: 'Compris'
    };
    return copyForMode('prompt');
  }

  function show(mode){
    const node = el();
    if(!node || isStandalone() || dismissedRecently()) return;
    const title = node.querySelector('[data-pwa-title]');
    const text = node.querySelector('[data-pwa-text]');
    const btn = node.querySelector('[data-pwa-action]');
    const copy = copyForMode(mode || 'prompt');
    if(title) title.textContent = copy.title;
    if(text) text.textContent = copy.text;
    if(btn) btn.textContent = copy.button;
    node.dataset.mode = mode || 'prompt';
    node.hidden = false;
  }

  function manualMode(){
    if(isIOS()) return 'ios';
    if(isSamsung()) return 'samsung';
    if(isFirefox() && isAndroid()) return 'firefox-android';
    if(isFirefox()) return 'manual';
    if(isSafari()) return 'safari';
    if(isEdge()) return 'edge';
    if(isAndroid()) return 'manual';
    return 'manual';
  }

  async function registerServiceWorker(){
    if(!('serviceWorker' in navigator) || !isSecure()) return false;
    try {
      const reg = await navigator.serviceWorker.register(swUrl());
      await navigator.serviceWorker.ready;
      return !!reg;
    } catch(e){
      console.warn('[PWA] Service worker non enregistré', e);
      return false;
    }
  }

  function bind(){
    const node = el();
    if(!node) return;
    node.querySelector('[data-pwa-close]')?.addEventListener('click', dismiss);
    node.querySelector('[data-pwa-action]')?.addEventListener('click', async function(){
      if(node.dataset.mode !== 'prompt') { dismiss(); return; }
      if(!deferredPrompt){ hide(); return; }
      deferredPrompt.prompt();
      try { await deferredPrompt.userChoice; } catch(e){}
      deferredPrompt = null;
      hide();
    });
  }

  window.addEventListener('beforeinstallprompt', function(e){
    e.preventDefault();
    deferredPrompt = e;
    promptSeen = true;
    show('prompt');
  });

  window.addEventListener('appinstalled', function(){
    deferredPrompt = null;
    hide();
    try { localStorage.removeItem(STATE_KEY); } catch(e){}
    if(typeof toast === 'function') toast('MageStock est installé sur cet appareil', 'success');
  });

  document.addEventListener('DOMContentLoaded', async function(){
    bind();
    const swReady = await registerServiceWorker();
    if(!swReady || isStandalone() || !isSecure()) return;
    window.setTimeout(function(){
      if(!promptSeen && !deferredPrompt) show(manualMode());
    }, HELP_DELAY_MS);
  });

  window.MageStockPWAInstall = {
    show: show,
    hide: hide,
    registerServiceWorker: registerServiceWorker,
    isStandalone: isStandalone
  };
})();
