import { test, expect } from '@playwright/test';
import { login, logout, TEST_USER } from '../helpers/auth';
import { acceptCookieConsent } from '../helpers/utils';

test.describe('Login Flow', () => {
  test.beforeEach(async ({ page }) => {
    // Start at login page
    await page.goto('/login');
    // Accept cookie consent if present
    await acceptCookieConsent(page);
  });

  test('should display login form', async ({ page }) => {
    // Verify login page elements are visible (support both English and Spanish)
    await expect(page.getByLabel(/email|correo/i)).toBeVisible();
    await expect(page.getByRole('textbox', { name: /password|contraseña/i })).toBeVisible();
    await expect(page.getByRole('button', { name: /log in|sign in|login|acceder/i })).toBeVisible();
  });

  test('should successfully login with valid credentials', async ({ page }) => {
    // Fill in credentials
    await page.getByLabel(/email|correo/i).fill(TEST_USER.email);
    await page.getByRole('textbox', { name: /password|contraseña/i }).fill(TEST_USER.password);

    // Click login button
    await page.getByRole('button', { name: /log in|sign in|login|acceder/i }).click();

    // Should redirect to dashboard or app
    await expect(page).toHaveURL(/\/(app|dashboard)/, { timeout: 10000 });

    // Verify we see dashboard content
    await expect(page.locator('body')).toContainText(/dashboard|panel de control/i);
  });

  test('should show error with invalid email', async ({ page }) => {
    // Fill in invalid credentials
    await page.getByLabel(/email|correo/i).fill('invalid@email.com');
    await page.getByRole('textbox', { name: /password|contraseña/i }).fill('wrongpassword');

    // Click login button
    await page.getByRole('button', { name: /log in|sign in|login|acceder/i }).click();

    // Should show error message
    await expect(page.locator('body')).toContainText(/invalid|incorrect|error|credenciales/i, {
      timeout: 5000,
    });

    // Should stay on login page
    await expect(page).toHaveURL(/\/login/);
  });

  test('should show validation error for empty email', async ({ page }) => {
    // Try to submit without email
    await page.getByRole('textbox', { name: /password|contraseña/i }).fill('somepassword');
    await page.getByRole('button', { name: /log in|sign in|login|acceder/i }).click();

    // Should show validation error (either inline or toast)
    const bodyText = await page.locator('body').textContent();
    expect(bodyText).toMatch(/required|obligatorio|necesario/i);
  });

  test('should show validation error for empty password', async ({ page }) => {
    // Try to submit without password
    await page.getByLabel(/email|correo/i).fill('test@example.com');
    await page.getByRole('button', { name: /log in|sign in|login|acceder/i }).click();

    // Should show validation error
    const bodyText = await page.locator('body').textContent();
    expect(bodyText).toMatch(/required|obligatorio|necesario/i);
  });

  test('should toggle password visibility', async ({ page }) => {
    const passwordInput = page.getByRole('textbox', { name: /password|contraseña/i });

    // Initially should be password type
    await expect(passwordInput).toHaveAttribute('type', 'password');

    // Look for toggle button (eye icon, "show password", etc.)
    const toggleButton = page.getByRole('button', { name: /show|mostrar.*password|contraseña/i });

    const isToggleVisible = await toggleButton.isVisible({ timeout: 2000 }).catch(() => false);

    if (isToggleVisible) {
      await toggleButton.click();

      // Should change to text type
      await expect(passwordInput).toHaveAttribute('type', 'text');

      // Toggle back
      await toggleButton.click();
      await expect(passwordInput).toHaveAttribute('type', 'password');
    }
  });

  test('should have link to registration page', async ({ page }) => {
    // Look for register/signup button or link
    const registerButton = page.getByRole('button', { name: /register|sign up|crear cuenta|registrar/i });
    const registerLink = page.getByRole('link', { name: /register|sign up|crear cuenta|registrar/i });

    const isButtonVisible = await registerButton.isVisible({ timeout: 2000 }).catch(() => false);
    const isLinkVisible = await registerLink.isVisible({ timeout: 2000 }).catch(() => false);

    if (isLinkVisible) {
      await expect(registerLink).toHaveAttribute('href', /\/register/);
    } else if (isButtonVisible) {
      // If it's a button, just verify it exists
      await expect(registerButton).toBeVisible();
    }
  });

  test('should redirect to app if already logged in', async ({ page, context }) => {
    // First login
    await login(page, TEST_USER);

    // Try to go to login page again
    await page.goto('/login');

    // Should redirect to app/dashboard
    await expect(page).toHaveURL(/\/(app|dashboard)/, { timeout: 5000 });
  });
});
