// ============================================================
// SOAP + HOSPITAL COURSE — detailed workflow for the two notes
// tabs that previously only had smoke coverage.
// ============================================================

const { test, expect, E2E_BASE, mockAI } = require('../fixtures');

async function openTab(page, name) {
  await page.goto(E2E_BASE + '/');
  await page.waitForSelector('button.tab-btn', { timeout: 15000 });
  const vp = page.viewportSize();
  if (vp && vp.width <= 768) {
    await page.click('#btn-menu-toggle').catch(() => {});
  }
  await page.click(`button.tab-btn[data-tab="${name}"]`);
  await page.waitForFunction((t) => {
    const el = document.getElementById(t + '-tab');
    return el && el.classList.contains('active') && el.innerHTML.trim().length > 100;
  }, name, { timeout: 15000 });
}

test.describe('SOAP Note — generate + refine', () => {

  test('fill transcript + generate → mocked SOAP renders', async ({ authedPage: _, page }) => {
    await mockAI(page);
    await openTab(page, 'soap');

    await page.fill('#soap-age', '5 years');
    await page.selectOption('#soap-gender', 'Male');
    await page.locator('#soap-transcript').click();
    await page.keyboard.type('Patient presents with 3 days of fever, cough, and runny nose.');

    const [resp] = await Promise.all([
      page.waitForResponse('**/api/generate-soap', { timeout: 15000 }),
      page.click('#soap-generate-btn'),
    ]);
    expect(resp.status()).toBe(200);
    await expect(page.locator('#soap-output')).toBeVisible({ timeout: 10000 });
    await expect(page.locator('#soap-text')).toContainText('MOCK SOAP NOTE');
  });

  test('clear transcript button empties the contenteditable', async ({ authedPage: _, page }) => {
    await mockAI(page);
    await openTab(page, 'soap');
    await page.locator('#soap-transcript').click();
    await page.keyboard.type('some transcript');
    await expect(page.locator('#soap-transcript')).toContainText('some transcript');
    await page.click('#soap-clear');
    const text = await page.locator('#soap-transcript').innerText();
    expect(text.trim()).toBe('');
  });

  test('load popover opens and closes', async ({ authedPage: _, page }) => {
    await openTab(page, 'soap');
    await page.click('#btn-soap-load').catch(() => page.click('button[id*="soap-load"]'));
    await expect(page.locator('#soap-load-popover')).not.toHaveClass(/hidden/, { timeout: 3000 });
  });
});

test.describe('Hospital Course — tab loads with save/load bar', () => {

  test('tab renders with label input + save/load/new buttons', async ({ authedPage: _, page }) => {
    await openTab(page, 'hospital');
    await expect(page.locator('#hosp-label')).toBeVisible();
    await expect(page.locator('#hosp-save-bar')).toBeVisible();
  });

  test('load popover opens and closes', async ({ authedPage: _, page }) => {
    await openTab(page, 'hospital');
    // Any button with id that looks like load
    const loadBtn = page.locator('button[id*="hosp-load"], button[id*="btn-hosp-load"]').first();
    await loadBtn.click();
    await expect(page.locator('#hosp-load-popover')).not.toHaveClass(/hidden/, { timeout: 3000 });
  });
});
