/**
 * Sprint UI-deep, пункт 4: справочники — Контрагенты / Группы товаров /
 * Единицы измерения / Типы цен.
 *
 * Все 4 — list-страницы с модалкой создания. Прогоняем по одному
 * элементу: create через UI → edit → delete c ConfirmDialog → запись
 * исчезла. Console-errors / 5xx — fail.
 */
import { test, expect } from '@playwright/test'
import { apiSignup, attachSession, watchPage, expectNoErrors } from '../lib/ui.js'

test.describe('UI-4 references CRUD', () => {
  test.describe.configure({ mode: 'serial' })

  test('4.1 Контрагенты: create modal → edit → delete', async ({ page }) => {
    const sess = await apiSignup('refs41')
    const errs = watchPage(page)
    await attachSession(page, sess, '/catalog/counterparties')

    // CREATE через empty CTA
    await page.getByRole('button', { name: /добавить контрагента|^добавить$/i }).first().click()
    const name = `Counterparty ${Date.now()}`
    const dialog = page.locator('[role="dialog"]').first()
    await expect(dialog).toBeVisible({ timeout: 5_000 })
    await dialog.getByLabel(/название|наименование/i).first().fill(name)
    await dialog.getByRole('button', { name: /создать|сохранить/i }).click()
    await expect(dialog).not.toBeVisible({ timeout: 8_000 })

    // Запись в таблице
    await expect(page.locator('tbody').getByText(name)).toBeVisible({ timeout: 5_000 })

    // EDIT — кликаем на строку или иконку
    await page.locator('tbody').getByText(name).click()
    await expect(dialog).toBeVisible({ timeout: 5_000 })
    const newName = name + ' edited'
    await dialog.getByLabel(/название|наименование/i).first().fill(newName)
    await dialog.getByRole('button', { name: /сохранить|изменить/i }).click()
    await expect(dialog).not.toBeVisible({ timeout: 8_000 })
    await expect(page.locator('tbody').getByText(newName)).toBeVisible({ timeout: 5_000 })

    // DELETE — у CounterpartiesPage кнопка Удалить ВНУТРИ модалки edit.
    // Откроем модалку клик'ом по строке и нажмём «Удалить».
    await page.locator('tbody').getByText(newName).click()
    await expect(dialog).toBeVisible({ timeout: 5_000 })
    await dialog.getByRole('button', { name: /удалить/i }).click()
    const confirmDialog = page.locator('[aria-labelledby="confirm-dialog-title"]').first()
    await expect(confirmDialog).toBeVisible({ timeout: 5_000 })
    await confirmDialog.getByRole('button', { name: /удалить/i }).click()
    await expect(confirmDialog).not.toBeVisible({ timeout: 8_000 })
    await expect(dialog).not.toBeVisible({ timeout: 8_000 })
    await expect(page.locator('tbody').getByText(newName)).not.toBeVisible({ timeout: 5_000 })

    expectNoErrors(errs, 'counterparty CRUD')
  })

  test('4.2 Группы товаров: create через UI', async ({ page }) => {
    const sess = await apiSignup('refs42')
    const errs = watchPage(page)
    await attachSession(page, sess, '/catalog/product-groups')
    await page.waitForLoadState('networkidle')

    // На фоне есть «Все товары» (system), CTA на создание
    const addBtn = page.getByRole('button', { name: /добавить|создать|new/i }).first()
    await expect(addBtn).toBeVisible({ timeout: 5_000 })
    await addBtn.click()
    const dialog = page.locator('[role="dialog"]').first()
    await expect(dialog).toBeVisible({ timeout: 5_000 })
    const name = `Группа ${Date.now()}`
    await dialog.getByLabel(/название/i).first().fill(name)
    await dialog.getByRole('button', { name: /создать|сохранить/i }).click()
    await expect(dialog).not.toBeVisible({ timeout: 8_000 })
    // group появилась — может быть в виде дерева, проверяем по тексту
    await expect(page.getByText(name).first()).toBeVisible({ timeout: 5_000 })
    expectNoErrors(errs, 'product groups')
  })

  test('4.3 Типы цен: bootstrap «Розничная цена» уже есть, create новую', async ({ page }) => {
    const sess = await apiSignup('refs43')
    const errs = watchPage(page)
    await attachSession(page, sess, '/catalog/price-types')
    await page.waitForLoadState('networkidle')

    // Bootstrap создаёт «Розничная цена» — она должна быть в таблице
    await expect(page.locator('tbody').getByText(/розничн/i).first()).toBeVisible({ timeout: 5_000 })

    // Create через UI
    const addBtn = page.getByRole('button', { name: /добавить|создать/i }).first()
    await expect(addBtn).toBeVisible({ timeout: 5_000 })
    await addBtn.click()
    const dialog = page.locator('[role="dialog"]').first()
    await expect(dialog).toBeVisible({ timeout: 5_000 })
    const name = `Цена ${Date.now()}`
    await dialog.getByLabel(/название/i).first().fill(name)
    await dialog.getByRole('button', { name: /создать|сохранить/i }).click()
    await expect(dialog).not.toBeVisible({ timeout: 8_000 })
    await expect(page.locator('tbody').getByText(name)).toBeVisible({ timeout: 5_000 })

    expectNoErrors(errs, 'price types')
  })

  test('4.4 Единицы измерения: страница рендерится, нет console-ошибок', async ({ page }) => {
    const sess = await apiSignup('refs44')
    const errs = watchPage(page)
    await attachSession(page, sess, '/catalog/units')
    await page.waitForLoadState('networkidle')
    // Bootstrap наполняет ОКЕИ-единицы. Жде первую строку.
    await page.locator('tbody tr').first().waitFor({ timeout: 10_000 })
    expectNoErrors(errs, 'units list')
  })
})
