/**
 * Tests E2E — Persistance des donnees
 *
 * Verifie que les donnees (nom de DD, etc.) survivent
 * a la fermeture et reouverture de l'application.
 */
import { test as base, expect } from '@playwright/test';
import { _electron as electron } from '@playwright/test';
import path from 'path';
import fs from 'fs';

const MAIN_PATH = path.resolve(__dirname, '../../dist-electron/main.js');
const USER_DATA_DIR = path.resolve(__dirname, '../../.e2e-userdata-persistence');

function cleanDir(dir: string) {
  try {
    if (fs.existsSync(dir)) {
      fs.rmSync(dir, { recursive: true, force: true });
    }
  } catch {
    // Ignore EPERM on Windows — le dossier sera ecrase au prochain lancement
  }
}

// Fixture speciale qui permet de relancer l'app
const test = base.extend<{}>({});

test.describe('Persistance des donnees', () => {
  // Nettoyer les donnees avant le test
  test.beforeAll(() => {
    cleanDir(USER_DATA_DIR);
  });

  test.afterAll(() => {
    cleanDir(USER_DATA_DIR);
  });

  test('Le nom d\'une dragodinde persiste apres fermeture et reouverture', async () => {
    // --- Session 1 : creer un enclos, nommer la DD ---
    const app1 = await electron.launch({
      args: [MAIN_PATH],
      env: {
        ...process.env,
        ELECTRON_USER_DATA_DIR: USER_DATA_DIR,
      },
    });

    const page1 = await app1.firstWindow();
    await page1.waitForLoadState('domcontentloaded');
    await page1.waitForSelector('.app-shell', { timeout: 15000 });

    // L'app demarre sans enclos — en creer un (il contient deja 1 DD)
    await page1.click('#add-enclos-btn');
    await page1.waitForSelector('.sb-item .sb-dot', { timeout: 5000 });

    // Naviguer vers le premier enclos
    const firstEnclos1 = page1.locator('.sb-item[data-view]').filter({
      has: page1.locator('.sb-dot'),
    }).first();
    await firstEnclos1.click();
    await expect(page1.locator('.enclos-view')).toBeVisible({ timeout: 5000 });

    // L'enclos contient deja 1 DD (creee avec l'enclos)
    await expect(page1.locator('.dd-grid .dd-card')).toHaveCount(1, { timeout: 5000 });

    // Renommer la DD (trouver l'input de nom dans la carte DD)
    const ddNameInput = page1.locator('.dd-card .dd-name').first();
    await ddNameInput.click();
    await ddNameInput.fill('TestPersist42');
    await ddNameInput.press('Enter');

    // Attendre que la sauvegarde soit effectuee
    await page1.waitForTimeout(1000);

    // Fermer l'app
    await app1.close();

    // --- Session 2 : verifier que la DD est toujours la ---
    const app2 = await electron.launch({
      args: [MAIN_PATH],
      env: {
        ...process.env,
        ELECTRON_USER_DATA_DIR: USER_DATA_DIR,
      },
    });

    const page2 = await app2.firstWindow();
    await page2.waitForLoadState('domcontentloaded');
    await page2.waitForSelector('.app-shell', { timeout: 15000 });

    // Naviguer vers le premier enclos
    const firstEnclos2 = page2.locator('.sb-item[data-view]').filter({
      has: page2.locator('.sb-dot'),
    }).first();
    await firstEnclos2.click();
    await expect(page2.locator('.enclos-view')).toBeVisible({ timeout: 5000 });

    // Verifier que la DD est toujours presente
    await expect(page2.locator('.dd-grid .dd-card')).toHaveCount(1, { timeout: 5000 });

    // Verifier que le nom persiste
    const ddNameInput2 = page2.locator('.dd-card .dd-name').first();
    await expect(ddNameInput2).toHaveValue('TestPersist42', { timeout: 5000 });

    await app2.close();
  });
});
