// ============================================================
// AUTH SCREEN — unauthenticated landing page structure.
// These tests do NOT use the `authedPage` fixture; they visit the
// app with a fresh context (no cookie) and assert the sign-in
// form + register + forgot-password transitions render correctly.
// ============================================================

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

test.describe('Unauthenticated auth screen', () => {

  // Use the base test that doesn't auto-login.
  test('landing shows login form with email + password fields', async ({ page }) => {
    await page.goto(E2E_BASE + '/');
    await expect(page.locator('#auth-screen')).toBeVisible({ timeout: 10000 });
    await expect(page.locator('#login-email')).toBeVisible();
    await expect(page.locator('#login-password')).toBeVisible();
    await expect(page.locator('#btn-local-login')).toBeVisible();
    // main app body must be hidden while unauthenticated
    await expect(page.locator('#main-app')).toBeHidden();
  });

  test('register link is present but currently disabled (display:none)', async ({ page }) => {
    // Invite-only registration hides the link while keeping the form in the DOM.
    await page.goto(E2E_BASE + '/');
    await page.waitForSelector('#auth-screen', { timeout: 10000 });
    const display = await page.locator('#show-register').evaluate(el => el.style.display);
    expect(display).toBe('none');
    // The register form element still exists in the DOM for programmatic access
    await expect(page.locator('#register-form')).toHaveCount(1);
  });

  test('register form DOM is wired correctly if manually unhidden', async ({ page }) => {
    await page.goto(E2E_BASE + '/');
    await page.waitForSelector('#auth-screen', { timeout: 10000 });
    // Force the link visible so we can exercise the swap path — useful for
    // future tests that want to validate the full register flow.
    await page.locator('#show-register').evaluate(el => { el.style.display = ''; });
    await page.click('#show-register');
    await expect(page.locator('#register-form')).toBeVisible();
    await expect(page.locator('#reg-name')).toBeVisible();
    await expect(page.locator('#reg-email')).toBeVisible();
    await expect(page.locator('#reg-password')).toBeVisible();
    await page.click('#show-login');
    await expect(page.locator('#login-form')).toBeVisible();
    await expect(page.locator('#register-form')).toBeHidden();
  });

  test('clicking "Forgot password?" swaps to forgot form', async ({ page }) => {
    await page.goto(E2E_BASE + '/');
    await page.waitForSelector('#auth-screen', { timeout: 10000 });
    await page.click('#show-forgot');
    await expect(page.locator('#forgot-form')).toBeVisible();
    await expect(page.locator('#forgot-email')).toBeVisible();
    await expect(page.locator('#login-form')).toBeHidden();
    // Back link returns to login
    await page.click('#show-login-2');
    await expect(page.locator('#login-form')).toBeVisible();
    await expect(page.locator('#forgot-form')).toBeHidden();
  });

  test('password minlength enforces 8 chars in register form', async ({ page }) => {
    await page.goto(E2E_BASE + '/');
    await page.waitForSelector('#auth-screen', { timeout: 10000 });
    // Attribute check doesn't require the element to be visible.
    const pw = page.locator('#reg-password');
    await expect(pw).toHaveAttribute('minlength', '8');
    await expect(pw).toHaveAttribute('type', 'password');
  });
});
