"""Модуль компонента модального окна. Содержит класс для работы с модальными окнами,
их элементами и проверками."""

from playwright.sync_api import Page
from tools.logger import get_logger
from locators.modal_window_locators import ModalWindowLocators
from elements.button_element import Button
from components.toolbar_component import ToolbarComponent
from components.base_component import BaseComponent

logger = get_logger("MODAL_WINDOW")


class ModalWindowComponent(BaseComponent):
    """Компонент модального окна. Предоставляет методы для взаимодействия с окном,
    его содержимым и проверок."""

    def __init__(self, page: Page):
        super().__init__(page)
        self.toolbar = ToolbarComponent(page, "")
        self.content_items = {}
        self.buttons = []

    # Действия:
    def add_content_item(self, name: str, item: object) -> None:
        """Добавляет элемент содержимого в окно по заданному имени."""

        self.content_items[name] = item

    def get_content_item(self, name: str) -> object | None:
        """Возвращает элемент содержимого по имени или None, если не найден."""

        return self.content_items.get(name)

    def add_toolbar_title(self, title: str) -> None:
        """Добавляет заголовок в панель инструментов модального окна."""

        self.toolbar.add_title(title)

    def add_toolbar_button(self, locator: str, name: str) -> None:
        """Добавляет кнопку в панель инструментов модального окна."""

        self.toolbar.add_tooltip_button(locator, name)

    def add_button(self, locator: str, name: str) -> None:
        """Добавляет кнопку в модальное окно."""

        self.buttons.append(Button(self.page, locator, name))

    def get_button_by_name(self, name: str) -> Button | None:
        """Ищет и возвращает кнопку по имени или None, если не найдена."""

        for button in self.buttons:
            if button.name == name:
                return button
        return None

    def click_button(self, name: str) -> None:
        """Кликает по кнопке с заданным именем. Вызывает ошибку, если не найдена."""

        button = self.get_button_by_name(name)
        if button is None:
            assert False, f"Button with name '{name}' not found"
        button.click()

    def click_toolbar_close_button(self) -> None:
        """Кликает по кнопке закрытия в панели инструментов."""

        self.toolbar.click_button("close")

    def scroll_window_down(self) -> None:
        """Прокручивает содержимое окна вниз."""

        self.scroll_down(ModalWindowLocators.MODAL_WINDOW)

    def scroll_window_up(self) -> None:
        """Прокручивает содержимое окна вверх."""

        self.scroll_up(ModalWindowLocators.MODAL_WINDOW)

    def scroll_window_left(self) -> None:
        """Прокручивает содержимое окна влево."""

        self.scroll_left(ModalWindowLocators.MODAL_WINDOW)

    def scroll_window_right(self) -> None:
        """Прокручивает содержимое окна вправо."""

        self.scroll_right(ModalWindowLocators.MODAL_WINDOW)

    # Проверки:
    def check_window_vertical_scrolling(self) -> bool:
        """Проверяет возможность вертикальной прокрутки окна."""

        return self.is_scrollable_vertically(ModalWindowLocators.MODAL_WINDOW)

    def check_window_horizontal_scrolling(self) -> bool:
        """Проверяет возможность горизонтальной прокрутки окна."""

        return self.is_scrollable_horizontally(ModalWindowLocators.MODAL_WINDOW)

    def check_by_window_title(self) -> None:
        """Проверяет наличие окна по заголовку."""

        self.toolbar.check_toolbar_presence(f"Modal window with '{self.toolbar.title}' is missing")

    def check_button_visibility(self, name: str) -> None:
        """Проверяет наличие кнопки по имени. Вызывает ошибку, если не найдена."""

        button = self.get_button_by_name(name)
        if button is None:
            assert False, f"Button with name '{name}' not found"
        button.check_visibility(f"Button with name '{name}' is missing")

    def check_toolbar_button_visibility(self, name: str) -> None:
        """Проверяет наличие кнопки в панели инструментов."""

        self.toolbar.check_button_visibility(name)

    def check_toolbar_button_tooltip(self, name: str, tooltip: str) -> None:
        """Проверяет подсказку у кнопки в панели инструментов."""

        self.toolbar.check_button_tooltip(name, tooltip)
