"""Модуль вкладки 'Конфигурация' в модуле Zero Touch Provisioning.

Содержит класс ZTPConfigTab для работы с таблицей конфигурации ZTP.
Позволяет проверять состояние и взаимодействовать с элементами вкладки.
"""

from playwright.sync_api import Page
from tools.logger import get_logger
from locators.table_locators import TableLocators
from elements.tooltip_button_element import TooltipButton
from components.toolbar_component import ToolbarComponent
from components.table_component import TableComponent
from pages.base_page import BasePage

logger = get_logger("ZTP_CONFIG_TAB")


class ZTPConfigTab(BasePage):
    """Класс для работы с вкладкой 'Конфигурация' в модуле Zero Touch Provisioning.

    Предоставляет методы для взаимодействия с таблицей конфигурации ZTP
    и проверки состояния элементов интерфейса. Включает функциональность для:
    - Проверки содержимого и структуры таблицы конфигурации
    - Прокрутки таблицы и проверки видимости строк
    - Выделения строк таблицы
    - Работы с кнопкой синхронизации (Reload) в заголовке таблицы
    - Проверки видимости и подсказок кнопок синхронизации

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

    def __init__(self, page: Page) -> None:
        """Инициализирует компоненты вкладки 'Конфигурация'.

        Args:
            page: Экземпляр страницы Playwright для взаимодействия с браузером.
        """
        super().__init__(page)

        # Компонент тулбара вкладки конфигурации
        self.toolbar = ToolbarComponent(page, "Конфигурация")

        # Компонент таблицы конфигурации ZTP
        self.ztp_config_table = TableComponent(page)

    # Действия:
    def click_sync_button(self, index: int) -> None:
        """Нажимает кнопку 'Reload' в указанной ячейке заголовка таблицы.

        Перед кликом проверяет наличие кнопки.

        Args:
            index: Индекс ячейки в заголовке таблицы.

        Raises:
            AssertionError: Если индекс выходит за пределы или кнопка не найдена.
        """

        # Проверяем наличие кнопки перед кликом
        sync_button = self.ztp_config_table.get_header_cell_button(TableLocators.TABLE_WORK_AREA, index)
        assert sync_button.is_enabled(), f"Sync button is missing in {index} header cell"

        # Выполняем клик по кнопке
        sync_button.click()
        logger.info("Нажата кнопка синхронизации (Reload)")

    def get_rows_count(self) -> int:
        """Возвращает количество строк в таблице конфигурации (без заголовка).

        Returns:
            int: Количество строк с данными конфигурации ZTP.

        Raises:
            AssertionError: Если таблица пуста или не загружена.
        """
        return self.ztp_config_table.get_rows_count(TableLocators.TABLE_WORK_AREA)

    def scroll_config_table_up(self) -> None:
        """Прокручивает таблицу конфигурации вверх до начала."""
        self.ztp_config_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)

    def scroll_config_table_down(self) -> None:
        """Прокручивает таблицу конфигурации вниз до конца."""
        self.ztp_config_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)

    # Проверки:
    def check_config_table_content(self) -> None:
        """Проверяет содержимое таблицы конфигурации ZTP.

        Проверяет соответствие заголовков таблицы ожидаемым значениям
        и наличие данных в таблице.

        Raises:
            AssertionError: Если таблица пуста или заголовки не соответствуют ожидаемым.
        """
        # Ожидаемые заголовки столбцов таблицы конфигурации ZTP
        expected_headers = [
            'sync',
            'IDENTIFIER',
            'MAC',
            'DHCPRELAY',
            'ШАБЛОН',
            'IPSETTODEVICE',
            'СТАТУС',
            'ДЕЙСТВИЯ'
        ]

        self.ztp_config_table.check_content(
            TableLocators.TABLE_WORK_AREA,
            expected_headers,
            False
        )

    def check_sync_button_visibility(self, index: int) -> None:
        """Проверяет видимость кнопки синхронизации (Reload) в указанной ячейке заголовка.

        Args:
            index: Индекс ячейки в заголовке таблицы.

        Raises:
            AssertionError: Если кнопка не видна на странице.
        """
        sync_button = self.ztp_config_table.get_header_cell_button(TableLocators.TABLE_WORK_AREA, index)
        assert sync_button.is_enabled(), f"Sync button is missing in {index} header cell"

        # Прокручиваем к элементу для гарантии видимости
        sync_button.scroll_into_view_if_needed()

        # Проверяем видимость кнопки
        assert sync_button.is_visible(), f"Sync button in header cell {index} is not visible"

        logger.info("Кнопка синхронизации (Reload) видима")

    def check_sync_button_tooltip(self, index: int, expected_tooltip: str = "reload") -> None:
        """Проверяет текст подсказки кнопки синхронизации (Reload).

        Использует стандартный механизм проверки подсказок из ToolbarComponent.

        Args:
            index: Индекс ячейки в заголовке таблицы.
            expected_tooltip: Ожидаемый текст подсказки (по умолчанию 'reload').

        Raises:
            AssertionError: Если подсказка не соответствует ожидаемой или отсутствует.
        """
        # Убеждаемся, что кнопка существует
        sync_button = self.ztp_config_table.get_header_cell_button(TableLocators.TABLE_WORK_AREA, index)
        assert sync_button.is_enabled(), f"Sync button is missing in {index} header cell"

        sync_tooltip_button = TooltipButton(self.page, sync_button, "sync_button")

        # Проверка подсказки
        sync_tooltip_button.check_tooltip_with_text(expected_tooltip)

        logger.info(
            "Подсказка кнопки синхронизации (Reload) в ячейке %d: '%s'",
            index,
            expected_tooltip
        )

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

        Returns:
            bool: True если таблица поддерживает вертикальную прокрутку, иначе False.
        """
        return self.ztp_config_table.is_scrollable_vertically(
            TableLocators.TABLE_SCROLL_CONTAINER
        )

    def check_config_table_first_row_visibility(self) -> None:
        """Проверяет видимость первой строки таблицы конфигурации.

        Raises:
            AssertionError: Если первая строка таблицы не видна.
        """
        self.ztp_config_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)

    def check_config_table_last_row_visibility(self) -> None:
        """Проверяет видимость последней строки таблицы конфигурации.

        Raises:
            AssertionError: Если последняя строка таблицы не видна.
        """
        self.ztp_config_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)

    def check_config_table_row_highlighting(self, row_index: int) -> None:
        """Проверяет выделение указанной строки таблицы конфигурации.

        Args:
            row_index: Индекс проверяемой строки (0-based, без учета заголовка).

        Raises:
            AssertionError: Если строка не выделена после взаимодействия.
        """
        self.ztp_config_table.check_row_highlighting(
            TableLocators.TABLE_WORK_AREA, row_index
        )

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

        Raises:
            AssertionError: Если тулбар отсутствует на странице.
        """
        self.toolbar.check_toolbar_presence("Toolbar is missing")

    def should_be_config_table(self) -> None:
        """Проверяет наличие и видимость таблицы конфигурации ZTP.

        Raises:
            AssertionError: Если таблица конфигурации отсутствует на странице.
        """
        self.ztp_config_table.check_visibility(
            TableLocators.TABLE_WORK_AREA, "Configuration table is missing"
        )
