/**
 * BrowserDetector - Détection de navigateur et polyfills
 * 
 * Responsabilités:
 * - Détecter le navigateur et sa version
 * - Afficher un avertissement si non supporté
 * - Charger les polyfills nécessaires
 * - Tester la compatibilité des fonctionnalités
 * 
 * Validates: Requirements 15.5, 15.7
 */
class BrowserDetector {
  constructor() {
    this.browser = this.detectBrowser();
    this.supported = this.checkSupport();
  }

  /**
   * Détecter le navigateur
   * Validates: Requirements 15.5
   */
  detectBrowser() {
    const ua = navigator.userAgent;
    let browser = {
      name: 'Unknown',
      version: 0,
      engine: 'Unknown'
    };

    // Chrome
    if (ua.indexOf('Chrome') > -1 && ua.indexOf('Edg') === -1) {
      browser.name = 'Chrome';
      browser.version = parseInt(ua.match(/Chrome\/(\d+)/)[1]);
      browser.engine = 'Blink';
    }
    // Edge
    else if (ua.indexOf('Edg') > -1) {
      browser.name = 'Edge';
      browser.version = parseInt(ua.match(/Edg\/(\d+)/)[1]);
      browser.engine = 'Blink';
    }
    // Firefox
    else if (ua.indexOf('Firefox') > -1) {
      browser.name = 'Firefox';
      browser.version = parseInt(ua.match(/Firefox\/(\d+)/)[1]);
      browser.engine = 'Gecko';
    }
    // Safari
    else if (ua.indexOf('Safari') > -1 && ua.indexOf('Chrome') === -1) {
      browser.name = 'Safari';
      const match = ua.match(/Version\/(\d+)/);
      browser.version = match ? parseInt(match[1]) : 0;
      browser.engine = 'WebKit';
    }
    // IE
    else if (ua.indexOf('Trident') > -1) {
      browser.name = 'IE';
      browser.version = parseInt(ua.match(/rv:(\d+)/)[1]);
      browser.engine = 'Trident';
    }

    return browser;
  }

  /**
   * Vérifier le support du navigateur
   * Validates: Requirements 15.5
   */
  checkSupport() {
    const minVersions = {
      'Chrome': 80,  // Réduit de 90 à 80
      'Firefox': 78,  // Réduit de 88 à 78
      'Safari': 13,   // Réduit de 14 à 13
      'Edge': 80      // Réduit de 90 à 80
    };

    // IE n'est pas supporté
    if (this.browser.name === 'IE') {
      return false;
    }

    // Vérifier la version minimale
    const minVersion = minVersions[this.browser.name];
    if (minVersion && this.browser.version < minVersion) {
      return false;
    }

    // Vérifier les fonctionnalités requises (mode permissif)
    const features = this.checkFeatures();
    
    // Au lieu de vérifier toutes les fonctionnalités, on vérifie seulement les essentielles
    const essentialFeatures = features.fetch && features.promise && features.localStorage;
    
    return essentialFeatures;
  }

  /**
   * Vérifier les fonctionnalités requises
   */
  checkFeatures() {
    const features = {
      fetch: typeof fetch !== 'undefined',
      promise: typeof Promise !== 'undefined',
      localStorage: this.testLocalStorage(),
      es6: this.testES6(),
      flexbox: this.testFlexbox(),
      grid: this.testGrid()
    };

    features.all = Object.values(features).every(f => f);
    return features;
  }

  /**
   * Tester localStorage
   */
  testLocalStorage() {
    try {
      const test = '__test__';
      localStorage.setItem(test, test);
      localStorage.removeItem(test);
      return true;
    } catch (e) {
      return false;
    }
  }

  /**
   * Tester ES6
   */
  testES6() {
    try {
      // Ne pas utiliser eval() à cause du CSP
      // Tester une autre fonctionnalité ES6
      const arrow = () => {};
      const [a, b] = [1, 2];
      return true;
    } catch (e) {
      return false;
    }
  }

