/**
 * Tests E2E — Toast, ConfirmModal et Undo
 *
 * Verifie que les feedbacks UI (toast, modale de confirmation,
 * annulation) fonctionnent correctement.
 */
import { test, expect } from './electron-app';

test.describe('Toast notifications', () => {
  test('Toast success apparait apres suppression d\'une dragodinde', async ({ page }) => {
    // Naviguer vers le premier enclos
    const firstEnclos = page.locator('.sb-item[data-view]').filter({
      has: page.locator('.sb-dot'),
    }).first();
    await firstEnclos.click();
    await expect(page.locator('.enclos-view')).toBeVisible({ timeout: 5000 });

    // Ajouter une 2e DD pour pouvoir en supprimer une
    await page.click('button:has-text("Ajouter une Dragodinde")');
    await expect(page.locator('.dd-grid .dd-card')).toHaveCount(2, { timeout: 5000 });

    // Cliquer sur le bouton supprimer de la premiere DD
    await page.locator('.dd-del').first().click();

    // La modale de confirmation doit apparaitre
    await expect(page.locator('.confirm-overlay:not(.confirm-hidden)')).toBeVisible({ timeout: 3000 });
    await expect(page.locator('.confirm-title')).toHaveText('Retirer la dragodinde');

    // Confirmer la suppression
    await page.click('.confirm-btn-ok');

    // Le toast success doit apparaitre avec le bouton Annuler
    await expect(page.locator('.toast-success')).toBeVisible({ timeout: 3000 });
    await expect(page.locator('.toast-msg')).toContainText('Dragodinde retirée');
    await expect(page.locator('.toast-action')).toBeVisible();
  });
});

test.describe('ConfirmModal', () => {
  test('Annuler la modale ne supprime pas la DD', async ({ page }) => {
    // Naviguer vers le premier enclos
    const firstEnclos = page.locator('.sb-item[data-view]').filter({
      has: page.locator('.sb-dot'),
    }).first();
    await firstEnclos.click();
    await expect(page.locator('.enclos-view')).toBeVisible({ timeout: 5000 });

    // Ajouter une 2e DD
    await page.click('button:has-text("Ajouter une Dragodinde")');
    await expect(page.locator('.dd-grid .dd-card')).toHaveCount(2, { timeout: 5000 });

    // Cliquer supprimer
    await page.locator('.dd-del').first().click();
    await expect(page.locator('.confirm-overlay:not(.confirm-hidden)')).toBeVisible({ timeout: 3000 });

    // Annuler
    await page.click('.confirm-btn-cancel');

    // La modale disparait, les 2 DD sont toujours la
    await expect(page.locator('.confirm-overlay.confirm-hidden')).toBeAttached({ timeout: 3000 });
    await expect(page.locator('.dd-grid .dd-card')).toHaveCount(2);
  });

  test('Cliquer en dehors de la modale annule', async ({ page }) => {
    const firstEnclos = page.locator('.sb-item[data-view]').filter({
      has: page.locator('.sb-dot'),
    }).first();
    await firstEnclos.click();
    await expect(page.locator('.enclos-view')).toBeVisible({ timeout: 5000 });

    await page.click('button:has-text("Ajouter une Dragodinde")');
    await expect(page.locator('.dd-grid .dd-card')).toHaveCount(2, { timeout: 5000 });

    await page.locator('.dd-del').first().click();
    await expect(page.locator('.confirm-overlay:not(.confirm-hidden)')).toBeVisible({ timeout: 3000 });

    // Cliquer sur l'overlay (pas la box)
    await page.locator('.confirm-overlay').click({ position: { x: 10, y: 10 } });

    // Les 2 DD sont toujours la
    await expect(page.locator('.dd-grid .dd-card')).toHaveCount(2);
  });
});

test.describe('Undo via toast', () => {
  test('Le bouton Annuler dans le toast restaure la DD supprimee', async ({ page }) => {
    const firstEnclos = page.locator('.sb-item[data-view]').filter({
      has: page.locator('.sb-dot'),
    }).first();
    await firstEnclos.click();
    await expect(page.locator('.enclos-view')).toBeVisible({ timeout: 5000 });

    // Ajouter une 2e DD
    await page.click('button:has-text("Ajouter une Dragodinde")');
    await expect(page.locator('.dd-grid .dd-card')).toHaveCount(2, { timeout: 5000 });

    // Supprimer la premiere DD
    await page.locator('.dd-del').first().click();
    await expect(page.locator('.confirm-overlay:not(.confirm-hidden)')).toBeVisible({ timeout: 3000 });
    await page.click('.confirm-btn-ok');

    // Attendre le toast avec le bouton Annuler
    await expect(page.locator('.toast-action')).toBeVisible({ timeout: 3000 });

    // Cliquer sur Annuler — l'app recharge
    await page.locator('.toast-action').click();

    // Apres reload, la page se recharge — attendre le shell
    await page.waitForSelector('.app-shell', { timeout: 15000 });

    // Naviguer a nouveau vers l'enclos
    const enclosAfter = page.locator('.sb-item[data-view]').filter({
      has: page.locator('.sb-dot'),
    }).first();
    await enclosAfter.click();
    await expect(page.locator('.enclos-view')).toBeVisible({ timeout: 5000 });

    // Les 2 DD doivent etre restaurees
    await expect(page.locator('.dd-grid .dd-card')).toHaveCount(2, { timeout: 5000 });
  });
});
