import { expect, test } from "@playwright/test";
import { createCase, openCaseOnStep, profileRow, sendChat, sendMany, STEP_SCRIPT } from "./helpers";

async function toBuild(request: Parameters<typeof createCase>[0], build: string) {
  const created = await createCase(request);
  await sendMany(request, created.caseId, [
    STEP_SCRIPT.name,
    STEP_SCRIPT.state,
    STEP_SCRIPT.intent,
    STEP_SCRIPT.age,
    STEP_SCRIPT.loan,
  ]);
  return { created, after: await sendChat(request, created.caseId, build) };
}

test("BMI-01 5'10 190 lb computes BMI 27.3 and stays SI path after clean health", async ({
  request,
  page,
}) => {
  const { created, after } = await toBuild(request, `5'10" 190 lb non-smoker`);
  expect(after.profile.bmi_computed).toBe(27.3);
  expect(after.process.step).toBe(4);
  const done = await sendMany(request, created.caseId, [STEP_SCRIPT.diseases, STEP_SCRIPT.income]);
  expect(done.profile.decision_result).toBeTruthy();
  const family = (done.profile.decision_result as { offer_family: string }).offer_family;
  expect(family).toBe("si_level");
  await openCaseOnStep(page, created.caseId);
  await expect(profileRow(page, "bmi_computed")).toContainText("27.3");
  await expect(profileRow(page, "decision")).toContainText("si_level");
});

test("BMI-02 BMI 47 (5'10 328 lb) yields gi after income", async ({ request, page }) => {
  const { created } = await toBuild(request, `5'10" 328 lb non-smoker`);
  const done = await sendMany(request, created.caseId, [STEP_SCRIPT.diseases, STEP_SCRIPT.income]);
  expect((done.profile.decision_result as { offer_family: string }).offer_family).toBe("gi");
  await openCaseOnStep(page, created.caseId);
  await expect(profileRow(page, "decision")).toContainText("gi");
});

test("BMI-03 BMI 43 (5'10 300 lb) yields graded", async ({ request }) => {
  const { created, after } = await toBuild(request, `5'10" 300 lb non-smoker`);
  expect(Number(after.profile.bmi_computed)).toBeGreaterThan(42);
  const done = await sendMany(request, created.caseId, [STEP_SCRIPT.diseases, STEP_SCRIPT.income]);
  expect((done.profile.decision_result as { offer_family: string }).offer_family).toBe("graded");
});

test("BMI-04 dialysis stores kidney yes; current stub stays si_level unless attributes contain dialysis", async ({
  request,
  page,
}) => {
  const { created } = await toBuild(request, STEP_SCRIPT.build);
  await sendChat(request, created.caseId, "I'm on dialysis");
  await sendChat(request, created.caseId, "Rest of my health is good");
  const done = await sendChat(request, created.caseId, STEP_SCRIPT.income);
  expect(done.profile.disease_screens?.kidney).toBe("yes");
  expect((done.profile.decision_result as { offer_family: string }).offer_family).toBe("si_level");
  await openCaseOnStep(page, created.caseId);
  await expect(profileRow(page, "kidney")).toContainText("yes");
  await expect(profileRow(page, "decision")).toContainText("si_level");
});

test("BMI-05 lbs suffix sets weight and BMI", async ({ request }) => {
  const created = await createCase(request);
  await sendMany(request, created.caseId, [
    STEP_SCRIPT.name,
    STEP_SCRIPT.state,
    STEP_SCRIPT.intent,
    STEP_SCRIPT.age,
    STEP_SCRIPT.loan,
  ]);
  const c = await sendChat(request, created.caseId, `5'10", 190 lbs non-smoker`);
  expect(c.profile.weight_lb).toBe(190);
  expect(c.profile.bmi_computed).toBe(27.3);
  expect(c.process.step).toBe(4);
});
