"""Модуль тестов вкладки 'Статус компонентов'.

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

import pytest

from playwright.sync_api import Page
from pages.service_status_tab import ServiceStatusTab
from pages.main_page import MainPage
from pages.login_page import LoginPage

# pytest.skip("пропуск всех тестов в этом файле в связи с переходом на новый виджет", allow_module_level=True)

# @pytest.mark.smoke
class TestServiceStatusTab:
    """Класс тестов для проверки вкладки 'Статус компонентов'.

    Тесты покрывают следующие сценарии:
    1. test_service_status_tab_content: Проверяет содержимое вкладки 'Статус компонентов'
    2. test_service_status_table_row_highlighting: Проверяет выделение строк в таблице сервисов
    3. test_service_status_tab_resize: Проверяет возможность расширения/сжатия рабочей области вкладки
    4. test_service_status_tab_reload: Проверяет возможность обновления контента после нажатия кнопки 'Обновить'
    """

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

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

        lp = LoginPage(browser)
        lp.do_login()

        # Переход на главную страницу
        mp = MainPage(browser)

        # Проверка наличия панели навигации
        mp.should_be_navigation_panel()

        # Клик по пункту 'Настройки' в главной панели навигации
        mp.click_main_navigation_panel_item("Настройки")

        # Клик по пункту 'Обслуживание и диагностика' в панели навигации настроек
        mp.click_subpanel_item("Обслуживание и диагностика")

        # Клик по пункту 'Статус компонентов' в панели навигации обслуживания
        mp.click_subpanel_item("Статус компонентов")

    # @pytest.mark.develop
    def test_service_status_tab_content(self, browser: Page):
        """Проверяет содержимое вкладки 'Статус компонентов'.

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

        sst = ServiceStatusTab(browser)

        # Проверка наличия заголовка вкладки
        sst.should_be_tab_title()

        # Проверка наличия кнопки 'Обновить'
        sst.should_be_update_button()

        # Проверка наличия таблицы статусов сервисов
        sst.should_be_services_table()

        # Ожидание перед проверкой содержимого таблицы сервисов
        browser.wait_for_timeout(1000)

        # Проверка содержимого таблицы сервисов
        sst.check_services_table_content()

    # @pytest.mark.develop
    def test_service_status_table_row_highlighting(self, browser: Page):
        """Проверяет выделение строк в таблице сервисов.

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

        sst = ServiceStatusTab(browser)

        # Проверка наличия таблицы статусов сервисов
        sst.should_be_services_table()

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

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

    @pytest.mark.develop
    def test_service_status_tab_resize(self, browser: Page):
        """Проверяет возможность расширения/сжатия рабочей области вкладки.

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

        mp = MainPage(browser)

        sst = ServiceStatusTab(browser)

        # Проверка наличия таблицы статусов сервисов
        sst.should_be_services_table()

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

        # Проверка наличия кнопки расширения рабочей области вкладки
        mp.should_be_expand_workarea_button()

        # Проверка возможности расширения рабочей области вкладки
        widht_before = sst.get_workarea_widht()

        mp.click_expand_workarea_button()
        browser.wait_for_timeout(200)

        widht_after_expand = sst.get_workarea_widht()
        assert widht_before < widht_after_expand,"Services statuses tab should be expanded"

        # Получение количества строк в таблице
        rows_count_after_expand = sst.get_rows_count()
        assert rows_count_before == rows_count_after_expand, "Bad workarea expand action"

        # Проверка возможности сжатия рабочей области вкладки
        mp.should_be_reduce_workarea_button()

        mp.click_reduce_workarea_button()
        browser.wait_for_timeout(200)

        widht_after_reduce = sst.get_workarea_widht()

        assert widht_after_expand > widht_after_reduce,"Services statuses tab should be reduced"

        # Получение количества строк в таблице
        rows_count_after_reduce = sst.get_rows_count()
        assert rows_count_after_reduce == rows_count_after_expand, "Bad workarea reduce action"

    # @pytest.mark.develop
    def test_service_status_tab_reload(self, browser: Page):
        """Проверяет возможность обновления контента после нажатия кнопки 'Обновить'.

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

        sst = ServiceStatusTab(browser)

        # Проверка наличия кнопки 'Обновить'
        sst.should_be_update_button()

        # Проверка наличия таблицы статусов сервисов
        sst.should_be_services_table()

        # Сохраняем значения столбца 'Время создания'
        creation_time_col_before = sst.get_column(4)
        timestamps_before = sst.datetime2timestamp(creation_time_col_before)

        # Нажатие на кнопку 'Обновить'
        sst.click_update_button()
        browser.wait_for_load_state('domcontentloaded')

        # Проверка наличия таблицы статусов сервисов
        sst.should_be_services_table()

        # Ожидание перед проверкой содержимого таблицы сервисов
        browser.wait_for_timeout(1000)

        # Сохраняем значения столбца 'Время создания'
        creation_time_col_after = sst.get_column(4)
        timestamps_after = sst.datetime2timestamp(creation_time_col_after)

        assert len(timestamps_before) == len(timestamps_after), "Bad tab reload"
        for i in range(len(timestamps_before)):
            assert timestamps_before[i] < timestamps_after[i], "Date value after reload should be must be more recent"
