/** WAITLIST: Warteliste/Nachfrage — Liste, Anlegen, Status setzen, "nur offene" filtern. */
import { acceptNextDialog, de, expect, gotoSection, skipUnlessMock, test } from './fixtures'

const t = de.pages.warteliste

test('Warteliste ist über die Navigation erreichbar und zeigt Seed-Einträge', async ({ page }) => {
  skipUnlessMock()
  await gotoSection(page, de.nav.waitingList)
  await expect(page.getByRole('heading', { name: t.title, exact: true })).toBeVisible()

  // Seed: ein Kontakt-Link + ein freitextlicher Name.
  await expect(page.getByRole('link', { name: 'Zoohandlung Meier' })).toBeVisible()
  await expect(page.getByText('Herr Maier')).toBeVisible()
})

test('"Nur offene" filtert erfüllte Einträge aus', async ({ page }) => {
  skipUnlessMock()
  await page.goto('/warteliste')
  await expect(page.getByText('Herr Maier')).toBeVisible() // erfüllt

  await page.getByLabel(t.onlyOpen).check()
  await expect(page.getByText('Herr Maier')).toHaveCount(0)
  await expect(page.getByRole('link', { name: 'Zoohandlung Meier' })).toBeVisible() // offen
})

test('Neuer Eintrag anlegen erscheint in der Liste', async ({ page, mockDb }) => {
  skipUnlessMock()
  await page.goto('/warteliste')

  await page.getByRole('button', { name: `+ ${t.newButton}` }).click()
  const form = page.getByRole('form', { name: t.formTitleNew })
  await expect(form).toBeVisible()

  await form.getByLabel(t.fields.contactName).fill('Neuinteressent Test')
  await form.getByLabel(t.fields.wishColor).selectOption({ label: 'Schwarz' })
  await form.getByLabel(t.fields.wishGender).selectOption({ label: t.wishGender.male })
  await form.getByRole('button', { name: t.save }).click()

  await expect(page.getByText(de.common.saved)).toBeVisible()
  await expect(page.getByText('Neuinteressent Test')).toBeVisible()

  expect(mockDb).not.toBeNull()
  const created = mockDb!.waitingList.find((e) => e.contactName === 'Neuinteressent Test')
  expect(created).toBeTruthy()
  expect(created).toMatchObject({ status: 'offen', wishColor: 'Schwarz', wishGender: 'male' })
})

test('Status je Eintrag direkt umstellbar', async ({ page, mockDb }) => {
  skipUnlessMock()
  await page.goto('/warteliste')

  // Status-Select des offenen Seed-Eintrags (Zoohandlung Meier) auf "erfüllt" stellen.
  const statusSelect = page.getByLabel(`${t.fields.status} Zoohandlung Meier`)
  await statusSelect.selectOption({ label: t.status.erfuellt })
  await expect(page.getByText(de.common.saved)).toBeVisible()

  expect(mockDb!.waitingList.find((e) => e.id === 'wl-seed-1')?.status).toBe('erfuellt')
})

test('Eintrag löschen entfernt ihn aus der Liste', async ({ page, mockDb }) => {
  skipUnlessMock()
  await page.goto('/warteliste')
  await expect(page.getByText('Herr Maier')).toBeVisible()

  acceptNextDialog(page)
  // Löschen-Button im Karten-Block von Herr Maier (zweiter Eintrag).
  const card = page.locator('li', { hasText: 'Herr Maier' })
  await card.getByRole('button', { name: t.delete }).click()

  await expect(page.getByText(de.common.deleted)).toBeVisible()
  await expect(page.getByText('Herr Maier')).toHaveCount(0)
  expect(mockDb!.waitingList.find((e) => e.id === 'wl-seed-2')).toBeUndefined()
})