  /**
   * Tester Flexbox
   */
  testFlexbox() {
    const div = document.createElement('div');
    div.style.display = 'flex';
    return div.style.display === 'flex';
  }

  /**
   * Tester CSS Grid
   */
  testGrid() {
    const div = document.createElement('div');
    div.style.display = 'grid';
    return div.style.display === 'grid';
  }

  /**
   * Afficher un avertissement si non supporté
   * Validates: Requirements 15.7
   */
  showWarningIfUnsupported() {
    if (!this.supported) {
      const message = this.getUnsupportedMessage();
      // Afficher seulement dans la console au lieu de bloquer l'interface
      console.warn('Browser compatibility warning:', message);
      console.log('Browser info:', this.getBrowserInfo());
      
      // Afficher un avertissement discret (non bloquant)
      // this.showWarning(message);
    }
  }

  /**
   * Obtenir le message d'avertissement
   */
  getUnsupportedMessage() {
    if (this.browser.name === 'IE') {
      return 'Internet Explorer n\'est pas supporté. Veuillez utiliser un navigateur moderne (Chrome, Firefox, Safari, Edge).';
    }

    const minVersions = {
      'Chrome': 90,
      'Firefox': 88,
      'Safari': 14,
      'Edge': 90
    };

    const minVersion = minVersions[this.browser.name];
    if (minVersion && this.browser.version < minVersion) {
      return `Votre version de ${this.browser.name} (${this.browser.version}) est obsolète. Veuillez mettre à jour vers la version ${minVersion} ou supérieure.`;
    }

    return 'Votre navigateur ne supporte pas toutes les fonctionnalités requises. Veuillez utiliser un navigateur moderne et à jour.';
  }

  /**
   * Afficher un avertissement
   */
  showWarning(message) {
    const warning = document.createElement('div');
    warning.className = 'browser-warning';
    warning.innerHTML = `
      <div class="warning-icon">⚠️</div>
      <div class="warning-message">${this.escapeHTML(message)}</div>
      <button class="warning-close" onclick="this.parentElement.remove()">✕</button>
    `;

    // Ajouter au début du body
    document.body.insertBefore(warning, document.body.firstChild);
  }

  /**
   * Charger les polyfills nécessaires
   * Validates: Requirements 15.7
   */
  loadPolyfills() {
    const features = this.checkFeatures();

    // Polyfill pour fetch
    if (!features.fetch) {
      this.loadScript('https://cdn.jsdelivr.net/npm/whatwg-fetch@3.6.2/dist/fetch.umd.js');
    }

    // Polyfill pour Promise
    if (!features.promise) {
      this.loadScript('https://cdn.jsdelivr.net/npm/promise-polyfill@8.2.3/dist/polyfill.min.js');
    }
  }

  /**
   * Charger un script externe
   */
  loadScript(src) {
    return new Promise((resolve, reject) => {
      const script = document.createElement('script');
      script.src = src;
      script.onload = resolve;
      script.onerror = reject;
      document.head.appendChild(script);
    });
  }

  /**
   * Obtenir les informations du navigateur
   */
  getBrowserInfo() {
    return {
      ...this.browser,
      supported: this.supported,
      features: this.checkFeatures()
    };
  }

  /**
   * Échapper le HTML
   */
  escapeHTML(text) {
    const div = document.createElement('div');
    div.textContent = text;
    return div.innerHTML;
  }
}

// Initialiser automatiquement au chargement
if (typeof window !== 'undefined') {
  window.addEventListener('DOMContentLoaded', () => {
    const detector = new BrowserDetector();
    detector.showWarningIfUnsupported();
    detector.loadPolyfills();
    window.browserDetector = detector;
  });
}

// Export pour utilisation dans d'autres modules
if (typeof module !== 'undefined' && module.exports) {
  module.exports = BrowserDetector;
}
