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

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

from playwright.sync_api import Page
from pages.login_page import LoginPage
from pages.main_page import MainPage
from pages.templates_tab import TemplatesTab

# @pytest.mark.smoke
class TestTemplatesTab:
    """Набор тестов для вкладки 'Шаблоны'.

    Проверяет корректность отображения и функциональность элементов вкладки Шаблоны.

    Тесты покрывают следующие сценарии:
    1. test_templates_tab_content - Проверка содержимого вкладки
    2. test_templates_table_row_highlighting - Проверка выделения строк в таблице
    3. test_templates_table_scrolling - Проверка вертикального скроллинга таблицы
    4. test_templates_modal_window_content - Проверка содержимого модального окна
    5. test_templates_modal_window_scrolling - Проверка скроллинга модального окна
    6. test_templates_modal_window_api_data_consistency - Проверка соответствия данных API
    """

    @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("Шаблоны")

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

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

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

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

        browser.wait_for_timeout(5000)

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

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

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

        templates_tab = TemplatesTab(browser)

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

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

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

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

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

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

        templates_tab = TemplatesTab(browser)

        browser.wait_for_timeout(2000)

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

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

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

            browser.wait_for_timeout(1000)

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

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

            browser.wait_for_timeout(1000)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            # Прокрутка вниз
            templates_tab.scroll_modal_down()
            browser.wait_for_timeout(1000)

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

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

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

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

        Проверяет:
        1. Открытие модального окна при клике на строку таблицы
        2. Соответствие JSON конфигурационных данных в модальном окне данным из API
        3. Закрытие модального окна
        """
        # Инициализация страницы шаблонов
        templates_tab = TemplatesTab(browser)

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

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

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

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

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

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

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

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