"""Модуль контейнера для отображения событий аудита.

Содержит класс для работы с контейнером для отображения событий
аудита через Playwright.
"""

from playwright.sync_api import Page, Locator
from tools.logger import get_logger
from locators.event_panel_locators import EventPanelLocators
from components.events_container_component import EventsContainerComponent

logger = get_logger("AUDIT_EVENTS_CONTAINER")


class AuditEventsContainer(EventsContainerComponent):
    """Компонент контейнера для отображения событий аудита.

    Предоставляет методы для взаимодействия с элементами
    контейнера для отображения событий аудита.
    """

    def __init__(self, page: Page, locator: str | Locator):
        """Инициализирует компонент контейнера для отображения событий аудита.

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

        super().__init__(page, locator)

        toolbar_locator = self.get_locator(locator).locator(EventPanelLocators.TOOLBAR)

        self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.FILTER_TOOLBAR_BUTTON), "filter_button")
        self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.EVENTS_TOOLBAR_BUTTON), "view_events_button")
        self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.PDF_TOOLBAR_BUTTON), "export_to_pdf_button")
        self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.CSV_TOOLBAR_BUTTON), "export_to_csv_button")

        events_filter = self.get_events_filter()
        events_filter.add_filtering_parameter("filter_type", "Тип")
        events_filter.add_filtering_parameter("filter_role", "Роль")
        events_filter.add_filtering_parameter("filter_name", "Имя")
        events_filter.add_filtering_parameter("filter_ip", "ip")

    # Действия:
    # Проверки:
    def check_content(self) -> None:
        """Проверяет содержимое контейнера для отображения событий аудита."""

        expected_headers = [ 'ВРЕМЯ', 'ОПИСАНИЕ', 'ИДЕНТИФИКАТОР']

        self.should_be_toolbar()
        self.should_be_toolbar_buttons()

        if not self.is_tab_active("view_events_button"):
            self.click_tab_button("view_events_button")
            self.wait_for_timeout(1000)

        self.should_be_events_table()
        events_table = self.get_events_table_content()

        if len(events_table) == 0:
            assert False, "The contents of the events table are missing"

        self.check_events_table_headers(events_table[0], expected_headers)

        if len(events_table) == 1:
            logger.info("Table body is missing")

        self.should_be_pagination_buttons()

        events_filter = self.click_filter_button()
        events_filter.check_content()

        events_filter.should_be_filtering_parameter("Тип")
        events_filter.should_be_filtering_parameter("Роль")
        events_filter.should_be_filtering_parameter("Имя")
        events_filter.should_be_filtering_parameter("ip")

        events_filter.click_close_button()

    def check_content_security(self) -> None:
        """Проверяет содержимое контейнера для отображения событий безопасности."""

        expected_headers = [ 'ВРЕМЯ', 'ОПИСАНИЕ', 'ИДЕНТИФИКАТОР', 'ТИП']

        self.should_be_toolbar()
        self.should_be_toolbar_buttons()

        if not self.is_tab_active("view_events_button"):
            self.click_tab_button("view_events_button")
            self.wait_for_timeout(1000)

        self.should_be_events_table()
        events_table = self.get_events_table_content()

        if len(events_table) == 0:
            assert False, "The contents of the events table are missing"

        self.check_events_table_headers(events_table[0], expected_headers)

        if len(events_table) == 1:
            logger.info("Table body is missing")

        self.should_be_pagination_buttons()

        events_filter = self.click_filter_button()
        events_filter.check_content()

        events_filter.should_be_filtering_parameter("Тип")
        events_filter.should_be_filtering_parameter("Роль")
        events_filter.should_be_filtering_parameter("Имя")
        events_filter.should_be_filtering_parameter("ip")

        events_filter.click_close_button()

    def should_be_toolbar_buttons(self) -> None:
        """Проверяет наличие и видимость кнопок тулбара."""

        self.toolbar.check_button_visibility("filter_button")
        self.toolbar.check_button_visibility("view_events_button")
        self.toolbar.check_button_visibility("export_to_pdf_button")
        self.toolbar.check_button_visibility("export_to_csv_button")
