/**
 * GAR Simulateur Auto-Login v1.3.2
 *
 * - Lit les credentials depuis chrome.storage.session (mis par background.js)
 * - Attend que le formulaire Angular soit rendu
 * - Auto-submit après pré-remplissage
 * - Retry robuste pour le service worker
 */

(function() {
  'use strict';

  const CONFIG = {
    SELECTORS: {
      login: '#email',
      password: '#password',
      submit: 'button.flex-magnet-bottom-right, button[type="submit"], input[type="submit"], form button'
    },
    MAX_ATTEMPTS: 20,      // Nombre max de tentatives pour le formulaire
    RETRY_DELAY: 300,      // Délai entre tentatives (ms)
    AUTO_SUBMIT_DELAY: 500, // Délai avant auto-submit (ms)
    STORAGE_RETRY_COUNT: 5, // Nombre de retries pour lire le storage
    STORAGE_RETRY_DELAY: 200 // Délai entre retries storage (ms)
  };

  /**
   * Récupère les credentials depuis chrome.storage.session avec retry
   */
  async function getStoredCredentials(retryCount = 0) {
    try {
      console.log(`[GAR Autofill] Tentative lecture storage (${retryCount + 1}/${CONFIG.STORAGE_RETRY_COUNT + 1})...`);
      const data = await chrome.runtime.sendMessage({ action: 'getCredentials' });
      console.log('[GAR Autofill] Réponse du background:', data);
      return data || {};
    } catch (e) {
      console.error('[GAR Autofill] Erreur lecture chrome.storage:', e.message);

      // Retry si le service worker n'est pas prêt
      if (retryCount < CONFIG.STORAGE_RETRY_COUNT) {
        console.log(`[GAR Autofill] Retry dans ${CONFIG.STORAGE_RETRY_DELAY}ms...`);
        await new Promise(r => setTimeout(r, CONFIG.STORAGE_RETRY_DELAY));
        return getStoredCredentials(retryCount + 1);
      }
      return {};
    }
  }

  /**
   * Marque les credentials comme utilisés
   */
  async function markUsed() {
    try {
      await chrome.runtime.sendMessage({ action: 'markUsed' });
    } catch (e) {
      console.error('[GAR Autofill] Erreur markUsed:', e);
    }
  }

  /**
   * Efface les credentials
   */
  async function clearCredentials() {
    try {
      await chrome.runtime.sendMessage({ action: 'clearCredentials' });
      console.log('[GAR Autofill] Credentials effacés');
    } catch (e) {
      console.error('[GAR Autofill] Erreur clearCredentials:', e);
    }
  }

  function fillInput(selector, value) {
    const input = document.querySelector(selector);
    if (!input) return false;

    // Focus pour être sûr
    input.focus();

    // Effacer complètement
    input.value = '';
    input.dispatchEvent(new Event('input', { bubbles: true }));

    // Remplir avec la nouvelle valeur
    input.value = value;
    input.dispatchEvent(new Event('input', { bubbles: true }));
    input.dispatchEvent(new Event('change', { bubbles: true }));
    input.dispatchEvent(new Event('blur', { bubbles: true }));

    console.log(`[GAR Autofill] Input ${selector} rempli avec:`, value.substring(0, 20) + '...');
    return true;
  }

  async function fillForm(credentials) {
    console.log('[GAR Autofill] 📝 Remplissage du formulaire pour:', credentials.login);

    const loginOk = fillInput(CONFIG.SELECTORS.login, credentials.login);
    const passwordOk = fillInput(CONFIG.SELECTORS.password, credentials.password);

    if (loginOk && passwordOk) {
      console.log('[GAR Autofill] ✅ Formulaire pré-rempli:', credentials.login);

      // Marquer comme utilisé ET désactiver forceLogout (très important!)
      await markUsed();
      try {
        await chrome.runtime.sendMessage({ action: 'disableForceLogout' });
        console.log('[GAR Autofill] 🚫 forceLogout désactivé');
      } catch (e) {
        console.error('[GAR Autofill] Erreur disableForceLogout:', e);
      }

      // Auto-submit après un court délai
      setTimeout(() => {
        const submitBtn = document.querySelector(CONFIG.SELECTORS.submit);
        if (submitBtn) {
          console.log('[GAR Autofill] 🚀 Auto-submit...', submitBtn.className);

          // Méthode 1: PointerEvent (pour Angular moderne)
          const rect = submitBtn.getBoundingClientRect();
          const x = rect.left + rect.width / 2;
          const y = rect.top + rect.height / 2;
          submitBtn.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, clientX: x, clientY: y }));
          submitBtn.dispatchEvent(new PointerEvent('pointerup', { bubbles: true, clientX: x, clientY: y }));
          submitBtn.dispatchEvent(new PointerEvent('click', { bubbles: true, clientX: x, clientY: y }));

          // Méthode 2: click natif
          submitBtn.click();

          // Méthode 3: form.requestSubmit() (fallback)
          setTimeout(() => {
            const form = submitBtn.closest('form');
            if (form && typeof form.requestSubmit === 'function') {
              console.log('[GAR Autofill] 📤 Fallback requestSubmit()');
              form.requestSubmit();
            }
          }, 100);

          console.log('[GAR Autofill] ✅ Events dispatched');
        } else {
          console.warn('[GAR Autofill] ⚠️ Bouton submit non trouvé');
        }
      }, CONFIG.AUTO_SUBMIT_DELAY);
      return true;
    }
    console.error('[GAR Autofill] ❌ Échec remplissage - login:', loginOk, 'password:', passwordOk);
    return false;
  }

  /**
   * Attend que le formulaire soit présent puis le remplit
   */
  function waitForFormAndFill(credentials, attempt = 1) {
    const loginInput = document.querySelector(CONFIG.SELECTORS.login);
    const passwordInput = document.querySelector(CONFIG.SELECTORS.password);

    if (loginInput && passwordInput) {
      console.log(`[GAR Autofill] Formulaire trouvé (tentative ${attempt})`);
      fillForm(credentials);
    } else if (attempt < CONFIG.MAX_ATTEMPTS) {
      console.log(`[GAR Autofill] Formulaire non trouvé, tentative ${attempt}/${CONFIG.MAX_ATTEMPTS}...`);
      setTimeout(() => waitForFormAndFill(credentials, attempt + 1), CONFIG.RETRY_DELAY);
    } else {
      console.error('[GAR Autofill] ❌ Formulaire introuvable après max tentatives');
    }
  }

  async function main() {
    console.log('[GAR Autofill] content.js v1.3.3 chargé sur:', window.location.href);

    // Attendre que le DOM soit prêt
    async function onDomReady() {
      console.log('[GAR Autofill] DOM prêt, récupération credentials...');

      // Récupérer les credentials depuis chrome.storage.session (avec retry)
      const data = await getStoredCredentials();

      console.log('[GAR Autofill] Storage data:', {
        hasCredentials: !!data.garfill_credentials,
        forceLogout: data.garfill_force_logout,
        redirect: data.garfill_redirect,
        timestamp: data.garfill_timestamp,
        age: data.garfill_timestamp ? (Date.now() - data.garfill_timestamp) + 'ms' : 'N/A'
      });

      if (data.garfill_credentials) {
        const credentials = data.garfill_credentials;

        // Vérifier que le timestamp est récent (< 2 minutes pour laisser le temps du logout)
        const age = Date.now() - (data.garfill_timestamp || 0);
        if (age > 120000) {
          console.log('[GAR Autofill] Credentials trop anciens (' + age + 'ms), ignorés');
          await clearCredentials();
          return;
        }

        console.log('[GAR Autofill] ✅ Credentials valides trouvés:', credentials.login);
        waitForFormAndFill(credentials);
      } else {
        console.log('[GAR Autofill] Pas de credentials dans storage');

        // Fallback: vérifier les paramètres URL (cas direct sans redirect)
        const urlParams = new URLSearchParams(window.location.search);
        const garfill = urlParams.get('garfill');
        if (garfill) {
          try {
            const credentials = JSON.parse(atob(garfill));
            if (credentials.login && credentials.password) {
              console.log('[GAR Autofill] Credentials depuis URL:', credentials.login);
              waitForFormAndFill(credentials);
            }
          } catch (e) {
            console.error('[GAR Autofill] Erreur décodage garfill URL:', e);
          }
        } else {
          console.log('[GAR Autofill] Aucun credentials trouvé (ni storage ni URL)');
        }
      }
    }

    // Attendre DOM ready
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', onDomReady);
    } else {
      // Petit délai pour laisser le service worker démarrer
      setTimeout(onDomReady, 100);
    }
  }

  main();
})();
