"""Модуль страницы авторизации.

Содержит класс LoginPage для работы с элементами страницы входа в систему.
Использует Playwright для взаимодействия с UI и обработки ответов сервера.
"""

from playwright.sync_api import Page
from locators.text_input_locators import TextInputLocators
from elements.text_input_element import TextInput
from elements.icon_element import Icon
from elements.button_element import Button
from data.environment import host
from data.constants import Constants
from components.alert_component import AlertComponent
from pages.base_page import BasePage

class LoginPage(BasePage):
    """Класс для работы со страницей авторизации.

    Атрибуты:
        page: Экземпляр страницы Playwright.
        login_input: Поле ввода логина.
        password_input: Поле ввода пароля.
        login_button: Кнопка входа.
        alert: Алерт окно с сообщением об ошибке.
    """

    def __init__(self, page: Page) -> None:
        """Инициализирует элементы страницы авторизации.

        Args:
            page: Экземпляр страницы Playwright.
        """

        super().__init__(page)

        self.login_input = TextInput(page, page.get_by_label("Имя пользователя"), "login input")
        self.password_input = TextInput(page, page.get_by_label("Пароль"), "password input")

        icon_locator = page.get_by_label("Пароль").locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
        self.password_hidden_icon = Icon(page,
                                         icon_locator,
                                         "password hidden icon")
        self.login_button = Button(page, page.get_by_role("button"), "login button")

        self.alert = AlertComponent(page)

    # Действия:
    def click_password_hidden_icon(self) -> None:
        """Нажатие на иконку скрытия пароля."""

        self.password_hidden_icon.click()

    def do_login(self, username: str = None, password: str = None) -> None:
        """Выполняет вход в систему.

        Использует переданные учетные данные или значения из Constants.
        Обрабатывает ответ сервера для получения токена доступа.

        Args:
            username: Логин пользователя. По умолчанию из Constants.
            password: Пароль пользователя. По умолчанию из Constants.

        Raises:
            AssertionError: Если после входа открылась неожиданная страница.
        """

        def handle_response(response):
            if "login" in response.url:
                response_body = self.get_response_body(response)
                if response_body:
                    host.set_current_user_credential(response_body)

        self.page.on("response", handle_response)

        self.open("")

        # Используем переданные значения или значения по умолчанию из Constants
        actual_username = username if username is not None else Constants.login
        actual_password = password if password is not None else Constants.password

        self.login_input.clear()
        self.login_input.input_value(actual_username)

        self.password_input.clear()
        self.password_input.input_value(actual_password)

        self.login_button.click()

        self.check_URL("dashboard", "An unexpected page has been opened")

    def do_unsuccessful_login(self, username: str = "someuser", password: str = "password") -> None:
        """Выполняет попытку входа с неверными учетными данными.

        Проверяет наличие сообщения об ошибке. Можно передать свои данные
        или использовать значения по умолчанию.

        Args:
            username: Неверный логин. По умолчанию "someuser".
            password: Неверный пароль. По умолчанию "password".
        """

        self.open("")

        self.login_input.clear()
        self.login_input.input_value(username)

        self.password_input.clear()
        self.password_input.input_value(password)

        self.login_button.click()

        alert_type = self.alert.get_alert_type()
        assert alert_type=="error", f"Expected error alert, but got {alert_type} alert"

        self.alert.check_alert_presence("Неверная пара логин/пароль")
        self.alert.check_alert_absence("Неверная пара логин/пароль")

    # Проверки:
    def is_password_icon_hidden(self) -> bool:
        """Проверяет состояние иконки скрытия символов пароля.
           Возвращает True если пароль будет скрыт, иначе False
        """

        return self.password_hidden_icon.is_password_hidden()

    def is_password_hidden(self) -> bool:
        """Проверяет видимость символов пароля."""

        input_type = self.password_input.get_input_type()
        if input_type == "password":
            return True
        elif input_type == "text":
            return False
        else:
            assert False, "Check password hidden error"
