"""Модуль тестов вкладки настройки Keycloak Аутентификации.

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

import pytest
from playwright.sync_api import Page
from pages.login_page import LoginPage
from pages.main_page import MainPage
from pages.keycloak_settings_tab import KeycloakAuthSettingsTab


# @pytest.mark.smoke
class TestKeycloakAuthSettingsTab:
    """Набор тестов для вкладки настройки Keycloak Аутентификации.

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

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

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

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

        Проверяет:
        Наличие и корректность элементов интерфейса
        """

        current_settings = {}
        default_settings = {}

        # Инициализация вкладки
        keycloak_auth_settings_tab = KeycloakAuthSettingsTab(browser)

        # запрос текущих установок
        cur_settings_response = keycloak_auth_settings_tab.send_get_api_request("e-cmdb/api/keycloack")
        if cur_settings_response.status == 200:
            response_body = keycloak_auth_settings_tab.get_response_body(cur_settings_response)

            if response_body:
                current_settings = response_body[0].copy()

        # запрос дефолтных значений
        default_settings_response = keycloak_auth_settings_tab.send_get_api_request("e-cmdb/api/keycloack/meta")
        if default_settings_response.status == 200:
            response_body = keycloak_auth_settings_tab.get_response_body(default_settings_response)

            if response_body:
                default_settings = response_body["fields"].copy()

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

        # Получение и проверка отображаемых входных значений формы настроек
        settings = keycloak_auth_settings_tab.get_current_setting_values()

        value = settings["url"]
        expected = current_settings["url"]
        if expected is None:
            expected = self._get_default_value("url", default_settings)
        assert value == expected, f"Actual value {value} is not equal expected {expected} for field 'URL'"

        value = settings["url_token"]
        expected = current_settings["url_token"]
        if expected is None:
            expected = self._get_default_value("url_token", default_settings)
        assert value == expected, f"Actual value {value} is not equal expected {expected} for field 'URL_TOKEN'"

        value = settings["clientid"]
        expected = current_settings["clientid"]
        if expected is None:
            expected = self._get_default_value("clientid", default_settings)
        assert value == expected, f"Actual value {value} is not equal expected {expected} for field 'CLIENTID'"

        value = settings["clientsecret"]
        expected = current_settings["clientsecret"]
        if expected is None:
            expected = self._get_default_value("clientsecret", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'CLIENTSECRET'"

        value = settings["redirect_uri"]
        expected = current_settings["redirect_uri"]
        if expected is None:
            expected = self._get_default_value("redirect_uri", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'REDIRECT_URI'"


    def _get_default_value(self, setting_name: str, default_settings: dict) -> str| None:
        for setting in default_settings:
            if setting["name"] == setting_name:
                return setting["default"]
        return None
