/**
 * Global Setup for FoundryVTT E2E Tests
 * 
 * Ce script prépare l'environnement avant l'exécution des tests :
 * - Démarre le serveur FoundryVTT (si non déjà démarré)
 * - Crée un monde de test
 * - Configure les utilisateurs de test
 * - Installe le module Scrying Pool
 */

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

// Configuration du monde de test
const FOUNDRY_BASE_URL = 'http://localhost:30000';
const TEST_WORLD_NAME = 'VVM-E2E-Test-World';
const TEST_GM_USER = 'TestGM';
const TEST_PLAYER_USER = 'TestPlayer';

// Stockage global pour l'état
const globalSetup = {
  browser: null,
  context: null,
  page: null,
  worldCreated: false,
};

/**
 * Crée un monde de test dans FoundryVTT
 */
async function createTestWorld(page) {
  console.log('🌍 Creating test world...');
  
  // Naviguer vers la page de gestion des mondes
  await page.goto(`${FOUNDRY_BASE_URL}/setup`);
  
  // Attendre que la page se charge
  await page.waitForSelector('#world-list', { timeout: 30000 });
  
  // Vérifier si le monde de test existe déjà
  const worldExists = await page.locator(`#world-list [data-world-id]:has-text("${TEST_WORLD_NAME}")`).count();
  
  if (worldExists > 0) {
    console.log(`✅ Test world "${TEST_WORLD_NAME}" already exists`);
    return;
  }
  
  // Créer un nouveau monde
  await page.locator('button:has-text("Create World")').click();
  await page.waitForSelector('#create-world-dialog', { timeout: 10000 });
  
  // Remplir le formulaire
  await page.locator('#create-world-dialog input[name="worldName"]').fill(TEST_WORLD_NAME);
  await page.locator('#create-world-dialog input[name="system"]').fill('dnd5e'); // Système par défaut
  
  // Créer le monde
  await page.locator('#create-world-dialog button:has-text("Create")').click();
  
  // Attendre la confirmation
  await page.waitForSelector(`#world-list [data-world-id]:has-text("${TEST_WORLD_NAME}")`, { timeout: 15000 });
  
  console.log(`✅ Created test world: ${TEST_WORLD_NAME}`);
  globalSetup.worldCreated = true;
}

/**
 * Configure les utilisateurs de test
 */
async function configureTestUsers(page) {
  console.log('👥 Configuring test users...');
  
  // Naviguer vers la gestion des utilisateurs
  await page.goto(`${FOUNDRY_BASE_URL}/setup/users`);
  await page.waitForSelector('#users-list', { timeout: 30000 });
  
  // Vérifier/Créer l'utilisateur GM
  const gmExists = await page.locator(`#users-list [data-user-id]:has-text("${TEST_GM_USER}")`).count();
  if (gmExists === 0) {
    await page.locator('button:has-text("Add User")').click();
    await page.waitForSelector('#add-user-dialog', { timeout: 10000 });
    await page.locator('#add-user-dialog input[name="username"]').fill(TEST_GM_USER);
    await page.locator('#add-user-dialog input[name="password"]').fill('test123');
    await page.locator('#add-user-dialog select[name="role"]').selectOption('Game Master');
    await page.locator('#add-user-dialog button:has-text("Add")').click();
    await page.waitForSelector(`#users-list [data-user-id]:has-text("${TEST_GM_USER}")`, { timeout: 10000 });
    console.log(`✅ Created GM user: ${TEST_GM_USER}`);
  }
  
  // Vérifier/Créer l'utilisateur Player
  const playerExists = await page.locator(`#users-list [data-user-id]:has-text("${TEST_PLAYER_USER}")`).count();
  if (playerExists === 0) {
    await page.locator('button:has-text("Add User")').click();
    await page.waitForSelector('#add-user-dialog', { timeout: 10000 });
    await page.locator('#add-user-dialog input[name="username"]').fill(TEST_PLAYER_USER);
    await page.locator('#add-user-dialog input[name="password"]').fill('test123');
    await page.locator('#add-user-dialog select[name="role"]').selectOption('Player');
    await page.locator('#add-user-dialog button:has-text("Add")').click();
    await page.waitForSelector(`#users-list [data-user-id]:has-text("${TEST_PLAYER_USER}")`, { timeout: 10000 });
    console.log(`✅ Created Player user: ${TEST_PLAYER_USER}`);
  }
}

/**
 * Installe le module Scrying Pool
 */
async function installVVMModule(page) {
  console.log('📦 Installing Scrying Pool module...');
  
  // Naviguer vers la gestion des modules
  await page.goto(`${FOUNDRY_BASE_URL}/setup/modules`);
  await page.waitForSelector('#modules-list', { timeout: 30000 });
  
  // Vérifier si le module est déjà installé
  const moduleInstalled = await page.locator(`#modules-list [data-module-id="scrying-pool"]`).count();
  
  if (moduleInstalled > 0) {
    console.log('✅ Scrying Pool module already installed');
    return;
  }
  
  // Installer le module depuis le fichier local
  // Note: En environnement de test, le module devrait déjà être dans le dossier modules/
  // Sinon, il faut le copier manuellement
  console.log('⚠️  Module must be manually placed in FoundryVTT modules/ folder');
  console.log('   Copy scrying-pool/ to foundrydata-dev/Data/modules/');
}

/**
 * Sauvegarde l'état pour globalTeardown
 */
async function saveState() {
  process.env.FOUNDRY_TEST_WORLD = TEST_WORLD_NAME;
  process.env.FOUNDRY_TEST_GM = TEST_GM_USER;
  process.env.FOUNDRY_TEST_PLAYER = TEST_PLAYER_USER;
}

// Exécuter le setup
async function globalSetup() {
  console.log('\n🚀 Starting FoundryVTT E2E Test Setup...\n');
  
  // Créer le navigateur
  const browser = await chromium.launch({
    headless: true,
    timeout: 60000,
  });
  
  const context = await browser.newContext({
    viewport: { width: 1920, height: 1080 },
    userAgent: 'VVM-E2E-Setup/1.0',
  });
  
  const page = await context.newPage();
  
  try {
    // Se connecter (FoundryVTT local n'a pas d'authentification par défaut)
    await page.goto(FOUNDRY_BASE_URL, { timeout: 30000 });
    
    // Créer le monde de test
    await createTestWorld(page);
    
    // Configurer les utilisateurs
    await configureTestUsers(page);
    
    // Installer le module
    await installVVMModule(page);
    
    // Sauvegarder l'état
    await saveState();
    
    console.log('\n✅ FoundryVTT E2E Test Setup Complete!\n');
    console.log('📋 Configuration:');
    console.log(`   - World: ${TEST_WORLD_NAME}`);
    console.log(`   - GM User: ${TEST_GM_USER}`);
    console.log(`   - Player User: ${TEST_PLAYER_USER}`);
    console.log(`   - Foundry URL: ${FOUNDRY_BASE_URL}`);
    console.log('\n💡 Ensure FoundryVTT server is running on localhost:30000');
    console.log('💡 Ensure Scrying Pool module is in modules/ folder\n');
    
  } catch (error) {
    console.error('❌ Setup failed:', error);
    throw error;
  } finally {
    await page.close();
    await context.close();
    await browser.close();
  }
}

export default globalSetup;
