"""Модуль тестов вкладки 'Сеансы/Настройки'.

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

import pytest
from playwright.sync_api import Page
from pages.login_page import LoginPage
from pages.main_page import MainPage
from pages.session_settings_tab import SessionSettingsTab


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

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

    Тесты покрывают следующие сценарии:
    1. test_session_settings_tab_content: Тест содержимого вкладки 'Сеансы/Настройки'
    2. test_edit_session_settings: Тест проверки возможности редактирования выбранных полей формы
                                   настройки времени жизни сеансов.
    3. test_edit_session_setting_by_arrow: Тест проверки возможности увеличения/уменьшения значения
                                           выбранного поля формы с помощью стрелочек Вверх/Вниз.
    """


    @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("Обслуживание и диагностика")
        main_page.click_subpanel_item("Сеансы")
        main_page.click_subpanel_item("Настройки", parent="Сеансы")

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

        Проверяет:
        1. Наличие и корректность элементов интерфейса
        2. Соответствие содержимого полей формы данным из БД
        """
        # Инициализация страницы сеансов
        session_settings_tab = SessionSettingsTab(browser)

        # Проверка элементов интерфейса
        session_settings_tab.check_content()

        # Проверяем API ответ
        response = session_settings_tab.send_get_api_request("e-cmdb/api/objectByPath?path=/config/auth")
        if response.status == 200:
            response_body = session_settings_tab.get_response_body(response)

            if response_body:
                # Проверка содержимого таблица с верификацией данных из БД
                session_settings = response_body.get("options").get("key_ttl")
                session_settings_tab.verify_form_data(session_settings)
        else:
            print(f"Error request session setings data from API: {response.status_text}")

    #@pytest.mark.develop
    def test_edit_session_settings(self, browser: Page) -> None:
        """Тест проверки возможности редактирования выбранных полей формы настройки времени жизни сеансов.

        Проверяет:
        1. Возможность редактирования выбранных полей формы настройки времени жизни сеансов.
        """
        new_settings = {'administrator': "50",
                        'operator': "20",
                        'manager': "20",
                        "inform_secur_user": "25"}

        # Инициализация страницы сеансов
        session_settings_tab = SessionSettingsTab(browser)

        session_settings_tab.edit_settings(new_settings)

        # temporarily
        # updated_settings = session_settings_tab.get_settings_values()

        # for key, value in new_settings.items():
        #     updated_value = updated_settings.get(key)
        #     assert updated_value == value, f"{key} updated value {updated_value} is not equal expected value {value}"

    # @pytest.mark.develop
    def test_edit_session_setting_by_arrow(self, browser: Page) -> None:
        """Тест проверки возможности увеличения/уменьшения значения выбранного поля формы с помощью стрелочек Вверх/Вниз.
        """

        field_name = 'operator'

        # Инициализация страницы сеансов
        session_settings_tab = SessionSettingsTab(browser)

        session_settings_tab.click_edit_button()

        start_value = session_settings_tab.get_setting_value(field_name)
        expected_value = int(start_value)

        for i in range(5):
            session_settings_tab.increase_setting_value(field_name)

            current_value = int(session_settings_tab.get_setting_value(field_name))
            expected_value += 1

            assert current_value == expected_value, \
                f"Expected value {expected_value} is not equal current value {current_value} for {field_name} setting"

        for j in range(5):
            session_settings_tab.decrease_setting_value(field_name)

            current_value = int(session_settings_tab.get_setting_value(field_name))
            expected_value -= 1

            assert current_value == expected_value, \
                f"Expected value {expected_value} is not equal current value {current_value} for {field_name} setting"

        current_value = int(session_settings_tab.get_setting_value(field_name))
        assert current_value == int(start_value), \
            f"Expected value {start_value} is not equal current value {current_value} for {field_name} setting"

        session_settings_tab.click_cancel_button()

    # to be Done
    # def test_edit_session_setting_boundary_values(self, browser: Page) -> None:
    #     """Тест проверки задания граничных значений выбранного поля формы.
    #     """
