/**
 * Sprint UI-deep, пункт 5: Сотрудники + Роли.
 * Бутстрап создаёт «Администратор» (system) роль и одного Employee
 * (account-owner) для signup'нувшегося юзера. Проверяем:
 *  - Owner-карточка с бейджем (нельзя удалить себя)
 *  - Создание новой роли через UI
 *  - Создание нового сотрудника, привязка к новой роли
 *  - Edit, Fire/Delete с ConfirmDialog
 */
import { test, expect } from '@playwright/test'
import { apiSignup, attachSession, watchPage, expectNoErrors } from '../lib/ui.js'

test.describe('UI-5 employees + roles', () => {
  test.describe.configure({ mode: 'serial' })

  test('5.1 Роли: bootstrap «Администратор» + create новой', async ({ page }) => {
    const sess = await apiSignup('emp51')
    const errs = watchPage(page)
    await attachSession(page, sess, '/settings/employee-roles')
    await page.waitForLoadState('networkidle')

    // Bootstrap-role «Администратор»
    await expect(page.locator('tbody').getByText(/администратор/i).first()).toBeVisible({ timeout: 5_000 })

    // Create — открывает wizard «выберите шаблон»
    await page.getByRole('button', { name: /добавить|создать/i }).first().click()
    const wizard = page.locator('[role="dialog"]').first()
    await expect(wizard).toBeVisible({ timeout: 5_000 })
    // По умолчанию выбран «Пустой». Жмём «Продолжить».
    await wizard.getByRole('button', { name: /продолжить/i }).click()
    // Открылась реальная edit-форма с полем Название
    const dialog = page.locator('[role="dialog"]').first()
    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, 'roles create')
  })

  test('5.2 Сотрудники: owner-record + создание второго', async ({ page }) => {
    const sess = await apiSignup('emp52')
    const errs = watchPage(page)
    await attachSession(page, sess, '/settings/employees')
    await page.waitForLoadState('networkidle')

    // Owner — первый Employee созданный bootstrap'ом при signup
    await page.locator('tbody tr').first().waitFor({ timeout: 10_000 })
    const ownerRow = page.locator('tbody tr').first()
    await expect(ownerRow).toContainText(sess.email)

    // Create нового сотрудника
    await page.getByRole('button', { name: /добавить|создать|^plus/i }).first().click()
    const dialog = page.locator('[role="dialog"]').first()
    await expect(dialog).toBeVisible({ timeout: 5_000 })
    await dialog.getByLabel(/фамилия/i).first().fill('Иванов')
    await dialog.getByLabel(/^имя/i).first().fill('Иван')
    // Чтобы избежать «createAccount без email» — заполним email.
    await dialog.getByLabel(/email/i).first().fill(`ivanov.${Date.now()}@food-market.local`)

    // Роль: radio-картинки. «Администратор» по умолчанию выбран в form.
    const radios = dialog.locator('input[type="radio"]')
    await expect(radios.first()).toBeAttached({ timeout: 5_000 })

    const saveBtn = dialog.getByRole('button', { name: /сохранить/i })
    await expect(saveBtn).toBeEnabled({ timeout: 5_000 })
    await saveBtn.click()
    // После save может появиться one-shot модалка «Учётная запись создана»
    // (если createAccount=true и заполнен email). Закроем кнопкой «Готово».
    const credsModal = page.locator('[role="dialog"]').filter({ hasText: /Учётная запись создана|Временный пароль/i })
    const credsCount = await credsModal.first().waitFor({ timeout: 5_000 }).then(() => 1).catch(() => 0)
    if (credsCount) {
      await credsModal.getByRole('button', { name: /готово/i }).click()
    }
    // Проверяем что edit-модалка ушла
    await page.locator('[role="dialog"]').first().waitFor({ state: 'detached', timeout: 8_000 }).catch(() => {})

    // На списке появилась запись «Иванов Иван»
    await expect(page.locator('tbody').getByText(/Иванов/).first()).toBeVisible({ timeout: 8_000 })

    expectNoErrors(errs, 'employees create')
  })

  test('5.3 Owner записи нельзя удалить — кнопка disabled / отсутствует', async ({ page }) => {
    const sess = await apiSignup('emp53')
    const errs = watchPage(page)
    await attachSession(page, sess, '/settings/employees')
    await page.waitForLoadState('networkidle')

    // Открываем owner-запись
    await page.locator('tbody tr').first().click()
    const dialog = page.locator('[role="dialog"]').first()
    await expect(dialog).toBeVisible({ timeout: 5_000 })

    // В модалке у owner-record не должно быть Уволить/Удалить или они должны
    // быть disabled. Проверка: кнопка Удалить не enabled.
    const deleteBtn = dialog.getByRole('button', { name: /удалить/i })
    const fireBtn = dialog.getByRole('button', { name: /увол/i })
    const visibleDelete = await deleteBtn.count()
    const visibleFire = await fireBtn.count()
    // Хотя бы одна из них либо отсутствует, либо disabled.
    if (visibleDelete > 0) {
      // если есть — должна быть disabled или открывать конфирм с какой-то блокировкой
      const enabled = await deleteBtn.first().isEnabled().catch(() => false)
      expect(enabled, 'Owner Delete button should be disabled / absent').toBeFalsy()
    }
    if (visibleFire > 0) {
      const enabled = await fireBtn.first().isEnabled().catch(() => false)
      expect(enabled, 'Owner Fire button should be disabled / absent').toBeFalsy()
    }

    expectNoErrors(errs, 'owner not deletable')
  })
})
