import { test, expect } from '../../fixtures.js';

test.describe('Auth: Login', () => {
  test('login page shows logo and card', async ({ adminPage, customerConfig }) => {
    // Navigate to login page (unauthenticated view)
    const loginUrl = `${customerConfig.url}/admin/login`;

    // Use a fresh context without session cookie
    const context = await adminPage.context().browser()!.newContext({
      baseURL: customerConfig.url,
      ignoreHTTPSErrors: true,
    });
    const page = await context.newPage();

    await page.goto(loginUrl);
    await expect(page).toHaveURL(/\/login/);

    // Verify MasterEV logo/heading
    await expect(page.locator('h1').filter({ hasText: 'MasterEV' })).toBeVisible({ timeout: 10_000 });

    // Verify login card
    await expect(page.locator('p-card').first()).toBeVisible({ timeout: 5_000 });

    await context.close();
  });

  test('login form has username and password fields', async ({ adminPage, customerConfig }) => {
    const context = await adminPage.context().browser()!.newContext({
      baseURL: customerConfig.url,
      ignoreHTTPSErrors: true,
    });
    const page = await context.newPage();

    await page.goto(`${customerConfig.url}/admin/login`);
    await expect(page.locator('p-card').first()).toBeVisible({ timeout: 10_000 });

    // Verify username input. Every customer ships the password provider
    // (the adminPage fixture itself logs in via password), so a missing
    // form is a product failure.
    const usernameInput = page.locator('input[formcontrolname="username"]').first();
    await expect(usernameInput).toBeVisible({ timeout: 10_000 });

    // Verify password input
    await expect(page.locator('input[formcontrolname="password"]').first()).toBeVisible();

    // Submit button should be visible and disabled when form is empty
    const submitButton = page.locator('p-button[type="submit"] button, button[type="submit"]').first();
    await expect(submitButton).toBeVisible();
    await expect(submitButton).toBeDisabled();

    await context.close();
  });

  test('login with wrong credentials shows error', async ({ adminPage, customerConfig }) => {
    const context = await adminPage.context().browser()!.newContext({
      baseURL: customerConfig.url,
      ignoreHTTPSErrors: true,
    });
    const page = await context.newPage();

    await page.goto(`${customerConfig.url}/admin/login`);
    await expect(page.locator('p-card').first()).toBeVisible({ timeout: 10_000 });

    // Every customer ships the password provider (the adminPage fixture
    // itself logs in via password), so a missing form is a product failure.
    const usernameInput = page.locator('input[formcontrolname="username"]').first();
    await expect(usernameInput).toBeVisible({ timeout: 10_000 });

    // Fill in wrong credentials
    await usernameInput.fill('nonexistent-e2e-user');
    await page.locator('input[formcontrolname="password"]').first().fill('wrong-password');

    // Submit
    const submitButton = page.locator('p-button[type="submit"] button, button[type="submit"]').first();
    await submitButton.click();

    // Give a potential (wrong) redirect time to happen, then assert the
    // login was rejected: we must still be on the login page.
    await page.waitForTimeout(3_000);
    await expect(page).toHaveURL(/\/login/);

    await context.close();
  });

  test('successful login redirects to admin', async ({ adminPage }) => {
    // The adminPage fixture already performed a successful login
    // Verify we're on an admin page
    await adminPage.goto('/admin');
    await expect(adminPage).toHaveURL(/\/admin/);
    await expect(adminPage).not.toHaveURL(/\/login/);
  });
});
