"""Модуль тестов вкладки 'Шаблоны' в модуле Zero Touch Provisioning.

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

from playwright.sync_api import Page
from pages.login_page import LoginPage
from pages.main_page import MainPage
from pages.ztp_templates_tab import ZTPTemplatesTab


# @pytest.mark.smoke
class TestZTPTemplatesTab:
    """Набор тестов для вкладки 'Шаблоны' в модуле Zero Touch Provisioning.

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

    Тесты покрывают следующие функциональные области:
    1. test_templates_tab_content - Базовая структура и содержимое вкладки
    2. test_templates_table_row_highlighting - Визуальное выделение строк таблицы
    3. test_templates_table_scrolling - Навигация по таблице с большим объемом данных
    4. test_templates_modal_window_close_buttons - Закрытие модальных окон разными способами
    5. test_templates_modal_window_content - Структура и содержимое модальных окон
    6. test_templates_modal_window_scrolling - Навигация в модальных окнах
    7. test_templates_modal_window_api_data_consistency - Синхронизация данных UI и API

    Фикстура setup обеспечивает подготовку тестового окружения:
    - Авторизацию в системе
    - Навигацию к целевой вкладке через панель настроек
    - Инициализацию необходимых компонентов страницы
    """

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

        Выполняет:
        1. Авторизацию в системе
        2. Переход на вкладку 'Шаблоны' через панель навигации
        """
        # Авторизация в системе
        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(5000)

    # @pytest.mark.develop
    def test_templates_tab_content(self, browser: Page) -> None:
        """Тест содержимого вкладки 'Шаблоны'.

        Проверяет:
        1. Наличие и корректность тулбара
        2. Наличие таблицы шаблонов
        3. Соответствие содержимого таблицы
        """
        # Инициализация страницы сеансов
        ztp_templates_tab = ZTPTemplatesTab(browser)

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

        # Проверка наличия таблицы шаблонов
        ztp_templates_tab.should_be_templates_table()

        browser.wait_for_timeout(5000)

        # Проверка содержимого таблицы шаблонов
        ztp_templates_tab.check_ztp_templates_table_content()

    def test_templates_table_row_highlighting(self, browser: Page) -> None:
        """Проверка выделения строк в таблице шаблонов.

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

        ztp_templates_tab = ZTPTemplatesTab(browser)

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

        # Проверка наличия таблицы шаблонов
        ztp_templates_tab.should_be_templates_table()

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

        # Проверка выделения строк
        ztp_templates_tab.check_templates_table_row_highlighting(0)
        ztp_templates_tab.check_templates_table_row_highlighting(rows_count - 1)
        ztp_templates_tab.check_templates_table_row_highlighting(int(rows_count / 2))

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

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

        ztp_templates_tab = ZTPTemplatesTab(browser)

        browser.wait_for_timeout(2000)

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

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

            # Прокрутка вниз
            ztp_templates_tab.scroll_templates_table_down()

            browser.wait_for_timeout(1000)

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

            # Прокрутка вверх
            ztp_templates_tab.scroll_templates_table_up()

            browser.wait_for_timeout(1000)

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

            # Проверка видимости первой строки
            ztp_templates_tab.check_templates_table_first_row_visibility()

    def test_templates_modal_window_close_buttons(self, browser: Page) -> None:
        """Тест закрытия модального окна шаблона разными способами.

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

        Args:
            browser (Page): Экземпляр страницы Playwright для взаимодействия с UI.
        """
        # Инициализация страницы шаблонов
        ztp_templates_tab = ZTPTemplatesTab(browser)

        # Проверка наличия таблицы шаблонов
        ztp_templates_tab.should_be_templates_table()

        # Добавляем задержку для загрузки данных
        browser.wait_for_timeout(2000)

        # Тест 1: Закрытие через кнопку 'Закрыть' в содержимом окна
        print("Тест 1: Закрытие через кнопку 'Закрыть'")
        title = ztp_templates_tab.open_template_modal_by_index(0)
        browser.wait_for_timeout(1000)

        # Проверка открытия модального окна
        ztp_templates_tab.should_be_modal_window()

        # Закрытие через кнопку 'Закрыть'
        ztp_templates_tab.close_modal_window(title)

        # Проверяем, что модальное окно закрылось
        ztp_templates_tab.should_not_be_modal_window()
        browser.wait_for_timeout(1000)

        # Тест 2: Закрытие через кнопку в тулбаре
        print("Тест 2: Закрытие через кнопку в тулбаре")
        title = ztp_templates_tab.open_template_modal_by_index(0)
        browser.wait_for_timeout(1000)

        # Проверка открытия модального окна
        ztp_templates_tab.should_be_modal_window()

        # Закрытие через кнопку в тулбаре
        ztp_templates_tab.close_modal_window_by_toolbar_button(title)

        # Проверяем, что модальное окно закрылось
        ztp_templates_tab.should_not_be_modal_window()

        print("Оба способа закрытия модального окна работают корректно")

    def test_templates_modal_window_content(self, browser: Page) -> None:
        """Тест содержимого модального окна шаблона.

        Проверяет:
        1. Открытие модального окна при клике на строку таблицы
        2. Наличие и содержимое модального окна
        3. Наличие тулбара в модальном окне
        4. Проверка кнопки закрытия и её подсказки
        5. Закрытие модального окна
        """
        # Инициализация страницы шаблонов
        ztp_templates_tab = ZTPTemplatesTab(browser)

        # Проверка наличия таблицы шаблонов
        ztp_templates_tab.should_be_templates_table()

        # Добавляем задержку для загрузки данных
        browser.wait_for_timeout(2000)

        # Открываем модальное окно, кликая на первую строку таблицы
        title = ztp_templates_tab.open_template_modal_by_index(0)

        # Добавляем задержку для открытия модального окна
        browser.wait_for_timeout(1000)

        # Проверка открытия модального окна
        ztp_templates_tab.should_be_modal_window()

        # Проверка содержимого модального окна
        ztp_templates_tab.check_ztp_templates_modal_content(title)

        # Закрытие модального окна через кнопку 'Закрыть'
        ztp_templates_tab.close_modal_window(title)

        # Проверяем, что модальное окно закрылось
        ztp_templates_tab.should_not_be_modal_window()

    def test_templates_modal_window_scrolling(self, browser: Page) -> None:
        """Тест скроллинга модального окна шаблона.

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

        # Инициализация страницы шаблонов
        ztp_templates_tab = ZTPTemplatesTab(browser)

        # Проверка наличия таблицы шаблонов
        ztp_templates_tab.should_be_templates_table()

        # Добавляем задержку для загрузки данных
        browser.wait_for_timeout(2000)

        # Открываем модальное окно, кликая на первую строку таблицы
        title = ztp_templates_tab.open_template_modal_by_index(0)

        # Добавляем задержку для открытия модального окна
        browser.wait_for_timeout(1000)

        # Проверка открытия модального окна
        ztp_templates_tab.should_be_modal_window()

        # Проверка вертикального скроллинга модального окна
        is_scrollable = ztp_templates_tab.check_modal_vertical_scrolling()

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

            # Прокрутка вниз модального окна
            ztp_templates_tab.scroll_modal_down()
            browser.wait_for_timeout(1000)

            # Прокрутка вверх модального окна
            ztp_templates_tab.scroll_modal_up()
            browser.wait_for_timeout(1000)
        else:
            print("Модальное окно не поддерживает вертикальный скроллинг")

        # Закрытие модального окна через кнопку 'Закрыть'
        ztp_templates_tab.close_modal_window(title)

        # Проверяем, что модальное окно закрылось
        ztp_templates_tab.should_not_be_modal_window()

    def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:
        """Тест соответствия данных модального окна шаблона данным из API.

        Проверяет консистентность данных между интерфейсом пользователя и API:
        1. Открытие модального окна просмотра шаблона по клику на строку таблицы
        2. Получение и валидация данных из полей модального окна
        3. Сравнение данных UI с эталонными данными из API запроса
        4. Проверка корректности отображения всех параметров шаблона
        5. Закрытие модального окна после проверки

        Args:
            browser (Page): Экземпляр страницы Playwright для взаимодействия с UI.
        """
        # Инициализация страницы шаблонов
        ztp_templates_tab = ZTPTemplatesTab(browser)

        # Проверка наличия таблицы шаблонов
        ztp_templates_tab.should_be_templates_table()

        # Добавляем задержку для загрузки данных
        browser.wait_for_timeout(5000)

        # Открываем модальное окно, кликая на первую строку таблицы и возвращаем имя заголовка
        title = ztp_templates_tab.open_template_modal_by_index(0)

        # Добавляем задержку для открытия модального окна
        browser.wait_for_timeout(2000)

        # Проверка открытия модального окна
        ztp_templates_tab.should_be_modal_window()

        # Проверка соответствия данных модального окна данным из API
        ztp_templates_tab.verify_template_data_with_api(title)

        # Закрытие модального окна через кнопку закрытия
        ztp_templates_tab.close_modal_window_by_toolbar_button(title)

        # Проверяем, что модальное окно закрылось
        ztp_templates_tab.should_not_be_modal_window()
