/**
 * CNC管理后台 - 模拟采集模块 Playwright E2E测试
 *
 * 测试范围（IIS模式，真实后端，模拟器未启动）：
 * - 侧边栏导航：模拟采集菜单项可见可点击
 * - 总览页（/simulator）：断连状态UI——未连接提示、按钮禁用
 *
 * 运行方式：`npx playwright test e2e/simulator.spec.ts --project=chromium`
 * 前提：IIS站点已部署最新前后端代码，无需启动CncSimulator
 */
import { test, expect, type Page } from '@playwright/test'

// === 登录辅助函数 ===
// 使用完整URL避免baseURL(127.0.0.1)与IIS绑定(192.168.1.202)不匹配
const BASE = 'http://192.168.1.202/admin'

async function login(page: Page) {
  await page.goto(`${BASE}/login`)
  await page.waitForLoadState('networkidle')
  await page.waitForSelector('input', { timeout: 10000 })
  const inputs = page.locator('input')
  await inputs.nth(0).fill('admin')
  await inputs.nth(1).fill('admin123')
  await page.locator('button').last().click()
  await page.waitForURL(/\/(dashboard|admin\/?$)/, { timeout: 15000 })
}

// ============================================================
// 套件1：侧边栏导航
// ============================================================
test.describe('模拟采集侧边栏导航', () => {

  test.beforeEach(async ({ page }) => {
    await login(page)
  })

  test('侧边栏有"模拟采集"菜单项', async ({ page }) => {
    const menuItems = page.locator('.el-menu-item')
    const simulatorItem = menuItems.filter({ hasText: '模拟采集' })
    await expect(simulatorItem).toBeVisible()
  })

  test('点击"模拟采集"菜单跳转到总览页', async ({ page }) => {
    const menuItems = page.locator('.el-menu-item')
    const simulatorItem = menuItems.filter({ hasText: '模拟采集' })
    await simulatorItem.click()
    await page.waitForURL(/\/simulator$/, { timeout: 10000 })
    expect(page.url()).toContain('/simulator')
  })
})

// ============================================================
// 套件2：总览页——模拟器未连接状态
// ============================================================
test.describe('模拟采集总览页（模拟器未连接）', () => {

  test.beforeEach(async ({ page }) => {
    await login(page)
    // 通过侧边栏菜单导航到模拟采集页面
    const menuItems = page.locator('.el-menu-item')
    const simulatorItem = menuItems.filter({ hasText: '模拟采集' })
    await simulatorItem.click()
    await page.waitForURL(/\/simulator$/, { timeout: 10000 })
    // 等待ping API调用完成
    await page.waitForTimeout(2000)
  })

  test('页面显示"模拟器未连接"', async ({ page }) => {
    await expect(page.locator('text=模拟器未连接')).toBeVisible()
  })

  test('页面显示友好提示信息', async ({ page }) => {
    await expect(page.locator('text=模拟器未启动')).toBeVisible()
  })

  test('三个操作按钮正确禁用', async ({ page }) => {
    await expect(page.locator('button:has-text("全部启动")')).toBeDisabled()
    await expect(page.locator('button:has-text("全部停止")')).toBeDisabled()
    await expect(page.locator('button:has-text("刷新配置")')).toBeDisabled()
  })

  test('面包屑导航显示"首页 / 模拟采集"', async ({ page }) => {
    const breadcrumb = page.locator('.el-breadcrumb')
    await expect(breadcrumb).toBeVisible()
    await expect(breadcrumb.locator('text=首页')).toBeVisible()
    await expect(breadcrumb.locator('text=模拟采集')).toBeVisible()
  })

  test('页面无JavaScript异常（排除预期的网络错误）', async ({ page }) => {
    const errors: string[] = []
    page.on('console', (msg) => {
      if (msg.type() === 'error') errors.push(msg.text())
    })
    await page.reload({ waitUntil: 'networkidle' })
    await page.waitForTimeout(3000)
    // 过滤掉模拟器不可达的预期错误
    const realErrors = errors.filter(e =>
      !e.includes('simulator') &&
      !e.includes('50001') &&
      !e.includes('Network Error') &&
      !e.includes('ERR_CONNECTION_REFUSED') &&
      !e.includes('404')
    )
    expect(realErrors).toEqual([])
  })
})
