import { type Page, type Locator, expect } from '@playwright/test';

export class LoginPage {
  // --- Свойства класса (элементы страницы) ---
  readonly page: Page;
  
  // Поля ввода
  readonly emailInput: Locator;
  readonly passwordInput: Locator;

  // Кнопки
  readonly loginButton: Locator;
  readonly forgotPasswordLink: Locator;
  readonly registerLink: Locator;

  // Другие элементы
  readonly passwordVisibilityToggle: Locator; // "Глазик"
  readonly menuButton: Locator;


  // --- Конструктор ---
  constructor(page: Page) {
    this.page = page;

    // --- Инициализация локаторов ---
    // Используем рекомендованные Playwright методы для поиска элементов.
    // Они более надежны, чем классы.

    // Ищем поля по их видимым placeholder'ам
    this.emailInput = page.getByPlaceholder('Email');
    this.passwordInput = page.getByPlaceholder('Пароль');

    // Ищем кнопку по ее роли и видимому тексту. Самый надежный способ.
    this.loginButton = page.getByRole('button', { name: 'Войти', exact: true });
    
    // Ищем ссылки и кликабельные тексты
    this.forgotPasswordLink = page.getByText('Забыли пароль?');
    this.registerLink = page.getByText('Зарегистрируйтесь');
    
    // "Глазик" для показа/скрытия пароля ищем по alt-тексту картинки
    this.passwordVisibilityToggle = page.getByAltText('показать пароль');
    
    // Кнопку меню найдем по уникальному классу, так как другого варианта нет.
    // Это менее надежно, но в данном случае приемлемо.
    this.menuButton = page.locator('button.NavBar_NavBarButton__apzgO');
  }

  // --- Методы (действия на странице) ---

  /**
   * Метод для перехода на страницу логина.
   */
  async goto() {
    // Переходим в корень сайта, так как у нас там форма логина.
    // baseURL подставится автоматически из playwright.config.ts
    await this.page.goto('/login/authorization');
  }

  /**
   * Метод для выполнения полного цикла логина.
   * @param email - email пользователя
   * @param password - пароль пользователя
   */
  async login(email: string, password: string) {
    //await expect(this.loginButton).toBeVisible();

    await this.emailInput.fill(email);
    await this.passwordInput.fill(password);
    await this.loginButton.click();
  }

  /**
   * Метод для перехода на страницу регистрации.
   */
  async goToRegisterPage() {
    await this.registerLink.click();
  }
}