/**
 * Setup simplifié pour FoundryVTT E2E Tests
 * 
 * Environnement existant :
 * - Serveur FoundryVTT sur https://localhost:31000
 * - Monde déjà disponible
 * - Utilisateur: gamemaster (pas de mot de passe)
 * - Module Scrying Pool déjà installé
 * 
 * Ce setup vérifie simplement que tout est accessible.
 */

import { chromium } from '@playwright/test';

const FOUNDRY_URL = 'https://localhost:31000';
const TEST_USER = 'gamemaster';

/**
 * Vérifie que FoundryVTT est accessible
 */
async function verifyFoundryAccessible(page) {
  console.log('🔍 Vérification de l\'accès à FoundryVTT...');
  
  try {
    await page.goto(FOUNDRY_URL, {
      timeout: 30000,
      waitUntil: 'domcontentloaded',
    });
    
    // Attendre un élément Foundry (le body devrait exister)
    await page.waitForSelector('body', { timeout: 10000 });
    
    console.log('✅ FoundryVTT est accessible sur https://localhost:31000');
    
    // Vérifier que le module est chargé (en mode GM)
    const title = await page.title();
    console.log(`📖 Titre de la page: ${title}`);
    
  } catch (error) {
    console.error('❌ Impossible de se connecter à FoundryVTT:', error.message);
    console.error('💡 Vérifiez que:');
    console.error('   - FoundryVTT est en cours d\'exécution sur https://localhost:31000');
    console.error('   - Le monde est accessible');
    console.error('   - Le module Scrying Pool est installé');
    throw error;
  }
}

/**
 * Vérifie que le module Scrying Pool est actif
 */
async function verifyModuleActive(page) {
  console.log('📦 Vérification du module Scrying Pool...');
  
  try {
    // Attendre que le module soit initialisé (check pour un élément spécifique)
    await page.waitForFunction(() => {
      return typeof game !== 'undefined' && 
             game.modules?.get?.('scrying-pool')?.active;
    }, { timeout: 15000 });
    
    const isActive = await page.evaluate(() => {
      const module = game.modules.get('scrying-pool');
      return module?.active || false;
    });
    
    if (isActive) {
      console.log('✅ Module Scrying Pool est actif');
    } else {
      console.warn('⚠️  Module Scrying Pool n\'est pas actif');
      console.warn('   Essayez de recharger la page (Ctrl+R)');
    }
  } catch (error) {
    console.warn('⚠️  Impossible de vérifier l\'état du module:', error.message);
  }
}

/**
 * Vérifie que l'utilisateur est GM
 */
async function verifyIsGM(page) {
  console.log('👑 Vérification du rôle GM...');
  
  try {
    const isGM = await page.evaluate(() => {
      return game.user?.isGM || false;
    });
    
    if (isGM) {
      console.log('✅ Utilisateur est GM (gamemaster)');
    } else {
      console.warn('⚠️  Utilisateur n\'est pas GM');
    }
  } catch (error) {
    console.warn('⚠️  Impossible de vérifier le rôle:', error.message);
  }
}

/**
 * Exécute le setup
 */
async function globalSetup() {
  console.log('\n🚀 Démarrage du setup E2E pour FoundryVTT...\n');
  console.log('Configuration détectée:');
  console.log('  - URL: https://localhost:31000');
  console.log('  - User: gamemaster');
  console.log('  - Monde: déjà disponible\n');
  
  const browser = await chromium.launch({
    headless: true,
    timeout: 30000,
    ignoreHTTPSErrors: true,
  });
  
  const context = await browser.newContext({
    viewport: { width: 1920, height: 1080 },
    userAgent: 'VVM-E2E-Setup/1.0',
    ignoreHTTPSErrors: true,
  });
  
  const page = await context.newPage();
  
  try {
    // Vérifier l'accès à Foundry
    await verifyFoundryAccessible(page);
    
    // Vérifier que le module est actif
    await verifyModuleActive(page);
    
    // Vérifier le rôle GM
    await verifyIsGM(page);
    
    console.log('\n✅ Setup E2E terminé avec succès !\n');
    console.log('Prêt à exécuter les tests sur:');
    console.log(`  ${FOUNDRY_URL}\n`);
    
    // Stocker des informations pour les tests
    process.env.FOUNDRY_URL = FOUNDRY_URL;
    process.env.FOUNDRY_USER = TEST_USER;
    
  } catch (error) {
    console.error('\n❌ Setup échoué:', error);
    throw error;
  } finally {
    await page.close();
    await context.close();
    await browser.close();
  }
}

export default globalSetup;
