"""Модуль главной страницы приложения.

Содержит класс MainPage для работы с элементами главной страницы.
Включает взаимодействие с панелью навигации, кнопками и карточкой пользователя.
"""

from playwright.sync_api import Page
from locators.navigation_panel_locators import NavigationPanelLocators
from locators.event_panel_locators import EventPanelLocators
from elements.button_element import Button
from components.navbar_component import NavigationPanelComponent
from components.card_component import CardComponent
from pages.base_page import BasePage

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

    Атрибуты:
        page: Экземпляр страницы Playwright.
        navigation_panel: Компонент панели навигации.
        user_button: Кнопка пользователя.
        user_card: Карточка пользователя.
    """

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

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

        super().__init__(page)

        self.navigation_panel = NavigationPanelComponent(page)

        locators = self.page.locator(EventPanelLocators.BUTTONS_BLOCK).get_by_role("button").all()
        self.user_button = Button(page, locators[0], "search_button")
        self.user_button = Button(page, locators[1], "user_button")

        self.user_card = CardComponent(page)

    # Действия:
    def click_main_navigation_panel_item(self, item_name: str) -> None:
        """Кликает по элементу основной панели навигации.

        Args:
            item_name: Название элемента для клика.
        """

        self.navigation_panel.click_item(NavigationPanelLocators.PANEL_MAIN, item_name)

    def click_configuration_navigation_panel_item(self, item_name: str) -> None:
        """Кликает по элементу подраздела 'Конфигурация'.

        Args:
            item_name: Название элемента для клика.
        """

        self.navigation_panel.click_sub_item(NavigationPanelLocators.PANEL_MAIN, 1, item_name)

    def click_maintenance_navigation_panel_item(self, item_name: str) -> None:
        """Кликает по элементу подраздела 'Обслуживание'.

        Args:
            item_name: Название элемента для клика.
        """

        self.navigation_panel.click_sub_item(NavigationPanelLocators.PANEL_MAIN, 2, item_name)

    def click_user_button(self) -> None:
        """Кликает по кнопке пользователя."""

        self.user_button.click()

    def do_logout(self) -> None:
        """Выполняет выход из системы."""

        self.should_be_user_button()
        self.click_user_button()
        self.user_card.click_logout_button()

    def expand_navigation_subpanel(self):
        """Выполняет полное открытие активной главной навигационной подпанели."""

        active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)
        node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first

        # Рекурсивный обход дерева v-treeview выбранной подпанели и вывод информации об элементах в режиме отладки (debug=True)
        self.navigation_panel.traverse_panel_tree(node_locator, debug=False)

    def scroll_navigation_panel_up(self) -> None:
        """Прокручивает панель навигации вверх."""

        self.navigation_panel.scroll_up(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)

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

        self.navigation_panel.scroll_down(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)

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

        self.navigation_panel.check_presence(
            NavigationPanelLocators.PANEL_MAIN,
            "Navigation panel is missing"
        )

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

        self.user_button.check_presence("User button is missing on event panel")

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

        Returns:
            bool: True если прокрутка возможна, иначе False.
        """

        return self.navigation_panel.is_scrollable_vertically(
            NavigationPanelLocators.PANEL_SCROLL_CONTAINER
        )

    def check_navigation_panel_item_visibility(self, item_name: str) -> None:
        """Проверяет видимость элемента в панели навигации.

        Args:
            item_name: Название элемента для проверки.
        """

        self.navigation_panel.check_item_visibility(
            NavigationPanelLocators.PANEL_MAIN,
            item_name
        )
