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

Содержит тесты для проверки функциональности
работы с конфигурациями ZTP.
"""
import pytest

from playwright.sync_api import Page
from pages.login_page import LoginPage
from pages.main_page import MainPage
from pages.ztp_config_tab import ZTPConfigTab

# @pytest.mark.smoke
class TestZTPConfigTab:
    """Набор тестов для вкладки 'Конфигурация' в модуле Zero Touch Provisioning.

    Проверяет корректность отображения, функциональность элементов интерфейса
    на вкладке конфигурации ZTP.

    Тесты покрывают следующие функциональные области:
    1. test_ztp_config_tab_content - Базовая структура и содержимое вкладки
    2. test_ztp_config_sync_buttons - Функциональность кнопок синхронизации
    3. test_ztp_config_table_row_highlighting - Визуальное выделение строк таблицы
    4. test_ztp_config_table_scrolling - Навигация по таблице с большим объемом данных
    """

    @pytest.fixture(scope="function", autouse=True)
    def setup(self, browser: Page) -> None:
        """Фикстура для подготовки тестового окружения.

        Выполняет:
        1. Авторизацию в системе
        2. Переход на вкладку 'Конфигурация' через панель навигации

        Args:
            browser (Page): Экземпляр страницы Playwright для взаимодействия с UI
        """
        # Авторизация в системе
        login_page = LoginPage(browser)
        login_page.do_login()

        # Инициализация главной страницы
        main_page = MainPage(browser)

        # Проверка и взаимодействие с элементами навигации
        main_page.should_be_navigation_panel()
        main_page.click_main_navigation_panel_item("Настройки")
        main_page.click_subpanel_item("Zero Touch Provisioning")
        main_page.click_subpanel_item("Конфигурация", parent="Zero Touch Provisioning")
        main_page.wait_for_timeout(1000)

    # @pytest.mark.develop
    def test_ztp_config_tab_content(self, browser: Page) -> None:
        """Тест содержимого вкладки 'Конфигурация' ZTP.

        Проверяет:
        1. Наличие и корректность тулбара
        2. Наличие таблицы конфигураций
        3. Соответствие содержимого таблицы

        Args:
            browser (Page): Экземпляр страницы Playwright для взаимодействия с UI
        """
        # Инициализация страницы конфигурации ZTP
        config_tab = ZTPConfigTab(browser)

        # Проверка тулбара вкладки
        config_tab.should_be_toolbar()

        # Проверка наличия таблицы конфигурации
        config_tab.should_be_config_table()

        # Проверка содержимого таблицы конфигураций
        config_tab.check_config_table_content()

    def test_ztp_config_sync_buttons(self, browser: Page) -> None:
        """Тест функциональности кнопки синхронизации (Reload) в таблице конфигурации ZTP.

        Проверяет:
        1. Наличие и видимость кнопки синхронизации в заголовке таблицы
        2. Корректность текста подсказки кнопки (должна быть 'reload')
        3. Работоспособность кнопки при клике
        4. Интеграцию кнопки с системой управления подсказками тулбара

        Args:
            browser (Page): Экземпляр страницы Playwright для взаимодействия с UI.
        """
        # Инициализация страницы конфигурации ZTP
        config_tab = ZTPConfigTab(browser)

        # Проверка наличия таблицы конфигурации
        config_tab.should_be_config_table()

        # Ожидание загрузки данных таблицы
        browser.wait_for_timeout(3000)

        # Тестирование кнопки синхронизации в первой ячейке заголовка (индекс 0)
        # Проверка видимости кнопки
        config_tab.check_sync_button_visibility(0)

        # Проверка корректности подсказки кнопки
        config_tab.check_sync_button_tooltip(0)

        # Проверка работоспособности кнопки при клике
        config_tab.click_sync_button(0)

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

        Проверяет корректность выделения строк при клике на различные позиции:
        1. Первая строка
        2. Последняя строка
        3. Строка в середине таблицы

        Args:
            browser (Page): Экземпляр страницы Playwright для взаимодействия с UI
        """
        config_tab = ZTPConfigTab(browser)

        # Проверка тулбара вкладки
        config_tab.should_be_toolbar()

        # Проверка наличия таблицы конфигураций
        config_tab.should_be_config_table()

        # Получение количества строк в таблице
        rows_count = config_tab.get_rows_count()

        # Если таблица пустая - логируем и завершаем
        if rows_count == 0:
            print("Таблица пустая - проверка выделения строк не выполняется")
            return

        # Проверка выделения строк в различных позициях таблицы
        config_tab.check_config_table_row_highlighting(0)  # Первая строка
        config_tab.check_config_table_row_highlighting(rows_count - 1)  # Последняя строка
        config_tab.check_config_table_row_highlighting(int(rows_count / 2))  # Строка в середине

    def test_ztp_config_table_scrolling(self, browser: Page) -> None:
        """Проверка вертикального скроллинга таблицы конфигураций ZTP.

        Проверяет:
        1. Возможность вертикальной прокрутки таблицы
        2. Видимость строк после прокрутки вниз и вверх
        3. Корректность отображения данных после скроллинга

        Args:
            browser (Page): Экземпляр страницы Playwright для взаимодействия с UI
        """
        config_tab = ZTPConfigTab(browser)

        # Ожидание загрузки таблицы
        browser.wait_for_timeout(2000)

        # Проверка возможности вертикального скроллинга
        is_scrollable = config_tab.check_config_table_vertical_scrolling()

        if is_scrollable:
            print("Таблица поддерживает вертикальный скроллинг")

            # Прокрутка вниз до конца таблицы
            config_tab.scroll_config_table_down()

            browser.wait_for_timeout(1000)

            # Проверка видимости последней строки после прокрутки
            config_tab.check_config_table_last_row_visibility()

            # Прокрутка вверх до начала таблицы
            config_tab.scroll_config_table_up()

            browser.wait_for_timeout(1000)

            # Проверка видимости первой строки после прокрутки
            config_tab.check_config_table_first_row_visibility()
        else:
            print("Таблица не поддерживает вертикальный скроллинг")

