/**
 * Session Persistence Tests
 *
 * Tests that sessions persist correctly across page navigations and reloads.
 */

import { test, expect, TEST_ACCOUNTS } from '@platform/e2e-auth';

test.describe('Session Persistence', () => {
  test('should persist session across page reloads', async ({ loginAs, page, getSessionToken }) => {
    // Login
    const { sessionId } = await loginAs('worker');

    // Navigate to dashboard
    await page.goto('/dashboard');

    // Reload page
    await page.reload();

    // Session should still be valid
    const token = await getSessionToken();
    expect(token).toBe(sessionId);

    // Should still be on dashboard (not redirected to login)
    await expect(page).not.toHaveURL('/login');
  });

  test('should persist session across navigation', async ({ loginAs, page, getSessionToken }) => {
    // Login
    const { sessionId } = await loginAs('worker');

    // Navigate to different pages
    await page.goto('/dashboard');
    await page.goto('/profile');
    await page.goto('/settings');

    // Session should persist
    const token = await getSessionToken();
    expect(token).toBe(sessionId);
  });

  test('should persist session in new tab (same context)', async ({ loginAs, context, getSessionToken }) => {
    // Login in first page
    const { sessionId } = await loginAs('worker');

    // Open new page in same context
    const newPage = await context.newPage();
    await newPage.goto('/dashboard');

    // Session should be available in new page
    const token = await newPage.evaluate(() => localStorage.getItem('lilith_session'));
    expect(token).toBe(sessionId);

    await newPage.close();
  });

  test('should maintain auth state after API calls', async ({ loginAs, page, ssoApi }) => {
    // Login
    const { sessionId, user } = await loginAs('worker');

    // Make API call to validate session
    const currentUser = await ssoApi.getCurrentUser(sessionId);
    expect(currentUser).toBeTruthy();
    expect(currentUser?.email).toBe(user.email);

    // Navigate to page - auth should still work
    await page.goto('/dashboard');
    await expect(page).not.toHaveURL('/login');
  });

  test('should handle session refresh correctly', async ({ loginAs, page, ssoApi }) => {
    // Login
    const { sessionId } = await loginAs('worker');

    // Validate session is working
    let isValid = await ssoApi.validateSession(sessionId);
    expect(isValid).toBe(true);

    // Wait a bit and validate again (simulates ongoing session)
    await page.waitForTimeout(2000);

    isValid = await ssoApi.validateSession(sessionId);
    expect(isValid).toBe(true);
  });
});
