/**
 * 超管端 E2E 测试 - 退出登录
 */

import { test, expect } from '@playwright/test';
import { loginAsAdmin, logout } from './helpers';
import { ADMIN_CONFIG } from './fixtures';

test.describe('退出登录', () => {
  test('点击退出登录', async ({ page }) => {
    // 先登录
    await loginAsAdmin(page);

    // 查找退出登录按钮并点击
    const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i });
    if (await logoutButton.isVisible()) {
      await logoutButton.click();
    } else {
      // 尝试点击用户菜单后再找退出按钮
      const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]'));
      if (await userMenu.isVisible()) {
        await userMenu.click();
        await page.waitForTimeout(200);
        const dropdownLogout = page.getByText(/退出登录 | 退出/);
        if (await dropdownLogout.isVisible()) {
          await dropdownLogout.click();
        }
      }
    }

    // 等待跳转到登录页
    await page.waitForURL('**/login*');
    await expect(page).toHaveURL(/\/login/);
  });

  test('验证跳转回登录页', async ({ page }) => {
    // 先登录
    await loginAsAdmin(page);

    // 退出登录
    const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i });
    if (await logoutButton.isVisible()) {
      await logoutButton.click();
    } else {
      const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]'));
      if (await userMenu.isVisible()) {
        await userMenu.click();
        await page.waitForTimeout(200);
        const dropdownLogout = page.getByText(/退出登录 | 退出/);
        if (await dropdownLogout.isVisible()) {
          await dropdownLogout.click();
        }
      }
    }

    // 验证在登录页面
    await page.waitForURL('**/login*');
    await expect(page).toHaveURL(/\/login/);

    // 验证登录表单存在
    await expect(page.getByPlaceholder('请输入账号')).toBeVisible();
    await expect(page.getByPlaceholder('请输入密码')).toBeVisible();
  });

  test('验证 token 已清除', async ({ page }) => {
    // 先登录
    await loginAsAdmin(page);

    // 获取当前 token
    const tokenBeforeLogout = await page.evaluate(() => localStorage.getItem('token'));
    expect(tokenBeforeLogout).toBeTruthy();

    // 退出登录
    const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i });
    if (await logoutButton.isVisible()) {
      await logoutButton.click();
    } else {
      const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]'));
      if (await userMenu.isVisible()) {
        await userMenu.click();
        await page.waitForTimeout(200);
        const dropdownLogout = page.getByText(/退出登录 | 退出/);
        if (await dropdownLogout.isVisible()) {
          await dropdownLogout.click();
        }
      }
    }

    // 等待跳转完成
    await page.waitForTimeout(500);

    // 验证 token 已清除
    const tokenAfterLogout = await page.evaluate(() => localStorage.getItem('token'));
    expect(tokenAfterLogout).toBeFalsy();

    // 验证 sessionStorage 中的用户信息也已清除
    const userInfo = await page.evaluate(() => sessionStorage.getItem('userInfo'));
    expect(userInfo).toBeFalsy();
  });

  test('退出后无法访问管理页面', async ({ page }) => {
    // 先登录
    await loginAsAdmin(page);

    // 退出登录
    const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i });
    if (await logoutButton.isVisible()) {
      await logoutButton.click();
    } else {
      const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]'));
      if (await userMenu.isVisible()) {
        await userMenu.click();
        await page.waitForTimeout(200);
        const dropdownLogout = page.getByText(/退出登录 | 退出/);
        if (await dropdownLogout.isVisible()) {
          await dropdownLogout.click();
        }
      }
    }

    // 等待跳转完成
    await page.waitForTimeout(500);

    // 尝试直接访问管理页面
    await page.goto('/admin/dashboard');

    // 应该被重定向到登录页
    await page.waitForURL('**/login*');
    await expect(page).toHaveURL(/\/login/);
  });
});
