/**
 * Tests E2E — Workflow d'accouplement
 *
 * Navigue vers la vue Accouplement, selectionne deux parents,
 * verifie la deduction du bebe, et enregistre l'accouplement.
 */
import { test, expect } from './electron-app';

test.describe('Workflow d\'accouplement', () => {
  test.beforeEach(async ({ page }) => {
    // Naviguer vers Accouplement via la sidebar
    await page.click('.sb-item[data-view="accouplement"]');
    await expect(page.locator('.accoup-view')).toBeVisible({ timeout: 5000 });
  });

  test('Selectionner Parent 1 en cliquant sur une race', async ({ page }) => {
    // Cliquer sur la premiere race disponible dans la grille
    const firstRaceCard = page.locator('.accoup-race-card').first();
    const raceName = await firstRaceCard.locator('.accoup-race-card-name').textContent();

    await firstRaceCard.click();

    // Verifier que Parent 1 affiche la race selectionnee
    const selectedParent = page.locator('.accoup-selected-parent-name').first();
    await expect(selectedParent).toHaveText(raceName!.trim(), { timeout: 3000 });
  });

  test('Selectionner les deux parents et voir le resultat', async ({ page }) => {
    // Selectionner "Rousse" comme Parent 1
    const rousseCard = page.locator('.accoup-race-card[data-race="Rousse"]');
    await rousseCard.click();
    await expect(page.locator('.accoup-selected-parent-name').first()).toHaveText('Rousse', { timeout: 3000 });

    // Apres P1 selectionne, la grille filtre les partenaires compatibles
    // Selectionner le premier partenaire disponible comme Parent 2
    const partnerCard = page.locator('.accoup-race-card').first();
    await partnerCard.click();

    // Verifier qu'un resultat (bebe) est affiche
    // Le resultat apparait dans la zone centrale avec le texte "Resultat"
    await page.waitForTimeout(500);
    const parentNames = page.locator('.accoup-selected-parent-name');
    await expect(parentNames).toHaveCount(2, { timeout: 3000 });
  });

  test('Definir nombre de couples et bebes puis enregistrer', async ({ page }) => {
    // Selectionner P1 : Rousse
    await page.click('.accoup-race-card[data-race="Rousse"]');
    await expect(page.locator('.accoup-selected-parent-name').first()).toHaveText('Rousse', { timeout: 3000 });

    // Selectionner P2 : premier partenaire compatible
    const partnerCard = page.locator('.accoup-race-card').first();
    await partnerCard.click();
    await page.waitForTimeout(500);

    // Remplir le nombre de couples
    const couplesInput = page.locator('#accoup-couples');
    await couplesInput.click();
    await couplesInput.fill('3');

    // Remplir les bebes obtenus
    const babiesInput = page.locator('#accoup-babies');
    await babiesInput.click();
    await babiesInput.fill('2');

    // Le bouton Enregistrer devrait etre actif
    const registerBtn = page.locator('#accoup-register');
    await expect(registerBtn).toBeEnabled({ timeout: 3000 });

    // Cliquer sur Enregistrer
    await registerBtn.click();

    // Verifier que le toast success apparait
    await expect(page.locator('.toast-success')).toBeVisible({ timeout: 3000 });
    await expect(page.locator('.toast-msg')).toContainText('Accouplement enregistré');

    // Apres l'enregistrement, les parents sont reinitialises
    // On devrait voir les placeholders "Cliquer ou glisser" a nouveau
    await expect(page.locator('.accoup-placeholder')).toHaveCount(2, { timeout: 3000 });
  });

  test('Filtrer les races par generation', async ({ page }) => {
    // Cliquer sur le chip "Gen 1"
    await page.click('.accoup-gen-chip[data-gen="1"]');
    await page.waitForTimeout(300);

    // Verifier que le chip est actif
    await expect(page.locator('.accoup-gen-chip[data-gen="1"].active')).toBeVisible();

    // Toutes les races affichees devraient etre de Gen 1
    const genBadges = page.locator('.accoup-race-card-gen');
    const count = await genBadges.count();
    for (let i = 0; i < count; i++) {
      await expect(genBadges.nth(i)).toContainText('GEN 1');
    }
  });

  test('Rechercher une race par nom', async ({ page }) => {
    const searchInput = page.locator('#accoup-search-input');
    await searchInput.fill('Rousse');
    await page.waitForTimeout(300);

    // La grille devrait contenir "Rousse"
    await expect(page.locator('.accoup-race-card[data-race="Rousse"]')).toBeVisible();
  });
});
