/**
 * 超管端 E2E 测试 - 租户管理
 */

import { test, expect } from '@playwright/test';
import { loginAsAdmin, waitForTable, waitForSuccess, waitForModal } from './helpers';
import { TEST_DATA } from './fixtures';

test.describe('租户管理', () => {
  test.beforeEach(async ({ page }) => {
    await loginAsAdmin(page);
    // 导航到租户列表页面
    await page.goto('/admin/tenants');
  });

  test.describe('列表页面', () => {
    test('访问租户列表页面', async ({ page }) => {
      // 验证页面 URL
      await expect(page).toHaveURL(/\/admin\/tenants/);
    });

    test('验证列表加载', async ({ page }) => {
      // 等待表格加载
      await waitForTable(page);

      // 验证表格存在
      const table = page.locator('table, .ant-table');
      await expect(table).toBeVisible();

      // 验证添加租户按钮存在
      const addButton = page.getByText(/添加租户 | 新建租户/);
      await expect(addButton).toBeVisible();
    });

    test('搜索功能', async ({ page }) => {
      await waitForTable(page);

      // 输入搜索关键词
      const searchInput = page.getByPlaceholder(/学校名称 | 关键词/);
      if (await searchInput.isVisible()) {
        await searchInput.fill('测试');
        await searchInput.press('Enter');

        // 等待搜索结果
        await page.waitForTimeout(1000);
      }

      // 验证表格仍然存在
      const table = page.locator('table, .ant-table');
      await expect(table).toBeVisible();
    });

    test('筛选功能 - 按状态', async ({ page }) => {
      await waitForTable(page);

      // 选择状态筛选
      const statusSelect = page.getByPlaceholder('全部状态');
      if (await statusSelect.isVisible()) {
        await statusSelect.click();
        await page.getByText('生效中').click();

        // 等待筛选结果
        await page.waitForTimeout(1000);
      }

      // 验证表格仍然存在
      const table = page.locator('table, .ant-table');
      await expect(table).toBeVisible();
    });

    test('筛选功能 - 按套餐', async ({ page }) => {
      await waitForTable(page);

      // 选择套餐筛选
      const packageSelect = page.getByPlaceholder('全部套餐');
      if (await packageSelect.isVisible()) {
        await packageSelect.click();
        await page.getByText('标准版').click();

        // 等待筛选结果
        await page.waitForTimeout(1000);
      }

      // 验证表格仍然存在
      const table = page.locator('table, .ant-table');
      await expect(table).toBeVisible();
    });

    test('分页功能', async ({ page }) => {
      await waitForTable(page);

      // 验证分页控件存在
      const pagination = page.locator('.ant-pagination');
      await expect(pagination).toBeVisible();
    });
  });

  test.describe('创建租户', () => {
    test('点击添加租户按钮', async ({ page }) => {
      await waitForTable(page);

      // 点击添加租户按钮
      const addButton = page.getByText(/添加租户 | 新建租户/);
      await addButton.click();

      // 等待弹窗显示
      const modal = page.locator('.ant-modal');
      await expect(modal).toBeVisible({ timeout: 5000 });
      await expect(page.getByText(/添加租户 | 新建租户/)).toBeVisible();
    });

    test('填写基本信息', async ({ page }) => {
      await waitForTable(page);

      // 点击添加租户按钮
      const addButton = page.getByText(/添加租户 | 新建租户/);
      await addButton.click();
      await page.waitForTimeout(500);

      // 填写学校名称
      const nameInput = page.locator('input[placeholder*="学校名称"]');
      await nameInput.fill(TEST_DATA.tenant.name);

      // 填写登录账号
      const accountInput = page.locator('input[placeholder*="登录账号"]');
      await accountInput.fill(TEST_DATA.tenant.account);

      // 填写联系人
      const contactInput = page.locator('input[placeholder*="联系人"]');
      await contactInput.fill(TEST_DATA.tenant.contactPerson);

      // 填写联系电话
      const phoneInput = page.locator('input[placeholder*="联系电话"]');
      await phoneInput.fill(TEST_DATA.tenant.contactPhone);
    });

    test('选择套餐类型', async ({ page }) => {
      await waitForTable(page);

      // 点击添加租户按钮
      const addButton = page.getByText(/添加租户 | 新建租户/);
      await addButton.click();
      await page.waitForTimeout(500);

      // 选择套餐类型
      const packageSelect = page.locator('[placeholder*="套餐类型"]');
      if (await packageSelect.isVisible()) {
        await packageSelect.click();
        await page.getByText('标准版').click();
      }
    });

    test('设置配额', async ({ page }) => {
      await waitForTable(page);

      // 点击添加租户按钮
      const addButton = page.getByText(/添加租户 | 新建租户/);
      await addButton.click();
      await page.waitForTimeout(500);

      // 设置教师配额
      const teacherQuotaInput = page.locator('input[placeholder*="教师配额"]');
      if (await teacherQuotaInput.isVisible()) {
        await teacherQuotaInput.fill(String(TEST_DATA.tenant.teacherQuota));
      }

      // 设置学生配额
      const studentQuotaInput = page.locator('input[placeholder*="学生配额"]');
      if (await studentQuotaInput.isVisible()) {
        await studentQuotaInput.fill(String(TEST_DATA.tenant.studentQuota));
      }
    });

    test('设置有效期', async ({ page }) => {
      await waitForTable(page);

      // 点击添加租户按钮
      const addButton = page.getByText(/添加租户 | 新建租户/);
      await addButton.click();
      await page.waitForTimeout(500);

      // 验证日期选择器存在
      const datePicker = page.locator('.ant-picker');
      await expect(datePicker).toBeVisible();
    });

    test('保存租户', async ({ page }) => {
      await waitForTable(page);

      // 点击添加租户按钮
      const addButton = page.getByText(/添加租户 | 新建租户/);
      await addButton.click();
      await page.waitForTimeout(500);

      // 填写学校名称
      const nameInput = page.locator('input[placeholder*="学校名称"]');
      await nameInput.fill(`  ${TEST_DATA.tenant.name}  `);

      // 填写登录账号
      const accountInput = page.locator('input[placeholder*="登录账号"]');
      await accountInput.fill(`  ${TEST_DATA.tenant.account}  `);

      // 填写联系人
      const contactInput = page.locator('input[placeholder*="联系人"]');
      await contactInput.fill(`  ${TEST_DATA.tenant.contactPerson}  `);

      // 填写联系电话
      const phoneInput = page.locator('input[placeholder*="联系电话"]');
      await phoneInput.fill(`  ${TEST_DATA.tenant.contactPhone}  `);

      // 选择套餐类型
      const packageSelect = page.locator('[placeholder*="套餐类型"]');
      if (await packageSelect.isVisible()) {
        await packageSelect.click();
        await page.waitForTimeout(200);
        await page.getByText('标准版').click();
      }

      // 设置教师配额
      const teacherQuotaInput = page.locator('input[placeholder*="教师配额"]');
      if (await teacherQuotaInput.isVisible()) {
        await teacherQuotaInput.fill(String(TEST_DATA.tenant.teacherQuota));
      }

      // 设置学生配额
      const studentQuotaInput = page.locator('input[placeholder*="学生配额"]');
      if (await studentQuotaInput.isVisible()) {
        await studentQuotaInput.fill(String(TEST_DATA.tenant.studentQuota));
      }

      // 点击确定按钮
      const okButton = page.locator('.ant-modal button:has-text("确定")');
      if (await okButton.isVisible()) {
        await okButton.click();

        // 等待保存结果
        await page.waitForTimeout(2000);
      }
    });
  });

  test.describe('查看租户详情', () => {
    test('点击租户查看详情', async ({ page }) => {
      await waitForTable(page);

      // 点击第一个租户名称链接
      const tenantLink = page.locator('table a').first();
      if (await tenantLink.isVisible()) {
        await tenantLink.click();

        // 等待详情抽屉显示
        const drawer = page.locator('.ant-drawer');
        await expect(drawer).toBeVisible({ timeout: 5000 });
      }
    });

    test('查看基本信息', async ({ page }) => {
      await waitForTable(page);

      // 点击第一个租户名称链接
      const tenantLink = page.locator('table a').first();
      if (await tenantLink.isVisible()) {
        await tenantLink.click();
        await page.waitForTimeout(1000);

        // 验证基本信息显示
        await expect(page.getByText(/学校名称 | 登录账号/)).toBeVisible();
      }
    });

    test('查看教师列表', async ({ page }) => {
      await waitForTable(page);

      // 点击第一个租户名称链接
      const tenantLink = page.locator('table a').first();
      if (await tenantLink.isVisible()) {
        await tenantLink.click();
        await page.waitForTimeout(1000);

        // 验证教师列表区域存在
        await expect(page.getByText(/教师 | 最近教师/)).toBeVisible();
      }
    });

    test('查看学生列表', async ({ page }) => {
      await waitForTable(page);

      // 点击第一个租户名称链接
      const tenantLink = page.locator('table a').first();
      if (await tenantLink.isVisible()) {
        await tenantLink.click();
        await page.waitForTimeout(1000);

        // 验证学生列表区域存在
        await expect(page.getByText(/学生 | 最近学生/)).toBeVisible();
      }
    });
  });

  test.describe('编辑租户', () => {
    test('点击编辑按钮', async ({ page }) => {
      await waitForTable(page);

      // 查找操作下拉菜单
      const actionButton = page.locator('button:has-text("操作")').first();
      if (await actionButton.isVisible()) {
        await actionButton.click();

        // 点击编辑选项
        const editOption = page.getByText('编辑').first();
        await editOption.click();

        // 等待编辑弹窗显示
        const modal = page.locator('.ant-modal');
        await expect(modal).toBeVisible({ timeout: 5000 });
      }
    });

    test('修改基本信息', async ({ page }) => {
      await waitForTable(page);

      // 查找操作下拉菜单
      const actionButton = page.locator('button:has-text("操作")').first();
      if (await actionButton.isVisible()) {
        await actionButton.click();
        await page.waitForTimeout(200);

        // 点击编辑选项
        const editOption = page.getByText('编辑').first();
        await editOption.click();
        await page.waitForTimeout(1000);

        // 修改联系人
        const contactInput = page.locator('input[placeholder*="联系人"]');
        if (await contactInput.isVisible()) {
          const originalContact = await contactInput.inputValue();
          await contactInput.fill(`${originalContact}_已修改`);
        }

        // 点击确定按钮
        const okButton = page.locator('.ant-modal button:has-text("确定")');
        if (await okButton.isVisible()) {
          await okButton.click();

          // 等待保存结果
          await page.waitForTimeout(2000);
        }
      }
    });

    test('修改配额', async ({ page }) => {
      await waitForTable(page);

      // 查找操作下拉菜单
      const actionButton = page.locator('button:has-text("操作")').first();
      if (await actionButton.isVisible()) {
        await actionButton.click();
        await page.waitForTimeout(200);

        // 点击调整配额选项
        const quotaOption = page.getByText('调整配额');
        await quotaOption.click();

        // 等待配额弹窗显示
        const modal = page.locator('.ant-modal');
        await expect(modal).toBeVisible({ timeout: 5000 });
      }
    });
  });

  test.describe('租户状态管理', () => {
    test('禁用租户', async ({ page }) => {
      await waitForTable(page);

      // 查找操作下拉菜单
      const actionButton = page.locator('button:has-text("操作")').first();
      if (await actionButton.isVisible()) {
        await actionButton.click();
        await page.waitForTimeout(200);

        // 查找暂停服务选项
        const suspendOption = page.getByText('暂停服务');
        if (await suspendOption.isVisible()) {
          await suspendOption.click();

          // 等待确认弹窗
          const confirmDialog = page.locator('.ant-modal-confirm');
          await expect(confirmDialog).toBeVisible({ timeout: 5000 });

          // 点击取消，不实际操作
          const cancelButton = page.locator('.ant-modal-confirm button:has-text("取消")');
          if (await cancelButton.isVisible()) {
            await cancelButton.click();
          }
        }
      }
    });

    test('启用租户', async ({ page }) => {
      await waitForTable(page);

      // 查找操作下拉菜单
      const actionButton = page.locator('button:has-text("操作")').first();
      if (await actionButton.isVisible()) {
        await actionButton.click();
        await page.waitForTimeout(200);

        // 查找恢复服务选项（只有已暂停的租户才有此选项）
        const resumeOption = page.getByText('恢复服务');
        if (await resumeOption.isVisible()) {
          await resumeOption.click();

          // 等待确认弹窗
          const confirmDialog = page.locator('.ant-modal-confirm');
          await expect(confirmDialog).toBeVisible({ timeout: 5000 });

          // 点击取消，不实际操作
          const cancelButton = page.locator('.ant-modal-confirm button:has-text("取消")');
          if (await cancelButton.isVisible()) {
            await cancelButton.click();
          }
        }
      }
    });
  });

  test.describe('重置密码', () => {
    test('点击重置密码', async ({ page }) => {
      await waitForTable(page);

      // 查找操作下拉菜单
      const actionButton = page.locator('button:has-text("操作")').first();
      if (await actionButton.isVisible()) {
        await actionButton.click();
        await page.waitForTimeout(200);

        // 点击重置密码选项
        const resetPasswordOption = page.getByText('重置密码');
        await resetPasswordOption.click();

        // 等待确认弹窗
        const confirmDialog = page.locator('.ant-modal-confirm');
        await expect(confirmDialog).toBeVisible({ timeout: 5000 });

        // 点击取消，不实际操作
        const cancelButton = page.locator('.ant-modal-confirm button:has-text("取消")');
        if (await cancelButton.isVisible()) {
          await cancelButton.click();
        }
      }
    });
  });

  test.describe('删除租户', () => {
    test('点击删除按钮', async ({ page }) => {
      await waitForTable(page);

      // 查找操作下拉菜单
      const actionButton = page.locator('button:has-text("操作")').first();
      if (await actionButton.isVisible()) {
        await actionButton.click();
        await page.waitForTimeout(200);

        // 查找删除选项
        const deleteOption = page.locator('.ant-dropdown-menu-item-danger').or(page.getByText('删除'));
        if (await deleteOption.isVisible()) {
          await expect(deleteOption).toBeVisible();
        }
      }
    });

    test('确认删除弹窗', async ({ page }) => {
      await waitForTable(page);

      // 查找操作下拉菜单
      const actionButton = page.locator('button:has-text("操作")').first();
      if (await actionButton.isVisible()) {
        await actionButton.click();
        await page.waitForTimeout(200);

        // 点击删除选项
        const deleteOption = page.locator('.ant-dropdown-menu-item-danger').or(page.getByText('删除'));
        if (await deleteOption.isVisible()) {
          await deleteOption.click();

          // 等待确认弹窗
          const confirmDialog = page.locator('.ant-modal-confirm');
          await expect(confirmDialog).toBeVisible({ timeout: 5000 });

          // 点击取消，不实际删除
          const cancelButton = page.locator('.ant-modal-confirm button:has-text("取消")');
          if (await cancelButton.isVisible()) {
            await cancelButton.click();
          }
        }
      }
    });
  });
});
