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

from playwright.sync_api import Page
from tools.logger import get_logger
from locators.event_panel_locators import EventPanelLocators
from elements.tooltip_button_element import TooltipButton
from elements.tab_button_element import TabButton
from elements.button_element import Button
from components_derived.container_actions_events import ActionsEventsContainer
from components_derived.container_audit_events import AuditEventsContainer
from components_derived.container_events import EventsTabContainer
from components_derived.container_maintenance_events import MaintenanceEventsContainer
from components_derived.container_system_log_events import SystemLogEventsContainer
from components_derived.user_card import UserCard
from components.base_component import BaseComponent

logger = get_logger("EVENT_PANEL")


class EventPanelComponent(BaseComponent):
    """Компонент панели событий. Предоставляет методы для взаимодействия с ней."""

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

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

        super().__init__(page)

        self.expand_less_button = Button(page,
                                         page. locator(EventPanelLocators.BUTTON_EXPAND_LESS),
                                         "expand_less_button")
        self.expand_more_button = Button(page,
                                         page. locator(EventPanelLocators.BUTTON_EXPAND_MORE),
                                         "expand_more_button")

        self.states_tab = TabButton(page, page.locator(EventPanelLocators.TAB_STATES), "states_tab")
        self.actions_tab = TabButton(page, page.locator(EventPanelLocators.TAB_ACTIONS), "actions_tab")
        self.events_tab = TabButton(page, page.locator(EventPanelLocators.TAB_EVENTS), "events_tab")
        self.maintenance_tab = TabButton(page,
                                         page.locator(EventPanelLocators.TAB_MAINTENANCE), "maintenance_tab")
        self.system_log_tab = TabButton(page, page.locator(EventPanelLocators.TAB_SYSTEM_LOG), "system_log_tab")
        self.audit_tab = TabButton(page, page.locator(EventPanelLocators.TAB_AUDIT), "audit_tab")
        
        self.unknown_reason_button = TooltipButton(page,  
                                                   page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0),
                                                   "unknown_reason_button")
        self.warning_button = TooltipButton(page,
                                            page.locator(EventPanelLocators.BUTTONS_EVENT).nth(1),
                                            "warning_button")
        self.damage_button = TooltipButton(page,
                                           page.locator(EventPanelLocators.BUTTONS_EVENT).nth(2),
                                           "damage_button")
        self.failure_button = TooltipButton(page,
                                            page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3),
                                            "failure_button")

        self.user_button = Button(page, page.locator(EventPanelLocators.BUTTON_USER), "user_button")

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

        self.expand_less_button.click()

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

        self.expand_more_button.click()

    def click_actions_tab(self) -> ActionsEventsContainer:
        """Выполняет нажатие tab-кнопки Действия."""

        self.actions_tab.check_visibility("Actions tab button is missing on event panel")
        self.actions_tab.click()

        actions_tab = ActionsEventsContainer(self.page, EventPanelLocators.CONTAINER_ACTIONS_TAB)
        return actions_tab

    def click_audit_tab(self) -> AuditEventsContainer:
        """Выполняет нажатие tab-кнопки Аудит."""

        self.audit_tab.check_visibility("Audit tab button is missing on event panel")
        self.audit_tab.click()

        audit_tab = AuditEventsContainer(self.page, EventPanelLocators.CONTAINER_AUDIT_EVENTS)
        return audit_tab

    def click_events_tab(self) -> EventsTabContainer:
        """Выполняет нажатие tab-кнопки События."""

        self.events_tab.check_visibility("Events tab button is missing on event panel")
        self.events_tab.click()

        events_tab = EventsTabContainer(self.page, EventPanelLocators.CONTAINER_EVENTS_TAB)
        return events_tab

    def click_maintenance_tab(self) -> MaintenanceEventsContainer:
        """Выполняет нажатие tab-кнопки Обслуживание."""

        self.maintenance_tab.check_visibility("Maintenance tab button is missing on event panel")
        self.maintenance_tab.click()

        maintenance_tab = MaintenanceEventsContainer(self.page, EventPanelLocators.CONTAINER_MAINTENANCE_EVENTS)
        return maintenance_tab

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

        self.system_log_tab.check_visibility("System log tab button is missing on event panel")
        self.system_log_tab.click()

        system_log_events = SystemLogEventsContainer(self.page, EventPanelLocators.CONTAINER_SYSTEM_LOG_EVENTS)
        return system_log_events

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

        self.should_be_user_button()
        self.user_button.click(force=True)

        user_card = UserCard(self.page)
        return user_card

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

        user_card = self.click_user_button()
        user_card.click_logout_button()

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

        tooltip_texts = []

        tooltip_texts.append(self.unknown_reason_button.get_tooltip_text())
        tooltip_texts.append(self.warning_button.get_tooltip_text())
        tooltip_texts.append(self.damage_button.get_tooltip_text())
        tooltip_texts.append(self.failure_button.get_tooltip_text())

        return tooltip_texts

    def get_event_button_values(self) -> {}:
        """Возвращает набор значений кнопок счетчиков событий."""

        event_buttons_texts = {}

        event_buttons_texts['Неизвестно'] = self.unknown_reason_button.get_text(0)
        event_buttons_texts['Предупреждение'] = self.warning_button.get_text(0)
        event_buttons_texts['Повреждение'] = self.damage_button.get_text(0)
        event_buttons_texts['Авария'] = self.failure_button.get_text(0)

        return event_buttons_texts

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

        style_attr = self.page.locator(EventPanelLocators.AREA_EVENTS).get_attribute("style")
        position = "top"

        if style_attr.find("display: none;") == -1:
            height = style_attr.replace("position: relative;","").replace("height: ","").replace(";", "").lstrip()
            if height == "100%":
                position = "bottom"
            else:
                position = "center"

        return position

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

        try:
            _ = self.page.locator(EventPanelLocators.BUTTON_EXPAND_LESS)
        except TimeoutError:
            return False
        return True

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

        try:
            _ = self.page.locator(EventPanelLocators.BUTTON_EXPAND_MORE)
        except TimeoutError:
            return False
        return True

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

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

    def should_be_tab_buttons(self) -> None:
        """Проверяет наличие блока tab-кнопок Состояния, Действия, События, Обслуживание, Системный журнал, Аудит."""

        self.states_tab.check_have_text('Состояния', "Tab button with text Состояния is missing on event panel")
        self.actions_tab.check_have_text('Действия',"Tab button with text Действия is missing on event panel")
        self.events_tab.check_have_text('События', "Tab button with text События is missing on event panel")
        self.maintenance_tab.check_have_text('Обслуживание',
                                             "Tab button with text Обслуживание is missing on event panel")
        self.system_log_tab.check_have_text('Системный журнал',
                                            "Tab button with text Системный журнал is missing on event panel")
        self.audit_tab.check_have_text('Аудит',
                                       "Tab button with text Аудит is missing on event panel")

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

        self.unknown_reason_button.check_visibility("Unknown reason event button is missing on event panel")
        self.warning_button.check_visibility("Warning event button is missing on event panel")
        self.damage_button.check_visibility("Damage event button is missing on event panel")
        self.failure_button.check_visibility("Failure event button is missing on event panel")
