// apps/web/e2e/pages/patient-list.page.ts
import type { Page } from '@playwright/test';

export class PatientListPage {
  readonly page: Page;

  constructor(page: Page) {
    this.page = page;
  }

  async goto() {
    await this.page.goto('/#/health/patients');
    await this.page.waitForSelector('.ant-table', { timeout: 15000 });
  }

  async clickCreate() {
    await this.page.click('button:has-text("新增"), button:has-text("新建"), button:has-text("创建")');
    await this.page.waitForSelector('.ant-modal, .ant-drawer', { timeout: 5000 });
  }

  async fillCreateForm(data: { name: string; gender?: string; birth_date?: string }) {
    const drawer = this.page.locator('.ant-drawer');
    await drawer.locator('input').first().waitFor({ state: 'visible' });
    await this.page.locator('.ant-drawer [name="name"] input, .ant-drawer input').first().fill(data.name);
    if (data.gender) {
      await drawer.locator('.ant-select').first().click();
      await this.page.locator(`.ant-select-item-option:has-text("${data.gender === 'male' ? '男' : '女'}")`).first().click();
    }
    if (data.birth_date) {
      await drawer.locator('[name="birth_date"] input, input[placeholder*="出生"]').fill(data.birth_date);
    }
  }

  async submitForm() {
    await this.page.click('.ant-drawer button.ant-btn-primary, button:has-text("保存"), .ant-modal .ant-btn-primary');
    await this.page.waitForSelector('.ant-message-success', { timeout: 10000 });
  }

  async searchPatient(name: string) {
    const searchInput = this.page.locator('input[placeholder*="搜索"]').first();
    await searchInput.fill(name);
    await searchInput.press('Enter');
    await this.page.waitForTimeout(1000);
  }

  async clickPatientRow(row: number) {
    const rows = this.page.locator('.ant-table-tbody tr');
    await rows.nth(row).click();
  }

  async clickPatientByName(name: string) {
    await this.searchPatient(name);
    const row = this.page.locator(`.ant-table-tbody tr:has-text("${name}")`).first();
    await row.click();
  }

  async getTableRowCount(): Promise<number> {
    return this.page.locator('.ant-table-tbody tr').count();
  }

  async hasPatientInTable(name: string): Promise<boolean> {
    await this.searchPatient(name);
    const count = await this.page.locator(`.ant-table-tbody tr:has-text("${name}")`).count();
    return count > 0;
  }
}
