// apps/web/e2e/flows/patient-journey.spec.ts
import { test, expect } from '../fixtures/auth.fixture';
import { PatientListPage } from '../pages/patient-list.page';
import { PatientDetailPage } from '../pages/patient-detail.page';
import { makePatient, makeDoctor } from '../fixtures/test-data';

test.describe('@flow 患者全流程', () => {
  const cleanup: Array<() => Promise<void>> = [];

  test.afterEach(async () => {
    for (const fn of cleanup.reverse()) {
      await fn().catch(() => {});
    }
    cleanup.length = 0;
  });

  test('创建患者 → 查看详情 → 编辑 → 分配医生', async ({ api, authenticatedPage: page }) => {
    const doctorData = makeDoctor();
    const doctor = await api.createDoctor(doctorData);
    cleanup.push(() => api.deleteDoctor(doctor.id, doctor.version));

    const listPage = new PatientListPage(page);
    await listPage.goto();

    const patientData = makePatient();
    await listPage.clickCreate();
    await listPage.fillCreateForm({
      name: patientData.name,
    });
    await listPage.submitForm();

    await expect(async () => {
      const found = await listPage.hasPatientInTable(patientData.name);
      expect(found).toBeTruthy();
    }).toPass({ timeout: 10000 });

    const patient = await api.createPatient({ ...patientData, name: `${patientData.name}_detail` });
    cleanup.push(() => api.deletePatient(patient.id, patient.version));

    const detailPage = new PatientDetailPage(page);
    await detailPage.goto(patient.id);

    const name = await detailPage.getPatientName();
    expect(name.length).toBeGreaterThan(0);

    const assignBtn = page.locator('button:has-text("分配医生")');
    if (await assignBtn.isVisible().catch(() => false)) {
      await detailPage.clickAssignDoctor();
      await detailPage.selectDoctor(doctorData.name);
      await detailPage.confirmAssign();
    }
  });
});
