/**
 * Sprint 8 пункт 2 — Telegram binding endpoints на стейдже.
 * Бот может быть отключён (Telegram__BotToken не задан) — это нормально,
 * UI должен показать сообщение «бот не настроен». Тестируем endpoint и UI.
 */
import { test, expect, request as apiRequest } from '@playwright/test'
import { apiSignup, attachSession, watchPage, expectNoErrors } from '../lib/ui.js'

const BASE = process.env.E2E_ADMIN_URL ?? 'https://test.admin.food-market.kz'

test.describe('Telegram binding', () => {
  test('S8-2.1 GET /api/organization/telegram/status работает', async () => {
    const sess = await apiSignup('tg21')
    const ctx = await apiRequest.newContext({
      baseURL: BASE, ignoreHTTPSErrors: true,
      extraHTTPHeaders: { Authorization: `Bearer ${sess.accessToken}` },
    })
    const r = await ctx.get('/api/organization/telegram/status')
    expect(r.status()).toBe(200)
    const body = await r.json() as { botEnabled: boolean; chatId: number | null }
    // С стейджа токен не задан — бот disabled.
    expect(typeof body.botEnabled).toBe('boolean')
    expect(body.chatId).toBeNull()
    await ctx.dispose()
  })

  test('S8-2.2 UI секция Telegram рендерится в OrganizationSettings', async ({ page }) => {
    const sess = await apiSignup('tg22')
    const errs = watchPage(page)
    await attachSession(page, sess, '/settings/organization')
    await page.waitForLoadState('networkidle')
    // Заголовок секции
    await expect(page.getByText(/Telegram владельца/i).first()).toBeVisible({ timeout: 8_000 })
    // Если бот отключён — показывается соответствующее сообщение
    const botDisabled = await page.locator('text=/бот не настроен|нет токена/i').count()
    const showsBindForm = await page.locator('text=/Ваш chat_id/i').count()
    // Один из двух режимов должен быть видим
    expect(botDisabled + showsBindForm).toBeGreaterThan(0)
    expectNoErrors(errs, 'telegram section')
  })

  test('S8-2.3 PUT bind с bot disabled → 400 с читаемым сообщением', async () => {
    const sess = await apiSignup('tg23')
    const ctx = await apiRequest.newContext({
      baseURL: BASE, ignoreHTTPSErrors: true,
      extraHTTPHeaders: { Authorization: `Bearer ${sess.accessToken}` },
    })
    const r = await ctx.put('/api/organization/telegram/bind', {
      data: { chatId: 123456 },
      failOnStatusCode: false,
    })
    // Бот выключен → 400
    if (r.status() === 400) {
      const body = await r.json() as { error: string }
      expect(body.error).toMatch(/Telegram|бот.*не настроен|токен/i)
    } else if (r.status() === 204) {
      // если бот включён и chatId валидный — тоже OK
      expect(r.status()).toBe(204)
    } else {
      throw new Error(`unexpected status ${r.status()}`)
    }
    await ctx.dispose()
  })
})
