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

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

from playwright.sync_api import Page
from locators.navigation_panel_locators import NavigationPanelLocators
from components_derived.container_system_log_events import SystemLogEventsContainer
from components_derived.user_card import UserCard
from components.eventbar_component import EventPanelComponent
from components.navbar_component import NavigationPanelComponent
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)
        self.event_panel = EventPanelComponent(page)

    # Действия:
    def click_events_panel_expand_less_button(self) -> None:
        """Выполняет нажатие кнопки галочка вверх."""

        self.event_panel.click_expand_less_button()

    def click_events_panel_expand_more_button(self) -> None:
        """Выполняет нажатие кнопки галочка вниз."""

        self.event_panel.click_expand_more_button()

    def click_events_panel_system_log_tab(self) -> SystemLogEventsContainer:
        """Выполняет нажатие tab-кнопки Системный журнал."""

        return self.event_panel.click_system_log_tab()

    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_subpanel_item(self, item_name: str, parent=None) -> None:
        """Выполняет рекурсивный поиск по панели навигации
        заданного элемента и делает клик по нему."""

        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 заданного элемента
        # и клик по нему
        self.navigation_panel.click_sub_item(
            node_locator, item_name, parent
        )

    def click_user_button(self) -> UserCard:
        """Выполняет нажатие кнопки пользователя."""

        return self.event_panel.click_user_button()

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

        self.event_panel.do_logout()

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

        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 get_event_counters_by_buttons(self) -> dict:
        """Возвращает набор значений кнопок счетчиков событий."""

        return self.event_panel.get_event_button_values()

    def get_event_counters_by_tooltips(self) -> dict:
        """Возвращает набор текстов всплывающих подсказок
        кнопок счетчиков событий."""

        events = self.event_panel.get_event_tooltip_texts()

        event_counters = {}

        for event in events:
            if len(event) > 0:
                event_name, count = event.split(" ")
                event_counters[event_name] = count
        return event_counters

    def get_events_panel_position(self) -> str:
        """Возвращает текущее положение панели событий
        относительно страницы: "top", "center","bottom"."""

        return self.event_panel.get_panel_position()

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

        self.navigation_panel.scroll_down(
            NavigationPanelLocators.PANEL_SCROLL_CONTAINER
        )

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

        self.navigation_panel.scroll_up(
            NavigationPanelLocators.PANEL_SCROLL_CONTAINER
        )

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

        return self.event_panel.check_expand_less_button()

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

        return self.event_panel.check_expand_more_button()

    def check_navigation_item_exists(self, item_name: str) -> bool:
        """Проверяет существование элемента в навигационной панели.

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

        Returns:
            bool: True если элемент существует, False если нет
        """
        return self.navigation_panel.is_item_visible(
            NavigationPanelLocators.PANEL_MAIN,
            item_name
        )

    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
        )

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

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

        return self.navigation_panel.is_scrollable_vertically(
            NavigationPanelLocators.PANEL_SCROLL_CONTAINER
        )

    def should_be_event_panel(self) -> None:
        """Проверяет наличие элементов панели событий."""

        ## to-do: кнопки галочки???
        self.event_panel.should_be_tab_buttons()
        self.event_panel.should_be_event_buttons()
        self.event_panel.should_be_search_button()
        self.event_panel.should_be_user_button()

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

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