"""Модуль text_input_element содержит класс для работы с текстовыми полями ввода.

Класс TextInput наследует базовый функционал BaseElement и предоставляет
методы для взаимодействия с текстовыми полями ввода на странице.
"""

from playwright.sync_api import expect
from tools.logger import get_logger
from elements.base_element import BaseElement

logger = get_logger("TEXT_INPUT")


class TextInput(BaseElement):
    """Класс для работы с текстовыми полями ввода.

    Наследует функциональность BaseElement и добавляет методы
    для ввода, очистки и проверки текстовых полей.
    """

    @property
    def type_of(self) -> str:
        """Возвращает тип элемента ('текстовое поле ввода').

        Returns:
            str: Тип элемента - 'текстовое поле ввода'.
        """

        return "text input"

    # Действия:
    def get_input_value(self) -> str:
        """Возвращает текущее значение поля ввода.

        Returns:
            str: Текущее значение в поле.
        """

        logger.info(f'Getting value from text input "{self.name}"')
        return self.locator.input_value()

    def get_input_type(self) -> str:
        """Возвращает значение аттрибута type поля ввода.

        Returns:
            str: Значение аттрибута type.
        """

        return self.locator.get_attribute("type")

    def decrease_value(self) -> None:
        """Уменьшение на единицу значения поля настройки с помощью стрелочки вниз."""

        logger.info(f'Decrease input value for "{self.name}"')

        attr = self.locator.get_attribute("type")
        assert attr=="number", "Field type should be number to increase value"

        self.locator.hover()
        self.locator.wait_for(timeout=500)
        self.locator.press('ArrowDown')
        self.locator.wait_for(timeout=500)

    def increase_value(self) -> None:
        """Увеличение на единицу значения поля настройки с помощью стрелочки вверх."""

        logger.info(f'Increase input value for "{self.name}"')

        attr = self.locator.get_attribute("type")
        assert attr=="number", "Field type should be number to increase value"

        self.locator.hover()
        self.locator.wait_for(timeout=500)
        self.locator.press('ArrowUp')
        self.locator.wait_for(timeout=500)

    def input_value(self, value: str) -> None:
        """Вводит указанное значение в поле.

        Args:
            value (str): Значение для ввода.
        """

        logger.info(f'Inputting value "{value}" to text input "{self.name}"')
        self.locator.fill(value)

    def clear(self) -> None:
        """Очищает содержимое текстового поля."""

        logger.info(f'Clearing text input "{self.name}"')
        self.locator.press('Control+A')
        self.locator.press('Backspace')

    # Проверки:
    def check_empty_input(self, msg: str) -> None:
        """Проверяет, что поле ввода пустое.

        Args:
            msg (str): Сообщение об ошибке при неудачной проверке.

        Raises:
            AssertionError: Если поле не пустое.
        """

        logger.info(f'Checking that text input "{self.name}" is empty')
        expect(self.locator).to_be_empty(), msg

    def check_editable_input(self, msg: str) -> None:
        """Проверяет, что поле ввода редактируемое.

        Args:
            msg (str): Сообщение об ошибке при неудачной проверке.

        Raises:
            AssertionError: Если поле не пустое.
        """

        logger.info(f'Checking that text input "{self.name}" is editable')
        expect(self.locator).to_be_editable(), msg
