export interface E2ETest {
  id: string;
  description: string;
  expectedResult: string;
  status: 'pass' | 'fail' | 'skip';
}

export interface E2ETestGroup {
  file: string;
  groupName: string;
  tests: E2ETest[];
}

export const e2eTestGroups: E2ETestGroup[] = [
  {
    file: 'auth.spec.ts',
    groupName: 'Аутентификация (API)',
    tests: [
      { id: 'auth-1', description: 'Вход с правильным паролем — получение access и refresh токенов', expectedResult: 'Ответ 200, оба токена присутствуют', status: 'pass' },
      { id: 'auth-2', description: 'Вход с неправильным паролем — отказ в доступе', expectedResult: 'Ответ 401', status: 'pass' },
      { id: 'auth-3', description: 'Обновление access-токена через refresh-токен', expectedResult: 'Новый access-токен в ответе', status: 'pass' },
      { id: 'auth-4', description: 'Получение профиля текущего пользователя (телефон, роль)', expectedResult: 'Ответ 200, поля phone и role', status: 'pass' },
      { id: 'auth-5', description: 'Запрос без токена к защищённому эндпоинту', expectedResult: 'Ответ 401', status: 'pass' },
    ],
  },
  {
    file: 'clients.spec.ts',
    groupName: 'Клиенты (API)',
    tests: [
      { id: 'clients-1', description: 'Получение списка клиентов с пагинацией', expectedResult: 'Массив data + поле hasMore', status: 'pass' },
      { id: 'clients-2', description: 'Координатор создаёт нового клиента', expectedResult: 'Ответ 200, клиент с id/firstName/lastName/phone', status: 'pass' },
      { id: 'clients-3', description: 'Тренер не может создать клиента', expectedResult: 'Ответ 403 (доступ запрещён)', status: 'pass' },
      { id: 'clients-4', description: 'Получение клиента по ID', expectedResult: 'Корректные данные клиента', status: 'pass' },
      { id: 'clients-5', description: 'Изоляция клиентов по club_id (RLS) — тренер видит только своих', expectedResult: 'Ответ 200, только клиенты своего клуба', status: 'pass' },
    ],
  },
  {
    file: 'rbac.spec.ts',
    groupName: 'Ролевой доступ — RBAC (API)',
    tests: [
      { id: 'rbac-1', description: 'Тренер имеет доступ к своим клиентам', expectedResult: 'GET /v1/clients → 200', status: 'pass' },
      { id: 'rbac-2', description: 'Тренер имеет доступ к своей воронке', expectedResult: 'GET /v1/funnel → 200', status: 'pass' },
      { id: 'rbac-3', description: 'Тренер имеет доступ к расписанию', expectedResult: 'GET /v1/trainings → 200', status: 'pass' },
      { id: 'rbac-4', description: 'Тренер имеет доступ к сводной статистике', expectedResult: 'GET /v1/stats/summary → 200', status: 'pass' },
      { id: 'rbac-5', description: 'Координатор имеет доступ ко всем клиентам', expectedResult: 'GET /v1/clients → 200', status: 'pass' },
      { id: 'rbac-6', description: 'Менеджер имеет доступ к отчётам (зависит от модуля)', expectedResult: 'GET /v1/reports → 200 или 403', status: 'pass' },
      { id: 'rbac-7', description: 'Тренер не имеет доступа к админ-эндпоинтам', expectedResult: 'GET /v1/clubs → 401/403/404', status: 'pass' },
    ],
  },
  {
    file: 'funnel.spec.ts',
    groupName: 'Воронка продаж (API)',
    tests: [
      { id: 'funnel-1', description: 'Получение записей воронки', expectedResult: 'Массив data', status: 'pass' },
      { id: 'funnel-2', description: 'Фильтрация воронки по этапу (stage=NEW)', expectedResult: 'Только записи с этапом NEW', status: 'pass' },
      { id: 'funnel-3', description: 'Статистика конверсии воронки', expectedResult: 'Поля newToAssigned, assignedToCompleted, completedToRegular', status: 'pass' },
    ],
  },
  {
    file: 'admin.spec.ts',
    groupName: 'Админка: Клубы (API)',
    tests: [
      { id: 'admin-1', description: 'Суперадмин получает список клубов с пагинацией', expectedResult: 'data (массив), hasMore, nextCursor', status: 'pass' },
      { id: 'admin-2', description: 'Запрос с limit=100 — не более 100 записей', expectedResult: 'data.length ≤ 100', status: 'pass' },
      { id: 'admin-3', description: 'Запрос с limit=101 — отклонён валидацией', expectedResult: 'Ответ 400', status: 'pass' },
      { id: 'admin-4', description: 'Запрос с limit=500 — отклонён валидацией', expectedResult: 'Ответ 400', status: 'pass' },
      { id: 'admin-5', description: 'Запрос с limit=0 — отклонён валидацией', expectedResult: 'Ответ 400', status: 'pass' },
      { id: 'admin-6', description: 'Тренер не имеет доступа к клубам — ответ 403', expectedResult: 'Ответ 403', status: 'pass' },
      { id: 'admin-7', description: 'Админ клуба не имеет доступа к суперадмин-клубам', expectedResult: 'Ответ 403', status: 'pass' },
      { id: 'admin-8', description: 'Поиск клубов по названию «FitGym»', expectedResult: 'Результаты содержат совпадение', status: 'pass' },
      { id: 'admin-9', description: 'Ответ содержит лицензию и кол-во пользователей/клиентов', expectedResult: 'Поля license, _count.users, _count.clients', status: 'pass' },
    ],
  },
  {
    file: 'admin.spec.ts',
    groupName: 'Админка: Журнал аудита (API)',
    tests: [
      { id: 'audit-1', description: 'Суперадмин получает журнал аудита', expectedResult: 'Массив data', status: 'pass' },
      { id: 'audit-2', description: 'Тренер не имеет доступа к журналу аудита', expectedResult: 'Ответ 403', status: 'pass' },
    ],
  },
  {
    file: 'admin.spec.ts',
    groupName: 'Валидация пагинации (API)',
    tests: [
      { id: 'pag-1', description: 'Клиенты: limit > 100 — отклонён', expectedResult: 'Ответ 400', status: 'pass' },
      { id: 'pag-2', description: 'Тренировки: limit > 100 — отклонён', expectedResult: 'Ответ 400', status: 'pass' },
      { id: 'pag-3', description: 'Воронка: limit > 100 — отклонён', expectedResult: 'Ответ 400', status: 'pass' },
      { id: 'pag-4', description: 'Клиенты: отрицательный limit — отклонён', expectedResult: 'Ответ 400', status: 'pass' },
      { id: 'pag-5', description: 'Клиенты: нечисловой limit — отклонён', expectedResult: 'Ответ 400', status: 'pass' },
    ],
  },
  {
    file: 'api-health.spec.ts',
    groupName: 'API Health & Swagger',
    tests: [
      { id: 'health-1', description: 'GET /health — проверка статусов db и redis', expectedResult: 'Ответ 200, поле status', status: 'pass' },
      { id: 'health-2', description: 'GET /api/docs — Swagger UI доступен', expectedResult: 'Статус < 400', status: 'pass' },
      { id: 'health-3', description: 'GET / — редирект на /api/docs', expectedResult: 'Статус 301/302 или 200', status: 'pass' },
    ],
  },
  {
    file: 'landing.spec.ts',
    groupName: 'Лендинг — UI (Playwright)',
    tests: [
      { id: 'lp-e2e-1', description: 'Hero-секция загружается с заголовком и CTA-кнопкой', expectedResult: 'h1 видим, кнопка «Попробовать бесплатно» видима', status: 'pass' },
      { id: 'lp-e2e-2', description: 'Кнопка «Войти» ведёт на /login', expectedResult: 'href содержит "login"', status: 'pass' },
      { id: 'lp-e2e-3', description: 'Навигация — якорные ссылки в хедере', expectedResult: '≥ 3 ссылок в header', status: 'pass' },
      { id: 'lp-e2e-4', description: 'Секция «Возможности» содержит карточки', expectedResult: '≥ 3 карточек', status: 'pass' },
      { id: 'lp-e2e-5', description: 'Секция «Тарифы» содержит 3 плана', expectedResult: '≥ 3 планов', status: 'pass' },
      { id: 'lp-e2e-6', description: 'FAQ-аккордеон раскрывается', expectedResult: 'Клик раскрывает ответ', status: 'pass' },
      { id: 'lp-e2e-7', description: 'Футер содержит копирайт', expectedResult: 'MyFitCRM / © / 2026', status: 'pass' },
      { id: 'lp-e2e-8', description: 'Мобильная адаптация (375px)', expectedResult: 'Страница не ломается', status: 'pass' },
    ],
  },
  {
    file: 'platform-ui.spec.ts',
    groupName: 'Панель суперадмина — UI (Playwright)',
    tests: [
      { id: 'plat-e2e-1', description: 'Редирект на /login для неавторизованного', expectedResult: 'URL содержит /login', status: 'pass' },
      { id: 'plat-e2e-2', description: 'Форма логина — поля телефон и пароль', expectedResult: 'Оба поля и кнопка видимы', status: 'pass' },
      { id: 'plat-e2e-3', description: 'Ошибка при неверном пароле', expectedResult: 'Остаёмся на /login', status: 'pass' },
      { id: 'plat-e2e-4', description: '/dashboard не возвращает 500', expectedResult: 'Статус < 500', status: 'pass' },
      { id: 'plat-e2e-5', description: '/clubs не возвращает 500', expectedResult: 'Статус < 500', status: 'pass' },
      { id: 'plat-e2e-6', description: '/licenses не возвращает 500', expectedResult: 'Статус < 500', status: 'pass' },
      { id: 'plat-e2e-7', description: '/monitoring не возвращает 500', expectedResult: 'Статус < 500', status: 'pass' },
      { id: 'plat-e2e-8', description: '/audit не возвращает 500', expectedResult: 'Статус < 500', status: 'pass' },
      { id: 'plat-e2e-9', description: '/documents не возвращает 500', expectedResult: 'Статус < 500', status: 'pass' },
      { id: 'plat-e2e-10', description: '/development загружается с вкладками', expectedResult: 'Видны «Прогресс» и «Тестирование»', status: 'pass' },
      { id: 'plat-e2e-11', description: 'Вкладка «Тестирование» — E2E и ручные проверки', expectedResult: 'Секции E2E и ручного тестирования', status: 'pass' },
      { id: 'plat-e2e-12', description: 'Документ dev-status — кнопки PDF/Excel/Печать', expectedResult: 'Три кнопки экспорта видимы', status: 'pass' },
    ],
  },
  {
    file: 'web-admin-ui.spec.ts',
    groupName: 'Панель рецепции — UI (Playwright)',
    tests: [
      { id: 'rec-e2e-1', description: 'Редирект на /login для неавторизованного', expectedResult: 'URL содержит /login', status: 'pass' },
      { id: 'rec-e2e-2', description: 'Форма логина — поля телефон и пароль', expectedResult: 'Оба поля видимы', status: 'pass' },
      { id: 'rec-e2e-3', description: 'Основные страницы не возвращают 500', expectedResult: '/dashboard, /reception, /distribution — < 500', status: 'pass' },
    ],
  },
  {
    file: 'club-admin-ui.spec.ts',
    groupName: 'Панель клуба — UI (Playwright)',
    tests: [
      { id: 'club-e2e-1', description: 'Редирект на /login для неавторизованного', expectedResult: 'URL содержит /login', status: 'pass' },
      { id: 'club-e2e-2', description: 'Форма логина — поля телефон и пароль', expectedResult: 'Оба поля видимы', status: 'pass' },
      { id: 'club-e2e-3', description: 'Основные страницы не возвращают 500', expectedResult: '/staff, /departments, /catalog, /settings — < 500', status: 'pass' },
    ],
  },
];
